summaryrefslogtreecommitdiff
path: root/Zend
diff options
context:
space:
mode:
Diffstat (limited to 'Zend')
-rw-r--r--Zend/Makefile.am55
-rw-r--r--[-rwxr-xr-x]Zend/Makefile.frag36
-rw-r--r--Zend/README.ZEND_MM43
-rw-r--r--Zend/README.ZEND_VM102
-rw-r--r--Zend/README.md139
-rw-r--r--Zend/Zend.m4411
-rw-r--r--Zend/acinclude.m4225
-rw-r--r--Zend/bench.php74
-rw-r--r--Zend/build.mk41
-rwxr-xr-xZend/buildconf32
-rw-r--r--Zend/configure.ac133
-rw-r--r--Zend/micro_bench.php318
-rw-r--r--Zend/tests/014.phpt6
-rw-r--r--Zend/tests/019.phpt6
-rw-r--r--Zend/tests/024.phpt14
-rw-r--r--Zend/tests/033.phpt30
-rw-r--r--Zend/tests/036.phpt3
-rw-r--r--Zend/tests/67468.phpt2
-rw-r--r--Zend/tests/arg_unpack/many_args.phpt4
-rw-r--r--Zend/tests/array_unpack/already_occupied.phpt41
-rw-r--r--Zend/tests/array_unpack/basic.phpt119
-rw-r--r--Zend/tests/array_unpack/classes.phpt46
-rw-r--r--Zend/tests/array_unpack/in_destructuring.phpt10
-rw-r--r--Zend/tests/array_unpack/non_integer_keys.phpt17
-rw-r--r--Zend/tests/array_unpack/ref1.phpt17
-rw-r--r--Zend/tests/array_unpack/string_keys.phpt21
-rw-r--r--Zend/tests/array_unpack/undef_var.phpt14
-rw-r--r--Zend/tests/array_unpack/unpack_invalid_type_compile_time.phpt10
-rw-r--r--Zend/tests/array_unpack/unpack_string_keys_compile_time.phpt10
-rw-r--r--Zend/tests/array_unpack_string_keys.phpt20
-rw-r--r--Zend/tests/arrow_functions/001.phpt45
-rw-r--r--Zend/tests/arrow_functions/002.phpt13
-rw-r--r--Zend/tests/arrow_functions/003.phpt21
-rw-r--r--Zend/tests/arrow_functions/004.phpt13
-rw-r--r--Zend/tests/arrow_functions/005.phpt54
-rw-r--r--Zend/tests/arrow_functions/006.phpt44
-rw-r--r--Zend/tests/arrow_functions/007.phpt14
-rw-r--r--Zend/tests/arrow_functions/008.phpt28
-rw-r--r--Zend/tests/assign_coalesce_001.phpt127
-rw-r--r--Zend/tests/assign_coalesce_002.phpt84
-rw-r--r--Zend/tests/assign_coalesce_003.phpt70
-rw-r--r--Zend/tests/assign_coalesce_004.phpt11
-rw-r--r--Zend/tests/assign_coalesce_005.phpt14
-rw-r--r--Zend/tests/assign_coalesce_006.phpt12
-rw-r--r--Zend/tests/assign_obj_ref_byval_function.phpt20
-rw-r--r--Zend/tests/assign_ref_error_var_handling.phpt2
-rw-r--r--Zend/tests/assign_ref_func_leak.phpt23
-rw-r--r--Zend/tests/assign_to_obj_001.phpt2
-rw-r--r--Zend/tests/assign_to_var_003.phpt3
-rw-r--r--Zend/tests/bug21478.phpt6
-rw-r--r--Zend/tests/bug26166.phpt25
-rw-r--r--Zend/tests/bug26698.phpt2
-rw-r--r--Zend/tests/bug28444.phpt19
-rw-r--r--Zend/tests/bug29368_2.phpt21
-rw-r--r--Zend/tests/bug29368_3.phpt33
-rw-r--r--Zend/tests/bug30519.phpt5
-rw-r--r--Zend/tests/bug30791.phpt25
-rw-r--r--Zend/tests/bug30922.phpt5
-rw-r--r--Zend/tests/bug32674.phpt2
-rw-r--r--Zend/tests/bug33771.phpt6
-rw-r--r--Zend/tests/bug35017.phpt4
-rw-r--r--Zend/tests/bug35437.phpt4
-rw-r--r--Zend/tests/bug35655.phpt1
-rw-r--r--Zend/tests/bug38461.phpt8
-rw-r--r--Zend/tests/bug38779.phpt3
-rw-r--r--Zend/tests/bug38779_1.phpt8
-rw-r--r--Zend/tests/bug39542.phpt8
-rw-r--r--[-rwxr-xr-x]Zend/tests/bug39542/bug39542.inc (renamed from Zend/tests/bug39542/bug39542.php)0
-rw-r--r--Zend/tests/bug40236.phpt2
-rw-r--r--Zend/tests/bug43200.phpt2
-rw-r--r--Zend/tests/bug44660.phpt2
-rw-r--r--Zend/tests/bug46665.phpt2
-rw-r--r--Zend/tests/bug48248.phpt9
-rw-r--r--Zend/tests/bug49908.phpt9
-rw-r--r--Zend/tests/bug51791.phpt2
-rw-r--r--Zend/tests/bug52041.phpt6
-rw-r--r--Zend/tests/bug52160.phpt2
-rw-r--r--Zend/tests/bug52508.phpt2
-rw-r--r--Zend/tests/bug53511.phpt7
-rw-r--r--Zend/tests/bug60161.phpt18
-rw-r--r--Zend/tests/bug60909_1.phpt4
-rw-r--r--Zend/tests/bug60909_2.phpt9
-rw-r--r--Zend/tests/bug61165.phpt2
-rw-r--r--Zend/tests/bug61970_1.phpt2
-rw-r--r--Zend/tests/bug61970_2.phpt2
-rw-r--r--Zend/tests/bug62358.phpt2
-rw-r--r--Zend/tests/bug62441.phpt2
-rw-r--r--Zend/tests/bug62814.phpt2
-rw-r--r--Zend/tests/bug62956.phpt2
-rw-r--r--Zend/tests/bug63635.phpt8
-rw-r--r--Zend/tests/bug63741.phpt6
-rw-r--r--Zend/tests/bug63816.phpt45
-rw-r--r--Zend/tests/bug64988.phpt4
-rw-r--r--Zend/tests/bug65784.phpt10
-rw-r--r--Zend/tests/bug67436/a.inc (renamed from Zend/tests/bug67436/a.php)0
-rw-r--r--Zend/tests/bug67436/b.inc (renamed from Zend/tests/bug67436/b.php)0
-rw-r--r--Zend/tests/bug67436/bug67436.phpt2
-rw-r--r--Zend/tests/bug67436/bug67436_nohandler.phpt6
-rw-r--r--Zend/tests/bug67436/c.inc (renamed from Zend/tests/bug67436/c.php)0
-rw-r--r--Zend/tests/bug69788.phpt4
-rw-r--r--Zend/tests/bug69892.phpt2
-rw-r--r--Zend/tests/bug70012.phpt2
-rw-r--r--Zend/tests/bug70083.phpt17
-rw-r--r--Zend/tests/bug70253.phpt11
-rw-r--r--Zend/tests/bug70662.phpt2
-rw-r--r--Zend/tests/bug70748.phpt2
-rw-r--r--Zend/tests/bug70873.phpt2
-rw-r--r--Zend/tests/bug70967.phpt6
-rw-r--r--Zend/tests/bug71030.phpt28
-rw-r--r--Zend/tests/bug71086.phpt2
-rw-r--r--Zend/tests/bug71428.1.phpt2
-rw-r--r--Zend/tests/bug71539_5.phpt3
-rw-r--r--Zend/tests/bug71572.phpt8
-rw-r--r--Zend/tests/bug71818.phpt2
-rw-r--r--Zend/tests/bug72162.phpt6
-rw-r--r--Zend/tests/bug72530.phpt31
-rw-r--r--Zend/tests/bug72944.phpt2
-rw-r--r--Zend/tests/bug73663.phpt5
-rw-r--r--Zend/tests/bug73663_2.phpt15
-rw-r--r--Zend/tests/bug73816.phpt24
-rw-r--r--Zend/tests/bug75420.phpt2
-rw-r--r--Zend/tests/bug75573.phpt8
-rw-r--r--Zend/tests/bug75921.phpt80
-rw-r--r--Zend/tests/bug76430.phpt22
-rw-r--r--Zend/tests/bug76451.inc4
-rw-r--r--Zend/tests/bug76451.phpt16
-rw-r--r--Zend/tests/bug76451_2.inc8
-rw-r--r--Zend/tests/bug76451_2.phpt12
-rw-r--r--Zend/tests/bug76860.phpt31
-rw-r--r--Zend/tests/bug76860_2.phpt34
-rw-r--r--Zend/tests/bug77613.phpt19
-rw-r--r--Zend/tests/bug77877.phpt23
-rw-r--r--Zend/tests/bug78151.phpt23
-rw-r--r--Zend/tests/bug78154.phpt23
-rw-r--r--Zend/tests/bug78182.phpt15
-rw-r--r--Zend/tests/bug78239.phpt30
-rw-r--r--Zend/tests/bug78335.phpt28
-rw-r--r--Zend/tests/bug78335_2.phpt14
-rw-r--r--Zend/tests/bug78340.phpt54
-rw-r--r--Zend/tests/bug78344.phpt24
-rw-r--r--Zend/tests/bug78356.phpt20
-rw-r--r--Zend/tests/bug78396.phpt18
-rw-r--r--Zend/tests/bug78406.phpt44
-rw-r--r--Zend/tests/bug78454_1.phpt7
-rw-r--r--Zend/tests/bug78454_2.phpt7
-rw-r--r--Zend/tests/bug78502.phpt31
-rw-r--r--Zend/tests/bug78531.phpt18
-rw-r--r--Zend/tests/bug78589.phpt19
-rw-r--r--Zend/tests/bug78598.phpt31
-rw-r--r--Zend/tests/bug78644.phpt16
-rw-r--r--Zend/tests/bug78776.phpt28
-rw-r--r--Zend/tests/bug78810.phpt25
-rw-r--r--Zend/tests/bug78898.phpt34
-rw-r--r--Zend/tests/bug78926.phpt22
-rw-r--r--Zend/tests/bug78973.phpt18
-rw-r--r--Zend/tests/bug79022.phpt39
-rw-r--r--Zend/tests/bug79155.phpt36
-rw-r--r--Zend/tests/bug79514.phpt13
-rw-r--r--Zend/tests/bug79599.phpt27
-rw-r--r--Zend/tests/bug79657.phpt42
-rw-r--r--Zend/tests/bug79740.phpt22
-rw-r--r--Zend/tests/bug79779.phpt12
-rw-r--r--Zend/tests/bug79783.phpt11
-rw-r--r--Zend/tests/bug79784.phpt20
-rw-r--r--Zend/tests/bug79793.phpt32
-rw-r--r--Zend/tests/bug79862.phpt60
-rw-r--r--Zend/tests/call_to_abstract_method_args.phpt26
-rw-r--r--Zend/tests/call_to_deprecated_function_args.phpt43
-rw-r--r--Zend/tests/call_user_func_007.phpt2
-rw-r--r--Zend/tests/call_with_refs.phpt17
-rw-r--r--Zend/tests/class_constants_003.phpt2
-rw-r--r--Zend/tests/class_name_as_scalar_error_002.phpt8
-rw-r--r--Zend/tests/class_name_as_scalar_error_004.phpt12
-rw-r--r--Zend/tests/class_name_as_scalar_error_007.phpt19
-rw-r--r--Zend/tests/class_name_of_var.phpt11
-rw-r--r--Zend/tests/class_properties_const.phpt5
-rw-r--r--Zend/tests/closure_015.phpt28
-rw-r--r--Zend/tests/closure_038.phpt5
-rw-r--r--Zend/tests/closure_039.phpt5
-rw-r--r--Zend/tests/closure_041.phpt2
-rw-r--r--Zend/tests/closure_044.phpt6
-rw-r--r--Zend/tests/closure_046.phpt4
-rw-r--r--Zend/tests/closure_061.phpt2
-rw-r--r--Zend/tests/closure_062.phpt56
-rw-r--r--Zend/tests/closure_write_prop.phpt22
-rw-r--r--Zend/tests/closures/closure_instantiate.phpt21
-rw-r--r--Zend/tests/concat_003.phpt5
-rw-r--r--Zend/tests/constant_expressions_classes.phpt2
-rw-r--r--Zend/tests/constant_expressions_coalesce.phpt26
-rw-r--r--[-rwxr-xr-x]Zend/tests/constants/fixtures/folder1/fixture.inc0
-rw-r--r--[-rwxr-xr-x]Zend/tests/constants/fixtures/folder1/subfolder1/fixture.inc0
-rw-r--r--[-rwxr-xr-x]Zend/tests/constants/fixtures/folder1/subfolder2/fixture.inc0
-rw-r--r--[-rwxr-xr-x]Zend/tests/constants/fixtures/folder1/subfolder3/fixture.inc0
-rw-r--r--[-rwxr-xr-x]Zend/tests/constants/fixtures/folder1/subfolder4/fixture.inc0
-rw-r--r--[-rwxr-xr-x]Zend/tests/constants/fixtures/folder2/fixture.inc0
-rw-r--r--[-rwxr-xr-x]Zend/tests/constants/fixtures/folder2/subfolder1/fixture.inc0
-rw-r--r--[-rwxr-xr-x]Zend/tests/constants/fixtures/folder2/subfolder2/fixture.inc0
-rw-r--r--[-rwxr-xr-x]Zend/tests/constants/fixtures/folder2/subfolder3/fixture.inc0
-rw-r--r--[-rwxr-xr-x]Zend/tests/constants/fixtures/folder2/subfolder4/fixture.inc0
-rw-r--r--[-rwxr-xr-x]Zend/tests/constants/fixtures/folder3/fixture.inc0
-rw-r--r--[-rwxr-xr-x]Zend/tests/constants/fixtures/folder3/subfolder1/fixture.inc0
-rw-r--r--[-rwxr-xr-x]Zend/tests/constants/fixtures/folder3/subfolder2/fixture.inc0
-rw-r--r--[-rwxr-xr-x]Zend/tests/constants/fixtures/folder3/subfolder3/fixture.inc0
-rw-r--r--[-rwxr-xr-x]Zend/tests/constants/fixtures/folder3/subfolder4/fixture.inc0
-rw-r--r--[-rwxr-xr-x]Zend/tests/constants/fixtures/folder4/fixture.inc0
-rw-r--r--[-rwxr-xr-x]Zend/tests/constants/fixtures/folder4/subfolder1/fixture.inc0
-rw-r--r--[-rwxr-xr-x]Zend/tests/constants/fixtures/folder4/subfolder2/fixture.inc0
-rw-r--r--[-rwxr-xr-x]Zend/tests/constants/fixtures/folder4/subfolder3/fixture.inc0
-rw-r--r--[-rwxr-xr-x]Zend/tests/constants/fixtures/folder4/subfolder4/fixture.inc0
-rw-r--r--Zend/tests/constructor_abstract_grantparent.phpt18
-rw-r--r--Zend/tests/declare_already_in_use.phpt14
-rw-r--r--Zend/tests/dereference_002.phpt2
-rw-r--r--Zend/tests/dereference_010.phpt3
-rw-r--r--Zend/tests/dereference_014.phpt4
-rw-r--r--Zend/tests/empty_str_offset.phpt2
-rw-r--r--Zend/tests/error_reporting02.phpt4
-rw-r--r--Zend/tests/error_reporting03.phpt4
-rw-r--r--Zend/tests/error_reporting04.phpt4
-rw-r--r--Zend/tests/error_reporting08.phpt4
-rw-r--r--Zend/tests/error_reporting09.phpt4
-rw-r--r--Zend/tests/exception_004.phpt2
-rw-r--r--Zend/tests/exception_009.phpt6
-rw-r--r--Zend/tests/exception_010.phpt30
-rw-r--r--Zend/tests/exception_017.phpt3
-rw-r--r--Zend/tests/exception_during_include_stat.phpt41
-rw-r--r--Zend/tests/exception_from_toString.phpt135
-rw-r--r--Zend/tests/exception_ignore_args.phpt18
-rw-r--r--Zend/tests/fe_fetch_op2_live_range.phpt12
-rw-r--r--Zend/tests/foreach_shadowed_dyn_property.phpt29
-rw-r--r--Zend/tests/foreach_shadowed_property.phpt28
-rw-r--r--Zend/tests/function_exists_error.phpt35
-rw-r--r--Zend/tests/function_exists_variation1.phpt138
-rw-r--r--Zend/tests/gc_011.phpt2
-rw-r--r--Zend/tests/gc_016.phpt4
-rw-r--r--Zend/tests/gc_017.phpt6
-rw-r--r--Zend/tests/gc_028.phpt4
-rw-r--r--Zend/tests/gc_029.phpt6
-rw-r--r--Zend/tests/gc_033.phpt2
-rw-r--r--Zend/tests/gc_035.phpt2
-rw-r--r--Zend/tests/gc_041.phpt5
-rw-r--r--Zend/tests/generators/bug65035.phpt4
-rw-r--r--Zend/tests/generators/bug76427.phpt2
-rw-r--r--Zend/tests/generators/bug78434.phpt27
-rw-r--r--Zend/tests/generators/bug79600.phpt24
-rw-r--r--Zend/tests/generators/gc_with_iterator_in_foreach.phpt21
-rw-r--r--Zend/tests/generators/yield_from_multi_tree.phpt3
-rw-r--r--Zend/tests/generators/yield_in_finally_cleanup.phpt51
-rw-r--r--Zend/tests/get_class_vars_typed_props.phpt26
-rw-r--r--Zend/tests/get_defined_functions_error.phpt29
-rw-r--r--Zend/tests/get_mangled_object_vars.phpt49
-rw-r--r--Zend/tests/globals_004.phpt2
-rw-r--r--Zend/tests/grammar/semi_reserved_001.phpt3
-rw-r--r--Zend/tests/grammar/semi_reserved_002.phpt3
-rw-r--r--Zend/tests/grammar/semi_reserved_003.phpt3
-rw-r--r--Zend/tests/grammar/semi_reserved_004.phpt3
-rw-r--r--Zend/tests/grammar/semi_reserved_005.phpt3
-rw-r--r--Zend/tests/grandparent_prototype.phpt26
-rw-r--r--Zend/tests/halt_compiler2.phpt12
-rw-r--r--Zend/tests/include_fail_during_read.phpt12
-rw-r--r--Zend/tests/include_stat_is_quiet.phpt30
-rw-r--r--Zend/tests/instanceof_001.phpt4
-rw-r--r--Zend/tests/inter_007.phpt2
-rw-r--r--Zend/tests/is_callable_trampoline_uaf.phpt27
-rw-r--r--Zend/tests/isset_003.phpt2
-rw-r--r--Zend/tests/isset_str_offset.phpt2
-rw-r--r--Zend/tests/magic_methods_008.phpt2
-rw-r--r--Zend/tests/method_exists_002.phpt2
-rwxr-xr-xZend/tests/methods-on-non-objects-nested.inc4
-rw-r--r--Zend/tests/multibyte/bug68665.phpt2
-rw-r--r--Zend/tests/multibyte/multibyte_encoding_001.phpt2
-rw-r--r--Zend/tests/multibyte/multibyte_encoding_002.phpt2
-rw-r--r--Zend/tests/multibyte/multibyte_encoding_003.phptbin471 -> 462 bytes
-rw-r--r--Zend/tests/multibyte/multibyte_encoding_004.phpt2
-rw-r--r--Zend/tests/multibyte/multibyte_encoding_005.phpt2
-rw-r--r--Zend/tests/nested_method_and_function.phpt2
-rw-r--r--Zend/tests/no_class_const_propagation_in_closures.phpt2
-rw-r--r--Zend/tests/non_well_formed_param_exception.phpt22
-rw-r--r--Zend/tests/nowdoc_013.phpt1
-rw-r--r--Zend/tests/ns_010.phpt2
-rw-r--r--Zend/tests/ns_020.phpt2
-rw-r--r--Zend/tests/ns_064.phpt2
-rw-r--r--Zend/tests/numeric_literal_separator_001.phpt27
-rw-r--r--Zend/tests/numeric_literal_separator_002.phpt7
-rw-r--r--Zend/tests/numeric_literal_separator_003.phpt7
-rw-r--r--Zend/tests/numeric_literal_separator_004.phpt7
-rw-r--r--Zend/tests/numeric_literal_separator_005.phpt7
-rw-r--r--Zend/tests/numeric_literal_separator_006.phpt7
-rw-r--r--Zend/tests/numeric_literal_separator_007.phpt7
-rw-r--r--Zend/tests/numeric_literal_separator_008.phpt7
-rw-r--r--Zend/tests/numeric_literal_separator_009.phpt7
-rw-r--r--Zend/tests/object_types/missing_return_type_inheritance_in_class.phpt2
-rw-r--r--Zend/tests/object_types/return_type_reflection.phpt6
-rw-r--r--Zend/tests/object_types/type_hint_reflection.phpt6
-rw-r--r--Zend/tests/objects_020.phpt1
-rw-r--r--Zend/tests/offset_bool.phpt19
-rw-r--r--Zend/tests/offset_long.phpt19
-rw-r--r--Zend/tests/offset_null.phpt19
-rw-r--r--Zend/tests/overloaded_assign_prop_return_value.phpt14
-rw-r--r--Zend/tests/php_tag_only.inc1
-rw-r--r--Zend/tests/php_tag_only.phpt5
-rw-r--r--Zend/tests/property_access_errors_for_guarded_properties.phpt55
-rw-r--r--Zend/tests/real_cast_deprecation.phpt11
-rw-r--r--Zend/tests/require_parse_exception.phpt1
-rw-r--r--Zend/tests/return_types/008.phpt8
-rw-r--r--Zend/tests/return_types/031.phpt2
-rw-r--r--Zend/tests/return_types/generators003.phpt8
-rw-r--r--Zend/tests/return_types/inheritance005.phpt8
-rw-r--r--Zend/tests/return_types/inheritance006.phpt8
-rw-r--r--Zend/tests/return_types/inheritance007.phpt8
-rw-r--r--Zend/tests/return_types/reflection001.phpt2
-rw-r--r--Zend/tests/return_types/rfc004.phpt2
-rw-r--r--Zend/tests/runtime_compile_time_binary_operands.phpt159
-rw-r--r--Zend/tests/self_class_const_in_unknown_scope.phpt9
-rw-r--r--Zend/tests/static_variable_in_private_method.phpt16
-rw-r--r--Zend/tests/static_variable_in_private_trait_method.phpt35
-rw-r--r--Zend/tests/str_offset_004.phpt18
-rw-r--r--Zend/tests/string_offset_int_min_max.phpt16
-rw-r--r--Zend/tests/ternary_associativity.phpt30
-rw-r--r--Zend/tests/this_as_lexical_var_error.phpt2
-rw-r--r--Zend/tests/throwing_overloaded_compound_assign_op.phpt44
-rw-r--r--Zend/tests/type_declarations/scalar_none.phpt10
-rw-r--r--Zend/tests/type_declarations/scalar_null.phpt10
-rw-r--r--Zend/tests/type_declarations/scalar_return_basic.phpt1
-rw-r--r--Zend/tests/type_declarations/scalar_return_basic_64bit.phpt1
-rw-r--r--Zend/tests/type_declarations/scalar_strict.phpt26
-rw-r--r--Zend/tests/type_declarations/scalar_strict_64bit.phpt26
-rw-r--r--Zend/tests/type_declarations/scalar_strict_basic.phpt11
-rw-r--r--Zend/tests/type_declarations/typed_properties_001.phpt44
-rw-r--r--Zend/tests/type_declarations/typed_properties_002.phpt15
-rw-r--r--Zend/tests/type_declarations/typed_properties_003.phpt15
-rw-r--r--Zend/tests/type_declarations/typed_properties_004.phpt18
-rw-r--r--Zend/tests/type_declarations/typed_properties_005.phpt20
-rw-r--r--Zend/tests/type_declarations/typed_properties_006.phpt14
-rw-r--r--Zend/tests/type_declarations/typed_properties_007.phpt17
-rw-r--r--Zend/tests/type_declarations/typed_properties_008.phpt14
-rw-r--r--Zend/tests/type_declarations/typed_properties_009.phpt23
-rw-r--r--Zend/tests/type_declarations/typed_properties_010.phpt17
-rw-r--r--Zend/tests/type_declarations/typed_properties_011.phpt18
-rw-r--r--Zend/tests/type_declarations/typed_properties_012.phpt19
-rw-r--r--Zend/tests/type_declarations/typed_properties_013.phpt10
-rw-r--r--Zend/tests/type_declarations/typed_properties_014.phpt10
-rw-r--r--Zend/tests/type_declarations/typed_properties_015.phpt10
-rw-r--r--Zend/tests/type_declarations/typed_properties_016.phpt31
-rw-r--r--Zend/tests/type_declarations/typed_properties_017.phpt12
-rw-r--r--Zend/tests/type_declarations/typed_properties_018.phpt17
-rw-r--r--Zend/tests/type_declarations/typed_properties_019.phpt22
-rw-r--r--Zend/tests/type_declarations/typed_properties_020.phpt26
-rw-r--r--Zend/tests/type_declarations/typed_properties_021.phpt16
-rw-r--r--Zend/tests/type_declarations/typed_properties_022.phpt15
-rw-r--r--Zend/tests/type_declarations/typed_properties_023.phpt52
-rw-r--r--Zend/tests/type_declarations/typed_properties_024.phpt16
-rw-r--r--Zend/tests/type_declarations/typed_properties_025.phpt11
-rw-r--r--Zend/tests/type_declarations/typed_properties_026.phpt23
-rw-r--r--Zend/tests/type_declarations/typed_properties_027.phpt16
-rw-r--r--Zend/tests/type_declarations/typed_properties_028.phpt15
-rw-r--r--Zend/tests/type_declarations/typed_properties_029.phpt18
-rw-r--r--Zend/tests/type_declarations/typed_properties_030.phpt25
-rw-r--r--Zend/tests/type_declarations/typed_properties_031.phpt22
-rw-r--r--Zend/tests/type_declarations/typed_properties_032.phpt15
-rw-r--r--Zend/tests/type_declarations/typed_properties_033.phpt38
-rw-r--r--Zend/tests/type_declarations/typed_properties_034.phpt51
-rw-r--r--Zend/tests/type_declarations/typed_properties_035.phpt13
-rw-r--r--Zend/tests/type_declarations/typed_properties_036.phpt15
-rw-r--r--Zend/tests/type_declarations/typed_properties_037.phpt16
-rw-r--r--Zend/tests/type_declarations/typed_properties_038.phpt61
-rw-r--r--Zend/tests/type_declarations/typed_properties_039.phpt31
-rw-r--r--Zend/tests/type_declarations/typed_properties_040.phpt26
-rw-r--r--Zend/tests/type_declarations/typed_properties_041.phpt16
-rw-r--r--Zend/tests/type_declarations/typed_properties_042.phpt21
-rw-r--r--Zend/tests/type_declarations/typed_properties_043.phpt53
-rw-r--r--Zend/tests/type_declarations/typed_properties_044.phpt58
-rw-r--r--Zend/tests/type_declarations/typed_properties_045.phpt51
-rw-r--r--Zend/tests/type_declarations/typed_properties_046.phpt29
-rw-r--r--Zend/tests/type_declarations/typed_properties_047.phpt40
-rw-r--r--Zend/tests/type_declarations/typed_properties_048.phpt17
-rw-r--r--Zend/tests/type_declarations/typed_properties_049.phpt10
-rw-r--r--Zend/tests/type_declarations/typed_properties_050.phpt19
-rw-r--r--Zend/tests/type_declarations/typed_properties_051.phpt27
-rw-r--r--Zend/tests/type_declarations/typed_properties_052.phpt34
-rw-r--r--Zend/tests/type_declarations/typed_properties_053.phpt12
-rw-r--r--Zend/tests/type_declarations/typed_properties_054.phpt12
-rw-r--r--Zend/tests/type_declarations/typed_properties_055.phpt29
-rw-r--r--Zend/tests/type_declarations/typed_properties_056.phpt23
-rw-r--r--Zend/tests/type_declarations/typed_properties_057.phpt31
-rw-r--r--Zend/tests/type_declarations/typed_properties_058.phpt32
-rw-r--r--Zend/tests/type_declarations/typed_properties_059.phpt29
-rw-r--r--Zend/tests/type_declarations/typed_properties_060.phpt22
-rw-r--r--Zend/tests/type_declarations/typed_properties_061.phpt58
-rw-r--r--Zend/tests/type_declarations/typed_properties_062.phpt81
-rw-r--r--Zend/tests/type_declarations/typed_properties_063.phpt80
-rw-r--r--Zend/tests/type_declarations/typed_properties_064.phpt80
-rw-r--r--Zend/tests/type_declarations/typed_properties_065.phpt71
-rw-r--r--Zend/tests/type_declarations/typed_properties_066.phpt21
-rw-r--r--Zend/tests/type_declarations/typed_properties_067.phpt36
-rw-r--r--Zend/tests/type_declarations/typed_properties_068.phpt87
-rw-r--r--Zend/tests/type_declarations/typed_properties_069.phpt27
-rw-r--r--Zend/tests/type_declarations/typed_properties_070.phpt49
-rw-r--r--Zend/tests/type_declarations/typed_properties_071.phpt36
-rw-r--r--Zend/tests/type_declarations/typed_properties_072.phpt25
-rw-r--r--Zend/tests/type_declarations/typed_properties_073.phpt45
-rw-r--r--Zend/tests/type_declarations/typed_properties_074.phpt42
-rw-r--r--Zend/tests/type_declarations/typed_properties_075.phpt53
-rw-r--r--Zend/tests/type_declarations/typed_properties_076.phpt71
-rw-r--r--Zend/tests/type_declarations/typed_properties_077.phpt18
-rw-r--r--Zend/tests/type_declarations/typed_properties_078.phpt59
-rw-r--r--Zend/tests/type_declarations/typed_properties_079.phpt33
-rw-r--r--Zend/tests/type_declarations/typed_properties_080.phpt36
-rw-r--r--Zend/tests/type_declarations/typed_properties_081.phpt22
-rw-r--r--Zend/tests/type_declarations/typed_properties_082.phpt30
-rw-r--r--Zend/tests/type_declarations/typed_properties_083.phpt80
-rw-r--r--Zend/tests/type_declarations/typed_properties_084.phpt25
-rw-r--r--Zend/tests/type_declarations/typed_properties_085.phpt17
-rw-r--r--Zend/tests/type_declarations/typed_properties_086.phpt27
-rw-r--r--Zend/tests/type_declarations/typed_properties_087.phpt15
-rw-r--r--Zend/tests/type_declarations/typed_properties_088.phpt30
-rw-r--r--Zend/tests/type_declarations/typed_properties_089.phpt38
-rw-r--r--Zend/tests/type_declarations/typed_properties_090.phpt25
-rw-r--r--Zend/tests/type_declarations/typed_properties_091.phpt203
-rw-r--r--Zend/tests/type_declarations/typed_properties_092.phpt41
-rw-r--r--Zend/tests/type_declarations/typed_properties_093.phpt31
-rw-r--r--Zend/tests/type_declarations/typed_properties_094.phpt36
-rw-r--r--Zend/tests/type_declarations/typed_properties_095.phpt84
-rw-r--r--Zend/tests/type_declarations/typed_properties_096.phpt46
-rw-r--r--Zend/tests/type_declarations/typed_properties_097.phpt90
-rw-r--r--Zend/tests/type_declarations/typed_properties_098.phpt17
-rw-r--r--Zend/tests/type_declarations/typed_properties_099.phpt20
-rw-r--r--Zend/tests/type_declarations/typed_properties_100.phpt19
-rw-r--r--Zend/tests/type_declarations/typed_properties_101.phpt37
-rw-r--r--Zend/tests/type_declarations/typed_properties_102.phpt22
-rw-r--r--Zend/tests/type_declarations/typed_properties_103.phpt22
-rw-r--r--Zend/tests/type_declarations/typed_properties_104.phpt17
-rw-r--r--Zend/tests/type_declarations/typed_properties_105.phpt20
-rw-r--r--Zend/tests/type_declarations/typed_properties_106.phpt26
-rw-r--r--Zend/tests/type_declarations/typed_properties_107.phpt26
-rw-r--r--Zend/tests/type_declarations/typed_properties_108.phpt47
-rw-r--r--Zend/tests/type_declarations/typed_properties_class_loading.phpt51
-rw-r--r--Zend/tests/type_declarations/typed_properties_magic_set.phpt73
-rw-r--r--Zend/tests/type_declarations/typed_properties_protected_inheritance_mismatch.phpt11
-rw-r--r--Zend/tests/type_declarations/types_in_ast.phpt23
-rw-r--r--Zend/tests/type_declarations/variance/abstract_constructor.phpt18
-rw-r--r--Zend/tests/type_declarations/variance/class_order_autoload1.phpt37
-rw-r--r--Zend/tests/type_declarations/variance/class_order_autoload2.phpt38
-rw-r--r--Zend/tests/type_declarations/variance/class_order_autoload3.phpt45
-rw-r--r--Zend/tests/type_declarations/variance/class_order_autoload4.phpt44
-rw-r--r--Zend/tests/type_declarations/variance/class_order_autoload5.phpt60
-rw-r--r--Zend/tests/type_declarations/variance/class_order_autoload_error1.phpt25
-rw-r--r--Zend/tests/type_declarations/variance/class_order_autoload_error2.phpt27
-rw-r--r--Zend/tests/type_declarations/variance/class_order_autoload_error3.phpt38
-rw-r--r--Zend/tests/type_declarations/variance/class_order_autoload_error4.phpt39
-rw-r--r--Zend/tests/type_declarations/variance/class_order_autoload_error5.phpt52
-rw-r--r--Zend/tests/type_declarations/variance/class_order_autoload_error6.phpt39
-rw-r--r--Zend/tests/type_declarations/variance/class_order_error.phpt19
-rw-r--r--Zend/tests/type_declarations/variance/enum_forward_compat.phpt26
-rw-r--r--Zend/tests/type_declarations/variance/internal_parent.phpt12
-rw-r--r--Zend/tests/type_declarations/variance/loading_exception1.phpt49
-rw-r--r--Zend/tests/type_declarations/variance/loading_exception2.phpt51
-rw-r--r--Zend/tests/type_declarations/variance/object_variance.phpt22
-rw-r--r--Zend/tests/type_declarations/variance/parent_in_class.phpt47
-rw-r--r--Zend/tests/type_declarations/variance/parent_in_class_success.phpt27
-rw-r--r--Zend/tests/type_declarations/variance/property_types_early_bind.phpt19
-rw-r--r--Zend/tests/type_declarations/variance/trait_error.phpt20
-rw-r--r--Zend/tests/type_declarations/variance/trait_success.phpt29
-rw-r--r--Zend/tests/type_declarations/variance/unlinked_parent_1.phpt19
-rw-r--r--Zend/tests/type_declarations/variance/unlinked_parent_2.phpt19
-rw-r--r--Zend/tests/uncaught_exception_error_supression.phpt18
-rw-r--r--Zend/tests/undef_index_to_exception.phpt46
-rw-r--r--Zend/tests/unexpected_ref_bug.phpt18
-rw-r--r--Zend/tests/unset_cv05.phpt2
-rw-r--r--Zend/tests/unset_cv06.phpt2
-rw-r--r--Zend/tests/use_const/includes/foo_bar.inc (renamed from Zend/tests/use_const/includes/foo_bar.php)0
-rw-r--r--Zend/tests/use_const/includes/foo_php_version.inc (renamed from Zend/tests/use_const/includes/foo_php_version.php)0
-rw-r--r--Zend/tests/use_const/includes/global_bar.inc (renamed from Zend/tests/use_const/includes/global_bar.php)0
-rw-r--r--Zend/tests/use_const/includes/global_baz.inc (renamed from Zend/tests/use_const/includes/global_baz.php)0
-rw-r--r--Zend/tests/use_const/no_global_fallback.phpt2
-rw-r--r--Zend/tests/use_const/shadow_core.phpt2
-rw-r--r--Zend/tests/use_const/shadow_global.phpt4
-rw-r--r--Zend/tests/use_function/includes/foo_bar.inc (renamed from Zend/tests/use_function/includes/foo_bar.php)0
-rw-r--r--Zend/tests/use_function/includes/foo_strlen.inc (renamed from Zend/tests/use_function/includes/foo_strlen.php)0
-rw-r--r--Zend/tests/use_function/includes/global_bar.inc (renamed from Zend/tests/use_function/includes/global_bar.php)0
-rw-r--r--Zend/tests/use_function/includes/global_baz.inc (renamed from Zend/tests/use_function/includes/global_baz.php)0
-rw-r--r--Zend/tests/use_function/no_global_fallback.phpt2
-rw-r--r--Zend/tests/use_function/shadow_core.phpt2
-rw-r--r--Zend/tests/use_function/shadow_global.phpt4
-rw-r--r--Zend/tests/use_unlinked_class.phpt21
-rw-r--r--Zend/tests/varSyntax/globalNonSimpleVariableError.phpt2
-rw-r--r--Zend/tests/varSyntax/newVariable.phpt1
-rw-r--r--Zend/tests/variadic/optional_params.phpt14
-rw-r--r--Zend/tests/weakrefs/weakrefs_001.phpt39
-rw-r--r--Zend/tests/weakrefs/weakrefs_002.phpt19
-rw-r--r--Zend/tests/weakrefs/weakrefs_003.phpt43
-rw-r--r--Zend/tests/weakrefs/weakrefs_004.phpt8
-rw-r--r--Zend/tests/weakrefs/weakrefs_005.phpt12
-rw-r--r--Zend/tests/zend2.php.txt275
-rw-r--r--Zend/zend.c481
-rw-r--r--Zend/zend.h99
-rw-r--r--Zend/zend.icobin1382 -> 0 bytes
-rw-r--r--Zend/zend_API.c721
-rw-r--r--Zend/zend_API.h575
-rw-r--r--Zend/zend_alloc.c374
-rw-r--r--Zend/zend_alloc.h27
-rw-r--r--Zend/zend_alloc_sizes.h12
-rw-r--r--Zend/zend_arena.h116
-rw-r--r--Zend/zend_ast.c152
-rw-r--r--Zend/zend_ast.h21
-rw-r--r--Zend/zend_bitset.h12
-rw-r--r--Zend/zend_build.h12
-rw-r--r--Zend/zend_builtin_functions.c488
-rw-r--r--Zend/zend_builtin_functions.h12
-rw-r--r--Zend/zend_closures.c139
-rw-r--r--Zend/zend_closures.h12
-rw-r--r--Zend/zend_compile.c2431
-rw-r--r--Zend/zend_compile.h400
-rw-r--r--Zend/zend_config.nw.h89
-rw-r--r--Zend/zend_config.w32.h26
-rw-r--r--Zend/zend_constants.c17
-rw-r--r--Zend/zend_constants.h12
-rw-r--r--Zend/zend_cpuinfo.c10
-rw-r--r--Zend/zend_cpuinfo.h20
-rw-r--r--Zend/zend_default_classes.c15
-rw-r--r--Zend/zend_dtrace.c12
-rw-r--r--Zend/zend_dtrace.d2
-rw-r--r--Zend/zend_dtrace.h12
-rw-r--r--Zend/zend_errors.h12
-rw-r--r--Zend/zend_exceptions.c56
-rw-r--r--Zend/zend_exceptions.h12
-rw-r--r--Zend/zend_execute.c2374
-rw-r--r--Zend/zend_execute.h184
-rw-r--r--Zend/zend_execute_API.c337
-rw-r--r--Zend/zend_extensions.c18
-rw-r--r--Zend/zend_extensions.h17
-rw-r--r--Zend/zend_float.c12
-rw-r--r--Zend/zend_float.h35
-rw-r--r--Zend/zend_gc.c237
-rw-r--r--Zend/zend_gc.h20
-rw-r--r--Zend/zend_generators.c128
-rw-r--r--Zend/zend_generators.h12
-rw-r--r--Zend/zend_globals.h41
-rw-r--r--Zend/zend_globals_macros.h22
-rw-r--r--Zend/zend_hash.c321
-rw-r--r--Zend/zend_hash.h74
-rw-r--r--Zend/zend_highlight.c12
-rw-r--r--Zend/zend_highlight.h12
-rw-r--r--Zend/zend_inheritance.c1723
-rw-r--r--Zend/zend_inheritance.h24
-rw-r--r--Zend/zend_ini.c93
-rw-r--r--Zend/zend_ini.h14
-rw-r--r--Zend/zend_ini_parser.y20
-rw-r--r--Zend/zend_ini_scanner.c3883
-rw-r--r--Zend/zend_ini_scanner.h12
-rw-r--r--Zend/zend_ini_scanner.l3
-rw-r--r--Zend/zend_ini_scanner_defs.h13
-rw-r--r--Zend/zend_interfaces.c103
-rw-r--r--Zend/zend_interfaces.h12
-rw-r--r--Zend/zend_istdiostream.h12
-rw-r--r--Zend/zend_iterators.c22
-rw-r--r--Zend/zend_iterators.h24
-rw-r--r--Zend/zend_language_parser.y141
-rw-r--r--Zend/zend_language_scanner.c8192
-rw-r--r--Zend/zend_language_scanner.h12
-rw-r--r--Zend/zend_language_scanner.l332
-rw-r--r--Zend/zend_language_scanner_defs.h14
-rw-r--r--Zend/zend_list.c40
-rw-r--r--Zend/zend_list.h14
-rw-r--r--Zend/zend_llist.c12
-rw-r--r--Zend/zend_llist.h12
-rw-r--r--Zend/zend_long.h12
-rw-r--r--Zend/zend_map_ptr.h85
-rw-r--r--Zend/zend_modules.h14
-rw-r--r--Zend/zend_multibyte.c11
-rw-r--r--Zend/zend_multibyte.h11
-rw-r--r--Zend/zend_multiply.h12
-rw-r--r--Zend/zend_object_handlers.c920
-rw-r--r--Zend/zend_object_handlers.h120
-rw-r--r--Zend/zend_objects.c49
-rw-r--r--Zend/zend_objects.h12
-rw-r--r--Zend/zend_objects_API.c67
-rw-r--r--Zend/zend_objects_API.h32
-rw-r--r--Zend/zend_opcode.c532
-rw-r--r--Zend/zend_operators.c214
-rw-r--r--Zend/zend_operators.h161
-rw-r--r--Zend/zend_portability.h117
-rw-r--r--Zend/zend_ptr_stack.c15
-rw-r--r--Zend/zend_ptr_stack.h12
-rw-r--r--Zend/zend_range_check.h12
-rw-r--r--Zend/zend_signal.c38
-rw-r--r--Zend/zend_signal.h20
-rw-r--r--Zend/zend_smart_str.c12
-rw-r--r--Zend/zend_smart_str.h12
-rw-r--r--Zend/zend_smart_str_public.h12
-rw-r--r--Zend/zend_smart_string.h12
-rw-r--r--Zend/zend_smart_string_public.h12
-rw-r--r--Zend/zend_sort.c11
-rw-r--r--Zend/zend_sort.h12
-rw-r--r--Zend/zend_sprintf.c50
-rw-r--r--Zend/zend_stack.c12
-rw-r--r--Zend/zend_stack.h12
-rw-r--r--Zend/zend_stream.c255
-rw-r--r--Zend/zend_stream.h58
-rw-r--r--Zend/zend_string.c36
-rw-r--r--Zend/zend_string.h87
-rw-r--r--Zend/zend_strtod.c28
-rw-r--r--Zend/zend_strtod.h12
-rw-r--r--Zend/zend_strtod_int.h12
-rw-r--r--Zend/zend_ts_hash.c32
-rw-r--r--Zend/zend_ts_hash.h28
-rw-r--r--Zend/zend_type_info.h12
-rw-r--r--Zend/zend_types.h101
-rw-r--r--Zend/zend_variables.c63
-rw-r--r--Zend/zend_variables.h14
-rw-r--r--Zend/zend_virtual_cwd.c276
-rw-r--r--Zend/zend_virtual_cwd.h50
-rw-r--r--Zend/zend_vm.h12
-rw-r--r--Zend/zend_vm_def.h3312
-rw-r--r--Zend/zend_vm_execute.h30895
-rw-r--r--Zend/zend_vm_execute.skl30
-rwxr-xr-x[-rw-r--r--]Zend/zend_vm_gen.php5698
-rw-r--r--Zend/zend_vm_handlers.h3751
-rw-r--r--Zend/zend_vm_opcodes.c194
-rw-r--r--Zend/zend_vm_opcodes.h402
-rw-r--r--Zend/zend_vm_trace_handlers.h2
-rw-r--r--Zend/zend_vm_trace_map.h2
-rw-r--r--Zend/zend_weakrefs.c213
-rw-r--r--Zend/zend_weakrefs.h (renamed from Zend/header)25
623 files changed, 39711 insertions, 44818 deletions
diff --git a/Zend/Makefile.am b/Zend/Makefile.am
deleted file mode 100644
index 537deb26f9..0000000000
--- a/Zend/Makefile.am
+++ /dev/null
@@ -1,55 +0,0 @@
-## Process this file with automake to produce Makefile.in -*- makefile -*-
-
-#CLEANFILES = zend_language_parser.c zend_language_parser.h zend_language_scanner.c zend_language_parser.output zend_ini_parser.c zend_ini_parser.h zend_ini_scanner.c zend_ini_parser.output
-
-AUTOMAKE_OPTIONS=foreign
-noinst_LTLIBRARIES=libZend.la
-
-libZend_la_SOURCES=\
- zend_language_parser.y zend_language_scanner.l \
- zend_ini_parser.y zend_ini_scanner.l \
- zend_alloc.c zend_compile.c zend_constants.c \
- zend_execute.c zend_execute_API.c zend_highlight.c zend_llist.c \
- zend_vm_opcodes.c zend_opcode.c zend_operators.c zend_ptr_stack.c zend_stack.c \
- zend_variables.c zend.c zend_API.c zend_extensions.c zend_hash.c \
- zend_list.c zend_builtin_functions.c zend_sprintf.c \
- zend_ini.c zend_sort.c zend_objects.c zend_object_handlers.c \
- zend_objects_API.c zend_ts_hash.c zend_stream.c \
- 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_cpuinfo.c
-
-libZend_la_CFLAGS = -DZEND_ENABLE_STATIC_TSRMLS_CACHE=1
-libZend_la_LDFLAGS =
-libZend_la_LIBADD = @ZEND_EXTRA_LIBS@
-
-# automake isn't too clever about "non-standard" use of lex and yacc
-
-$(libZend_la_OBJECTS): zend_language_parser.h
-
-zend_ini_scanner.lo: zend_ini_parser.h
-
-# Language parser/scanner rules
-
-zend_language_scanner.c: $(srcdir)/zend_language_scanner.l
- $(RE2C) $(RE2C_FLAGS) --no-generation-date --case-inverted -cbdFt $(srcdir)/zend_language_scanner_defs.h -o$@ $(srcdir)/zend_language_scanner.l
-
-zend_language_parser.h: zend_language_parser.c
-zend_language_parser.c: $(srcdir)/zend_language_parser.y
- $(YACC) -p zend -v -d $(srcdir)/zend_language_parser.y -o zend_language_parser.c
-
-# INI parser/scanner rules
-
-zend_ini_parser.c: $(srcdir)/zend_ini_parser.y
- $(YACC) -p ini_ -v -d $(srcdir)/zend_ini_parser.y -o zend_ini_parser.c
-
-zend_ini_scanner.c: $(srcdir)/zend_ini_scanner.l
- $(RE2C) $(RE2C_FLAGS) --no-generation-date --case-inverted -cbdFt $(srcdir)/zend_ini_scanner_defs.h -o$@ $(srcdir)/zend_ini_scanner.l
-
-zend_ini_parser.h: zend_ini_parser.c
-
-depend:
-
-zend_execute.lo: $(srcdir)/zend_execute.c
- $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(CPPFLAGS) $(INLINE_CFLAGS) -c $(srcdir)/zend_execute.c
diff --git a/Zend/Makefile.frag b/Zend/Makefile.frag
index 3ab617d715..c5728af3c1 100755..100644
--- a/Zend/Makefile.frag
+++ b/Zend/Makefile.frag
@@ -1 +1,37 @@
+#
+# Zend
+#
+
+$(builddir)/zend_language_scanner.lo: $(srcdir)/zend_language_parser.h
+$(builddir)/zend_ini_scanner.lo: $(srcdir)/zend_ini_parser.h
+
+$(srcdir)/zend_language_scanner.c: $(srcdir)/zend_language_scanner.l
+ @(cd $(top_srcdir); $(RE2C) $(RE2C_FLAGS) --no-generation-date --case-inverted -cbdFt Zend/zend_language_scanner_defs.h -oZend/zend_language_scanner.c Zend/zend_language_scanner.l)
+
+$(srcdir)/zend_language_parser.h: $(srcdir)/zend_language_parser.c
+$(srcdir)/zend_language_parser.c: $(srcdir)/zend_language_parser.y
+# Tweak zendparse to be exported through ZEND_API. This has to be revisited once
+# bison supports foreign skeletons and that bison version is used. Read
+# https://git.savannah.gnu.org/cgit/bison.git/tree/data/README.md for more.
+ @$(YACC) -p zend -v -d $(srcdir)/zend_language_parser.y -o $@
+ @$(SED) -e 's,^int zendparse\(.*\),ZEND_API int zendparse\1,g' < $@ \
+ > $@.tmp && \
+ mv $@.tmp $@
+ @$(SED) -e 's,^int zendparse\(.*\),ZEND_API int zendparse\1,g' < $(srcdir)/zend_language_parser.h \
+ > $(srcdir)/zend_language_parser.h.tmp && \
+ mv $(srcdir)/zend_language_parser.h.tmp $(srcdir)/zend_language_parser.h
+ @nlinit=`echo 'nl="'; echo '"'`; eval "$$nlinit"; \
+ $(SED) -e "s/^#ifndef YYTOKENTYPE/#include \"zend.h\"\\$${nl}#ifndef YYTOKENTYPE/" < $(srcdir)/zend_language_parser.h \
+ > $(srcdir)/zend_language_parser.h.tmp && \
+ mv $(srcdir)/zend_language_parser.h.tmp $(srcdir)/zend_language_parser.h
+
+$(srcdir)/zend_ini_parser.h: $(srcdir)/zend_ini_parser.c
+$(srcdir)/zend_ini_parser.c: $(srcdir)/zend_ini_parser.y
+ @$(YACC) -p ini_ -v -d $(srcdir)/zend_ini_parser.y -o $@
+
+$(srcdir)/zend_ini_scanner.c: $(srcdir)/zend_ini_scanner.l
+ @(cd $(top_srcdir); $(RE2C) $(RE2C_FLAGS) --no-generation-date --case-inverted -cbdFt Zend/zend_ini_scanner_defs.h -oZend/zend_ini_scanner.c Zend/zend_ini_scanner.l)
+
+$(builddir)/zend_highlight.lo $(builddir)/zend_compile.lo: $(srcdir)/zend_language_parser.h
+
Zend/zend_execute.lo: $(srcdir)/zend_vm_execute.h $(srcdir)/zend_vm_opcodes.h
diff --git a/Zend/README.ZEND_MM b/Zend/README.ZEND_MM
deleted file mode 100644
index ff882e5d41..0000000000
--- a/Zend/README.ZEND_MM
+++ /dev/null
@@ -1,43 +0,0 @@
-Zend Memory Manager
-===================
-
-General:
---------
-
-The goal of the new memory manager (available since PHP 5.2) is to reduce memory
-allocation overhead and speedup memory management.
-
-The new manager's "configure" has no "--disable-zend-memory-manager" option,
-but it has "--enable-malloc-mm" instead. It is enabled by default in DEBUG
-build and disabled by default in RELEASE build. When enabled it allows selecting
-between malloc and emalloc at runtime so you can use internal and external memory
-debuggers without recompilation.
-
-Debugging:
-----------
-
-Normal:
-
- $ sapi/cli/php -r 'leak();'
-
-Zend MM disabled:
-
- $ USE_ZEND_ALLOC=0 valgrind --leak-check=full sapi/cli/php -r 'leak();'
-
-Shared extensions:
-------------------
-
-Since PHP 5.3.11 it is possible to prevent shared extensions from unloading so
-that valgrind can correctly track the memory leaks in shared extensions. For
-this there is the ZEND_DONT_UNLOAD_MODULES environment variable. If set, then
-DL_UNLOAD() is skipped during the shutdown of shared extensions.
-
-
-Tweaking:
----------
-
-The Zend MM can be tweaked using ZEND_MM_MEM_TYPE and ZEND_MM_SEG_SIZE environment
-variables. Default values are "malloc" and "256K". Dependent on target system you
-can also use "mmap_anon", "mmap_zero" and "win32" storage managers.
-
- $ ZEND_MM_MEM_TYPE=mmap_anon ZEND_MM_SEG_SIZE=1M sapi/cli/php ..etc.
diff --git a/Zend/README.ZEND_VM b/Zend/README.ZEND_VM
deleted file mode 100644
index b05b7ccc9a..0000000000
--- a/Zend/README.ZEND_VM
+++ /dev/null
@@ -1,102 +0,0 @@
-ZEND_VM
-=======
-
-ZEND_VM architecture allows specializing opcode handlers according to op_type
-fields and using different execution methods (call threading, switch threading
-and direct threading). As a result ZE2 got more than 20% speedup on raw PHP
-code execution (with specialized executor and direct threading execution
-method). As in most PHP applications raw execution speed isn't the limiting
-factor but system calls and database calls are, your mileage with this patch
-will vary.
-
-Most parts of the old zend_execute.c go into zend_vm_def.h. Here you can
-find opcode handlers and helpers. The typical opcode handler template looks
-like this:
-
-ZEND_VM_HANDLER(<OPCODE-NUMBER>, <OPCODE>, <OP1_TYPES>, <OP2_TYPES>)
-{
- <HANDLER'S CODE>
-}
-
-<OPCODE-NUMBER> is a opcode number (0, 1, ...)
-<OPCODE> is an opcode name (ZEN_NOP, ZEND_ADD, :)
-<OP1_TYPES> & <OP2_TYPES> are masks for allowed operand op_types. Specializer
-will generate code only for defined combination of types. You can use any
-combination of the following op_types UNUSED, CONST, VAR, TMP and CV also
-you can use ANY mask to disable specialization according operand's op_type.
-<HANDLER'S CODE> is a handler's code itself. For most handlers it stills the
-same as in old zend_execute.c, but now it uses macros to access opcode operands
-and some internal executor data.
-
-You can see the conformity of new macros to old code in the following list:
-
-EXECUTE_DATA
- execute_data
-ZEND_VM_DISPATCH_TO_HANDLER(<OP>)
- return <OP>_helper(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)
-ZEND_VM_DISPATCH_TO_HELPER(<NAME>)
- return <NAME>(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)
-ZEND_VM_DISPATCH_TO_HELPER_EX(<NAME>,<PARAM>,<VAL>)
- return <NAME>(<VAL>, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)
-ZEND_VM_CONTINUE()
- return 0
-ZEND_VM_NEXT_OPCODE()
- NEXT_OPCODE()
-ZEND_VM_SET_OPCODE(<TARGET>
- SET_OPCODE(<TARGET>
-ZEND_VM_INC_OPCODE()
- INC_OPCOD()
-ZEND_VM_RETURN_FROM_EXECUTE_LOOP()
- RETURN_FROM_EXECUTE_LOOP()
-ZEND_VM_C_LABEL(<LABEL>):
- <LABEL>:
-ZEND_VM_C_GOTO(<LABEL>)
- goto <LABEL>
-OP<X>_TYPE
- opline->op<X>.op_type
-GET_OP<X>_ZVAL_PTR(<TYPE>)
- get_zval_ptr(&opline->op<X>, EX(Ts), &free_op<X>, <TYPE>)
-GET_OP<X>_ZVAL_PTR_PTR(<TYPE>)
- get_zval_ptr_ptr(&opline->op<X>, EX(Ts), &free_op<X>, <TYPE>)
-GET_OP<X>_OBJ_ZVAL_PTR(<TYPE>)
- get_obj_zval_ptr(&opline->op<X>, EX(Ts), &free_op<X>, <TYPE>)
-GET_OP<X>_OBJ_ZVAL_PTR_PTR(<TYPE>)
- get_obj_zval_ptr_ptr(&opline->op<X>, EX(Ts), &free_op<X>, <TYPE>)
-IS_OP<X>_TMP_FREE()
- IS_TMP_FREE(free_op<X>)
-FREE_OP<X>()
- FREE_OP(free_op<X>)
-FREE_OP<X>_IF_VAR()
- FREE_VAR(free_op<X>)
-FREE_OP<X>_VAR_PTR()
- FREE_VAR_PTR(free_op<X>)
-
-
-Executor's helpers can be defined without parameters or with one parameter.
-This is done with the following constructs:
-
-ZEND_VM_HELPER(<HELPER-NAME>, <OP1_TYPES>, <OP2_TYPES>)
-{
- <HELPER'S CODE>
-}
-
-ZEND_VM_HELPER_EX(<HELPER-NAME>, <OP1_TYPES>, <OP2_TYPES>, <PARAM_SPEC>)
-{
- <HELPER'S CODE>
-}
-
-Executor's code is generated by PHP script zend_vm_gen.php it uses zend_vm_def.h
-and zend_vm_execute.skl as input and produces zend_vm_opcodes.h and
-zend_vm_execute.h. The first file is a list of opcode definitions. It is
-included from zend_compile.h. The second one is an executor code itself. It is
-included from zend_execute.c.
-
-zend_vm_gen.php can produce different kind of executors. You can select
-different opcode threading model using --with-vm-kind=CALL|SWITCH|GOTO. You can
-disable opcode specialization using --without-specializer. You can include or
-exclude old executor together with specialized one using --without-old-executor.
-At last you can debug executor using original zend_vm_def.h or generated file
-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
diff --git a/Zend/README.md b/Zend/README.md
new file mode 100644
index 0000000000..cf1f15463d
--- /dev/null
+++ b/Zend/README.md
@@ -0,0 +1,139 @@
+# Zend Engine
+
+## Zend memory manager
+
+### General
+
+The goal of the new memory manager (available since PHP 5.2) is to reduce memory
+allocation overhead and speedup memory management.
+
+### Debugging
+
+Normal:
+
+```bash
+sapi/cli/php -r 'leak();'
+```
+
+Zend MM disabled:
+
+```bash
+USE_ZEND_ALLOC=0 valgrind --leak-check=full sapi/cli/php -r 'leak();'
+```
+
+### Shared extensions
+
+Since PHP 5.3.11 it is possible to prevent shared extensions from unloading so
+that valgrind can correctly track the memory leaks in shared extensions. For
+this there is the `ZEND_DONT_UNLOAD_MODULES` environment variable. If set, then
+`DL_UNLOAD()` is skipped during the shutdown of shared extensions.
+
+## ZEND_VM
+
+`ZEND_VM` architecture allows specializing opcode handlers according to
+`op_type` fields and using different execution methods (call threading, switch
+threading and direct threading). As a result ZE2 got more than 20% speedup on
+raw PHP code execution (with specialized executor and direct threading execution
+method). As in most PHP applications raw execution speed isn't the limiting
+factor but system calls and database calls are, your mileage with this patch
+will vary.
+
+Most parts of the old zend_execute.c go into `zend_vm_def.h`. Here you can find
+opcode handlers and helpers. The typical opcode handler template looks like
+this:
+
+```c
+ZEND_VM_HANDLER(<OPCODE-NUMBER>, <OPCODE>, <OP1_TYPES>, <OP2_TYPES>)
+{
+ <HANDLER'S CODE>
+}
+```
+
+`<OPCODE-NUMBER>` is a opcode number (0, 1, ...)
+`<OPCODE>` is an opcode name (ZEN_NOP, ZEND_ADD, :)
+`<OP1_TYPES>` and `<OP2_TYPES>` are masks for allowed operand op_types.
+Specializer will generate code only for defined combination of types. You can
+use any combination of the following op_types UNUSED, CONST, VAR, TMP and CV
+also you can use ANY mask to disable specialization according operand's op_type.
+`<HANDLER'S CODE>` is a handler's code itself. For most handlers it stills the
+same as in old `zend_execute.c`, but now it uses macros to access opcode
+operands and some internal executor data.
+
+You can see the conformity of new macros to old code in the following list:
+
+```c
+EXECUTE_DATA
+ execute_data
+ZEND_VM_DISPATCH_TO_HANDLER(<OP>)
+ return <OP>_helper(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)
+ZEND_VM_DISPATCH_TO_HELPER(<NAME>)
+ return <NAME>(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)
+ZEND_VM_DISPATCH_TO_HELPER_EX(<NAME>,<PARAM>,<VAL>)
+ return <NAME>(<VAL>, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)
+ZEND_VM_CONTINUE()
+ return 0
+ZEND_VM_NEXT_OPCODE()
+ NEXT_OPCODE()
+ZEND_VM_SET_OPCODE(<TARGET>
+ SET_OPCODE(<TARGET>
+ZEND_VM_INC_OPCODE()
+ INC_OPCOD()
+ZEND_VM_RETURN_FROM_EXECUTE_LOOP()
+ RETURN_FROM_EXECUTE_LOOP()
+ZEND_VM_C_LABEL(<LABEL>):
+ <LABEL>:
+ZEND_VM_C_GOTO(<LABEL>)
+ goto <LABEL>
+OP<X>_TYPE
+ opline->op<X>.op_type
+GET_OP<X>_ZVAL_PTR(<TYPE>)
+ get_zval_ptr(&opline->op<X>, EX(Ts), &free_op<X>, <TYPE>)
+GET_OP<X>_ZVAL_PTR_PTR(<TYPE>)
+ get_zval_ptr_ptr(&opline->op<X>, EX(Ts), &free_op<X>, <TYPE>)
+GET_OP<X>_OBJ_ZVAL_PTR(<TYPE>)
+ get_obj_zval_ptr(&opline->op<X>, EX(Ts), &free_op<X>, <TYPE>)
+GET_OP<X>_OBJ_ZVAL_PTR_PTR(<TYPE>)
+ get_obj_zval_ptr_ptr(&opline->op<X>, EX(Ts), &free_op<X>, <TYPE>)
+IS_OP<X>_TMP_FREE()
+ IS_TMP_FREE(free_op<X>)
+FREE_OP<X>()
+ FREE_OP(free_op<X>)
+FREE_OP<X>_IF_VAR()
+ FREE_VAR(free_op<X>)
+FREE_OP<X>_VAR_PTR()
+ FREE_VAR_PTR(free_op<X>)
+```
+
+Executor's helpers can be defined without parameters or with one parameter. This
+is done with the following constructs:
+
+```c
+ZEND_VM_HELPER(<HELPER-NAME>, <OP1_TYPES>, <OP2_TYPES>)
+{
+ <HELPER'S CODE>
+}
+
+ZEND_VM_HELPER_EX(<HELPER-NAME>, <OP1_TYPES>, <OP2_TYPES>, <PARAM_SPEC>)
+{
+ <HELPER'S CODE>
+}
+```
+
+Executor's code is generated by PHP script zend_vm_gen.php it uses
+`zend_vm_def.h` and `zend_vm_execute.skl` as input and produces
+`zend_vm_opcodes.h` and `zend_vm_execute.h`. The first file is a list of opcode
+definitions. It is included from `zend_compile.h`. The second one is an executor
+code itself. It is included from `zend_execute.c`.
+
+`zend_vm_gen.php` can produce different kind of executors. You can select
+different opcode threading model using `--with-vm-kind=CALL|SWITCH|GOTO`. You
+can disable opcode specialization using `--without-specializer`. You can include
+or exclude old executor together with specialized one using
+`--without-old-executor`. At last you can debug executor using original
+`zend_vm_def.h` or generated file `zend_vm_execute.h`. Debugging with original
+file requires `--with-lines` option. By default ZE2 uses the following command
+to generate executor:
+
+```bash
+php zend_vm_gen.php --with-vm-kind=CALL
+```
diff --git a/Zend/Zend.m4 b/Zend/Zend.m4
index 67cea95a91..d6919ae1e1 100644
--- a/Zend/Zend.m4
+++ b/Zend/Zend.m4
@@ -1,77 +1,139 @@
+dnl This file contains Zend specific autoconf macros.
+
dnl
-dnl This file contains Zend specific autoconf functions.
+dnl ZEND_CHECK_FLOAT_PRECISION
dnl
+dnl x87 floating point internal precision control checks
+dnl See: http://wiki.php.net/rfc/rounding
+dnl
+AC_DEFUN([ZEND_CHECK_FLOAT_PRECISION],[
+ AC_MSG_CHECKING([for usable _FPU_SETCW])
+ AC_LINK_IFELSE([AC_LANG_PROGRAM([[
+ #include <fpu_control.h>
+ ]],[[
+ fpu_control_t fpu_oldcw, fpu_cw;
+ volatile double result;
+ double a = 2877.0;
+ volatile double b = 1000000.0;
+
+ _FPU_GETCW(fpu_oldcw);
+ fpu_cw = (fpu_oldcw & ~_FPU_EXTENDED & ~_FPU_SINGLE) | _FPU_DOUBLE;
+ _FPU_SETCW(fpu_cw);
+ result = a / b;
+ _FPU_SETCW(fpu_oldcw);
+ ]])],[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)
+ else
+ AC_MSG_RESULT(no)
+ fi
-AC_DEFUN([LIBZEND_CHECK_INT_TYPE],[
-AC_MSG_CHECKING(for $1)
-AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
-#if HAVE_SYS_TYPES_H
-#include <sys/types.h>
-#endif
-#if HAVE_INTTYPES_H
-#include <inttypes.h>
-#elif HAVE_STDINT_H
-#include <stdint.h>
-#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_DEFUN([LIBZEND_BASIC_CHECKS],[
+ AC_MSG_CHECKING([for usable fpsetprec])
+ AC_LINK_IFELSE([AC_LANG_PROGRAM([[
+ #include <machine/ieeefp.h>
+ ]],[[
+ fp_prec_t fpu_oldprec;
+ volatile double result;
+ double a = 2877.0;
+ volatile double b = 1000000.0;
+
+ fpu_oldprec = fpgetprec();
+ fpsetprec(FP_PD);
+ result = a / b;
+ fpsetprec(fpu_oldprec);
+ ]])], [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)
+ else
+ AC_MSG_RESULT(no)
+ fi
-AC_REQUIRE([AC_PROG_YACC])
-AC_REQUIRE([AC_PROG_CC])
-AC_REQUIRE([AC_PROG_CC_C_O])
-AC_REQUIRE([AC_HEADER_STDC])
+ AC_MSG_CHECKING([for usable _controlfp])
+ AC_LINK_IFELSE([AC_LANG_PROGRAM([[
+ #include <float.h>
+ ]],[[
+ unsigned int fpu_oldcw;
+ volatile double result;
+ double a = 2877.0;
+ volatile double b = 1000000.0;
+
+ fpu_oldcw = _controlfp(0, 0);
+ _controlfp(_PC_53, _MCW_PC);
+ result = a / b;
+ _controlfp(fpu_oldcw, _MCW_PC);
+ ]])], [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)
+ else
+ AC_MSG_RESULT(no)
+ fi
-LIBZEND_BISON_CHECK
+ AC_MSG_CHECKING([for usable _controlfp_s])
+ AC_LINK_IFELSE([AC_LANG_PROGRAM([[
+ #include <float.h>
+ ]],[[
+ unsigned int fpu_oldcw, fpu_cw;
+ volatile double result;
+ double a = 2877.0;
+ volatile double b = 1000000.0;
+
+ _controlfp_s(&fpu_cw, 0, 0);
+ fpu_oldcw = fpu_cw;
+ _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])
+ 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)
+ else
+ AC_MSG_RESULT(no)
+ fi
-dnl Ugly hack to get around a problem with gcc on AIX.
-if test "$CC" = "gcc" -a "$ac_cv_prog_cc_g" = "yes" -a \
- "`uname -sv`" = "AIX 4"; then
- CFLAGS=`echo $CFLAGS | sed -e 's/-g//'`
-fi
+ AC_MSG_CHECKING([whether FPU control word can be manipulated by inline assembler])
+ AC_LINK_IFELSE([AC_LANG_PROGRAM([[
+ /* nothing */
+ ]],[[
+ unsigned int oldcw, cw;
+ volatile double result;
+ double a = 2877.0;
+ volatile double b = 1000000.0;
+
+ __asm__ __volatile__ ("fnstcw %0" : "=m" (*&oldcw));
+ cw = (oldcw & ~0x0 & ~0x300) | 0x200;
+ __asm__ __volatile__ ("fldcw %0" : : "m" (*&cw));
+
+ 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])
+ 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)
+ else
+ AC_MSG_RESULT(no)
+ fi
+])
-dnl Hack to work around a Mac OS X cpp problem
-dnl Known versions needing this workaround are 5.3 and 5.4
-if test "$ac_cv_prog_gcc" = "yes" -a "`uname -s`" = "Rhapsody"; then
- CPPFLAGS="$CPPFLAGS -traditional-cpp"
-fi
+dnl
+dnl LIBZEND_BASIC_CHECKS
+dnl
+dnl Basic checks specific for the Zend engine library.
+dnl
+AC_DEFUN([LIBZEND_BASIC_CHECKS],[
+AC_REQUIRE([AC_PROG_CC])
-AC_CHECK_HEADERS(
-inttypes.h \
-stdint.h \
-limits.h \
-malloc.h \
-string.h \
-unistd.h \
-stdarg.h \
-sys/types.h \
-sys/time.h \
-signal.h \
-unix.h \
-stdlib.h \
-cpuid.h \
-dlfcn.h)
-
-AC_TYPE_SIZE_T
-
-AC_DEFUN([LIBZEND_LIBDL_CHECKS],[
-AC_CHECK_LIB(dl, dlopen, [LIBS="-ldl $LIBS"])
-AC_CHECK_FUNC(dlopen,[AC_DEFINE(HAVE_LIBDL, 1,[ ])])
-])
+AC_CHECK_HEADERS([cpuid.h])
-AC_DEFUN([LIBZEND_DLSYM_CHECK],[
+dnl
+dnl LIBZEND_DLSYM_CHECK
dnl
dnl Ugly hack to check if dlsym() requires a leading underscore in symbol name.
dnl
+AC_DEFUN([LIBZEND_DLSYM_CHECK],[
AC_MSG_CHECKING([whether dlsym() requires a leading underscore in symbol names])
_LT_AC_TRY_DLOPEN_SELF([
AC_MSG_RESULT(no)
@@ -83,28 +145,14 @@ _LT_AC_TRY_DLOPEN_SELF([
], [])
])
-dnl This is required for QNX and may be some BSD derived systems
-AC_CHECK_TYPE( uint, unsigned int )
-AC_CHECK_TYPE( ulong, unsigned long )
-
-dnl Check if int32_t and uint32_t are defined
-LIBZEND_CHECK_INT_TYPE(int32_t)
-LIBZEND_CHECK_INT_TYPE(uint32_t)
-
dnl Checks for library functions.
-AC_FUNC_VPRINTF
-AC_FUNC_MEMCMP
-AC_FUNC_ALLOCA
-AC_CHECK_FUNCS(memcpy strdup getpid kill strtod strtol finite fpclass sigsetjmp)
-AC_ZEND_BROKEN_SPRINTF
+AC_CHECK_FUNCS(getpid kill finite sigsetjmp)
AC_CHECK_DECLS([isfinite, isnan, isinf], [], [], [[#include <math.h>]])
-ZEND_FP_EXCEPT
-
ZEND_CHECK_FLOAT_PRECISION
-dnl test whether double cast to long preserves least significant bits
+dnl Test whether double cast to long preserves least significant bits.
AC_MSG_CHECKING(whether double cast to long preserves least significant bits)
AC_RUN_IFELSE([AC_LANG_SOURCE([[
@@ -138,33 +186,22 @@ int main()
])
-AC_DEFUN([LIBZEND_ENABLE_DEBUG],[
-
-AC_ARG_ENABLE(debug,
-[ --enable-debug Compile with debugging symbols],[
- ZEND_DEBUG=$enableval
-],[
- ZEND_DEBUG=no
-])
-
-])
-
+dnl
+dnl LIBZEND_OTHER_CHECKS
+dnl
AC_DEFUN([LIBZEND_OTHER_CHECKS],[
-AC_ARG_ENABLE(maintainer-zts,
-[ --enable-maintainer-zts Enable thread safety - for code maintainers only!!],[
- ZEND_MAINTAINER_ZTS=$enableval
-],[
- ZEND_MAINTAINER_ZTS=no
-])
+AC_ARG_ENABLE([maintainer-zts],
+ [AS_HELP_STRING([--enable-maintainer-zts],
+ [Enable thread safety - for code maintainers only!!])],
+ [ZEND_MAINTAINER_ZTS=$enableval],
+ [ZEND_MAINTAINER_ZTS=no])
-AC_ARG_ENABLE(inline-optimization,
-[ --disable-inline-optimization
- If building zend_execute.lo fails, try this switch],[
- ZEND_INLINE_OPTIMIZATION=$enableval
-],[
- ZEND_INLINE_OPTIMIZATION=yes
-])
+AC_ARG_ENABLE([inline-optimization],
+ [AS_HELP_STRING([--disable-inline-optimization],
+ [If building zend_execute.lo fails, try this switch])],
+ [ZEND_INLINE_OPTIMIZATION=$enableval],
+ [ZEND_INLINE_OPTIMIZATION=yes])
AC_MSG_CHECKING(whether to enable thread-safety)
AC_MSG_RESULT($ZEND_MAINTAINER_ZTS)
@@ -181,13 +218,11 @@ if test "$ZEND_DEBUG" = "yes"; then
if test "$CFLAGS" = "-g -O2"; then
CFLAGS=-g
fi
- test -n "$GCC" && DEBUG_CFLAGS="$DEBUG_CFLAGS -Wall"
- test -n "$GCC" && test "$USE_MAINTAINER_MODE" = "yes" && \
- DEBUG_CFLAGS="$DEBUG_CFLAGS -Wmissing-prototypes -Wstrict-prototypes -Wmissing-declarations"
else
AC_DEFINE(ZEND_DEBUG,0,[ ])
fi
+test -n "$GCC" && CFLAGS="$CFLAGS -Wall -Wno-strict-aliasing"
test -n "$DEBUG_CFLAGS" && CFLAGS="$CFLAGS $DEBUG_CFLAGS"
if test "$ZEND_MAINTAINER_ZTS" = "yes"; then
@@ -215,8 +250,8 @@ else
AC_MSG_RESULT(no)
fi
-dnl test and set the alignment define for ZEND_MM
-dnl this also does the logarithmic test for ZEND_MM.
+dnl Test and set the alignment define for ZEND_MM. This also does the
+dnl logarithmic test for ZEND_MM.
AC_MSG_CHECKING(for MM alignment and log values)
AC_RUN_IFELSE([AC_LANG_SOURCE([[
@@ -257,126 +292,22 @@ int main()
AC_DEFINE_UNQUOTED(ZEND_MM_ALIGNMENT, $LIBZEND_MM_ALIGN, [ ])
AC_DEFINE_UNQUOTED(ZEND_MM_ALIGNMENT_LOG2, $LIBZEND_MM_ALIGN_LOG2, [ ])
], [], [
- dnl cross-compile needs something here
+ dnl Cross compilation needs something here.
LIBZEND_MM_ALIGN=8
])
AC_MSG_RESULT(done)
-dnl test for memory allocation using mmap(MAP_ANON)
-AC_MSG_CHECKING(for memory allocation using mmap(MAP_ANON))
-
-AC_RUN_IFELSE([AC_LANG_SOURCE([[
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <sys/mman.h>
-#include <stdlib.h>
-#include <stdio.h>
-#ifndef MAP_ANON
-# ifdef MAP_ANONYMOUS
-# define MAP_ANON MAP_ANONYMOUS
-# endif
-#endif
-#ifndef MREMAP_MAYMOVE
-# define MREMAP_MAYMOVE 0
-#endif
-#ifndef MAP_FAILED
-# define MAP_FAILED ((void*)-1)
-#endif
-
-#define SEG_SIZE (256*1024)
-
-int main()
-{
- void *seg = mmap(NULL, SEG_SIZE, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON, -1, 0);
- if (seg == MAP_FAILED) {
- return 1;
- }
- if (munmap(seg, SEG_SIZE) != 0) {
- return 2;
- }
- 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)
-], [
- AC_MSG_RESULT(no)
-], [
- dnl cross-compile needs something here
- AC_MSG_RESULT(no)
-])
-
-dnl test for memory allocation using mmap("/dev/zero")
-AC_MSG_CHECKING(for memory allocation using mmap("/dev/zero"))
-
-AC_RUN_IFELSE([AC_LANG_SOURCE([[
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <sys/mman.h>
-#include <stdlib.h>
-#include <stdio.h>
-#ifndef MAP_ANON
-# ifdef MAP_ANONYMOUS
-# define MAP_ANON MAP_ANONYMOUS
-# endif
-#endif
-#ifndef MREMAP_MAYMOVE
-# define MREMAP_MAYMOVE 0
-#endif
-#ifndef MAP_FAILED
-# define MAP_FAILED ((void*)-1)
-#endif
-
-#define SEG_SIZE (256*1024)
-
-int main()
-{
- int fd;
- void *seg;
-
- fd = open("/dev/zero", O_RDWR, S_IRUSR | S_IWUSR);
- if (fd < 0) {
- return 1;
- }
- seg = mmap(NULL, SEG_SIZE, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0);
- if (seg == MAP_FAILED) {
- return 2;
- }
- if (munmap(seg, SEG_SIZE) != 0) {
- return 3;
- }
- if (close(fd) != 0) {
- return 4;
- }
- 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)
-], [
- AC_MSG_RESULT(no)
-], [
- dnl cross-compile needs something here
- AC_MSG_RESULT(no)
-])
-
AC_CHECK_FUNCS(mremap)
+AC_ARG_ENABLE([zend-signals],
+ [AS_HELP_STRING([--disable-zend-signals],
+ [whether to enable zend signal handling])],
+ [ZEND_SIGNALS=$enableval],
+ [ZEND_SIGNALS=yes])
-AC_ARG_ENABLE(zend-signals,
-[ --disable-zend-signals whether to enable zend signal handling],[
- ZEND_SIGNALS=$enableval
-],[
- ZEND_SIGNALS=yes
-])
-
-AC_CHECK_FUNC(sigaction, [
- AC_DEFINE(HAVE_SIGACTION, 1, [Whether sigaction() is available])
-], [
- ZEND_SIGNALS=no
+AC_CHECK_FUNCS([sigaction], [], [
+ ZEND_SIGNALS=no
])
if test "$ZEND_SIGNALS" = "yes"; then
AC_DEFINE(ZEND_SIGNALS, 1, [Use zend signal handling])
@@ -396,21 +327,12 @@ else
AC_MSG_RESULT(no)
fi
-AC_MSG_CHECKING(whether /dev/arandom exists)
-if test -r "/dev/arandom" && test -c "/dev/arandom"; then
- AC_DEFINE([HAVE_DEV_ARANDOM], 1, [Define if the target system has /dev/arandom device])
- AC_MSG_RESULT(yes)
-else
- AC_MSG_RESULT(no)
-fi
+AC_ARG_ENABLE([gcc-global-regs],
+ [AS_HELP_STRING([--disable-gcc-global-regs],
+ [whether to enable GCC global register variables])],
+ [ZEND_GCC_GLOBAL_REGS=$enableval],
+ [ZEND_GCC_GLOBAL_REGS=yes])
-AC_ARG_ENABLE(gcc-global-regs,
-[ --disable-gcc-global-regs
- whether to enable GCC global register variables],[
- ZEND_GCC_GLOBAL_REGS=$enableval
-],[
- ZEND_GCC_GLOBAL_REGS=yes
-])
AC_MSG_CHECKING(for global register variables support)
if test "$ZEND_GCC_GLOBAL_REGS" != "no"; then
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
@@ -431,6 +353,9 @@ if test "$ZEND_GCC_GLOBAL_REGS" != "no"; then
#elif defined(__IBMC__) && ZEND_GCC_VERSION >= 4002 && defined(__powerpc64__)
# define ZEND_VM_FP_GLOBAL_REG "r28"
# define ZEND_VM_IP_GLOBAL_REG "r29"
+#elif defined(__GNUC__) && ZEND_GCC_VERSION >= 4008 && defined(__aarch64__)
+# define ZEND_VM_FP_GLOBAL_REG "x27"
+# define ZEND_VM_IP_GLOBAL_REG "x28"
#else
# error "global register variables are not supported"
#endif
@@ -460,9 +385,7 @@ else
fi
AC_MSG_RESULT($ZEND_GCC_GLOBAL_REGS)
-dnl
-dnl Check if atof() accepts NAN
-dnl
+dnl Check if atof() accepts NAN.
AC_CACHE_CHECK(whether atof() accepts NAN, ac_cv_atof_accept_nan,[
AC_RUN_IFELSE([AC_LANG_SOURCE([[
#include <math.h>
@@ -491,9 +414,7 @@ if test "$ac_cv_atof_accept_nan" = "yes"; then
AC_DEFINE([HAVE_ATOF_ACCEPTS_NAN], 1, [whether atof() accepts NAN])
fi
-dnl
-dnl Check if atof() accepts INF
-dnl
+dnl Check if atof() accepts INF.
AC_CACHE_CHECK(whether atof() accepts INF, ac_cv_atof_accept_inf,[
AC_RUN_IFELSE([AC_LANG_SOURCE([[
#include <math.h>
@@ -525,9 +446,7 @@ if test "$ac_cv_atof_accept_inf" = "yes"; then
AC_DEFINE([HAVE_ATOF_ACCEPTS_INF], 1, [whether atof() accepts INF])
fi
-dnl
-dnl Check if HUGE_VAL == INF
-dnl
+dnl Check if HUGE_VAL == INF.
AC_CACHE_CHECK(whether HUGE_VAL == INF, ac_cv_huge_val_inf,[
AC_RUN_IFELSE([AC_LANG_SOURCE([[
#include <math.h>
@@ -560,9 +479,7 @@ if test "$ac_cv_huge_val_inf" = "yes"; then
AC_DEFINE([HAVE_HUGE_VAL_INF], 1, [whether HUGE_VAL == INF])
fi
-dnl
-dnl Check if HUGE_VAL + -HUGEVAL == NAN
-dnl
+dnl Check if HUGE_VAL + -HUGEVAL == NAN.
AC_CACHE_CHECK(whether HUGE_VAL + -HUGEVAL == NAN, ac_cv_huge_val_nan,[
AC_RUN_IFELSE([AC_LANG_SOURCE([[
#include <math.h>
@@ -597,9 +514,7 @@ 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
+dnl Check whether __cpuid_count is available.
AC_CACHE_CHECK(whether __cpuid_count is available, ac_cv_cpuid_count_available, [
AC_LINK_IFELSE([AC_LANG_PROGRAM([[
#include <cpuid.h>
diff --git a/Zend/acinclude.m4 b/Zend/acinclude.m4
deleted file mode 100644
index f45a7a7c13..0000000000
--- a/Zend/acinclude.m4
+++ /dev/null
@@ -1,225 +0,0 @@
-dnl This file contains local autoconf functions.
-
-AC_DEFUN([LIBZEND_BISON_CHECK],[
- # we only support certain bison versions;
- # min: 2.4 (i.e. 204, major * 100 + minor for easier comparison)
- bison_version_min="204"
- # non-working versions, e.g. "3.0 3.2";
- # remove "none" when introducing the first incompatible bison version an
- # separate any following additions by spaces
- bison_version_exclude=""
-
- # for standalone build of Zend Engine
- test -z "$SED" && SED=sed
-
- bison_version=none
- if test "$YACC"; then
- AC_CACHE_CHECK([for bison version], php_cv_bison_version, [
- bison_version_vars=`$YACC --version 2> /dev/null | grep 'GNU Bison' | cut -d ' ' -f 4 | $SED -e 's/\./ /g' | tr -d a-z`
- php_cv_bison_version=invalid
- if test -n "$bison_version_vars"; then
- set $bison_version_vars
- bison_version="${1}.${2}"
- bison_version_num="`expr ${1} \* 100 + ${2}`"
- if test $bison_version_num -ge $bison_version_min; then
- php_cv_bison_version="$bison_version (ok)"
- for bison_check_version in $bison_version_exclude; do
- if test "$bison_version" = "$bison_check_version"; then
- php_cv_bison_version=invalid
- break
- fi
- done
- fi
- fi
- ])
- fi
- case $php_cv_bison_version in
- ""|invalid[)]
- bison_msg="This bison version is not supported for regeneration of the Zend/PHP parsers (found: $bison_version, min: $bison_version_min, excluded: $bison_version_exclude)."
- AC_MSG_WARN([$bison_msg])
- YACC="exit 0;"
- ;;
- esac
-])
-
-AC_DEFUN([ZEND_FP_EXCEPT],[
- AC_CACHE_CHECK(whether fp_except is defined, ac_cv_type_fp_except,[
- 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
-])])
- if test "$ac_cv_type_fp_except" = "yes"; then
- AC_DEFINE(HAVE_FP_EXCEPT, 1, [whether floatingpoint.h defines fp_except])
- fi
-])
-
-dnl
-dnl Check for broken sprintf()
-dnl
-AC_DEFUN([AC_ZEND_BROKEN_SPRINTF],[
- AC_CACHE_CHECK(whether sprintf is broken, ac_cv_broken_sprintf,[
- 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
- ],[
- ac_cv_broken_sprintf=no
- ])
- ])
- if test "$ac_cv_broken_sprintf" = "yes"; then
- ac_result=1
- else
- ac_result=0
- fi
- AC_DEFINE_UNQUOTED(ZEND_BROKEN_SPRINTF, $ac_result, [Whether sprintf is broken])
-])
-
-dnl
-dnl AC_ZEND_C_BIGENDIAN
-dnl Replacement macro for AC_C_BIGENDIAN
-dnl
-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_RUN_IFELSE([AC_LANG_SOURCE([[
-int main(void)
-{
- short one = 1;
- char *cp = (char *)&one;
-
- if (*cp == 0) {
- return(0);
- } else {
- return(1);
- }
-}
- ]])], [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])
- fi
-])
-
-AC_DEFUN([AM_SET_LIBTOOL_VARIABLE],[
- LIBTOOL='$(SHELL) $(top_builddir)/libtool $1'
-])
-
-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_LINK_IFELSE([AC_LANG_PROGRAM([[
- #include <fpu_control.h>
- ]],[[
- fpu_control_t fpu_oldcw, fpu_cw;
- volatile double result;
- double a = 2877.0;
- volatile double b = 1000000.0;
-
- _FPU_GETCW(fpu_oldcw);
- fpu_cw = (fpu_oldcw & ~_FPU_EXTENDED & ~_FPU_SINGLE) | _FPU_DOUBLE;
- _FPU_SETCW(fpu_cw);
- result = a / b;
- _FPU_SETCW(fpu_oldcw);
- ]])],[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)
- else
- AC_MSG_RESULT(no)
- fi
-
- AC_MSG_CHECKING([for usable fpsetprec])
- AC_LINK_IFELSE([AC_LANG_PROGRAM([[
- #include <machine/ieeefp.h>
- ]],[[
- fp_prec_t fpu_oldprec;
- volatile double result;
- double a = 2877.0;
- volatile double b = 1000000.0;
-
- fpu_oldprec = fpgetprec();
- fpsetprec(FP_PD);
- result = a / b;
- fpsetprec(fpu_oldprec);
- ]])], [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)
- else
- AC_MSG_RESULT(no)
- fi
-
- AC_MSG_CHECKING([for usable _controlfp])
- AC_LINK_IFELSE([AC_LANG_PROGRAM([[
- #include <float.h>
- ]],[[
- unsigned int fpu_oldcw;
- volatile double result;
- double a = 2877.0;
- volatile double b = 1000000.0;
-
- fpu_oldcw = _controlfp(0, 0);
- _controlfp(_PC_53, _MCW_PC);
- result = a / b;
- _controlfp(fpu_oldcw, _MCW_PC);
- ]])], [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)
- else
- AC_MSG_RESULT(no)
- fi
-
- AC_MSG_CHECKING([for usable _controlfp_s])
- AC_LINK_IFELSE([AC_LANG_PROGRAM([[
- #include <float.h>
- ]],[[
- unsigned int fpu_oldcw, fpu_cw;
- volatile double result;
- double a = 2877.0;
- volatile double b = 1000000.0;
-
- _controlfp_s(&fpu_cw, 0, 0);
- fpu_oldcw = fpu_cw;
- _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])
- 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)
- else
- AC_MSG_RESULT(no)
- fi
-
- AC_MSG_CHECKING([whether FPU control word can be manipulated by inline assembler])
- AC_LINK_IFELSE([AC_LANG_PROGRAM([[
- /* nothing */
- ]],[[
- unsigned int oldcw, cw;
- volatile double result;
- double a = 2877.0;
- volatile double b = 1000000.0;
-
- __asm__ __volatile__ ("fnstcw %0" : "=m" (*&oldcw));
- cw = (oldcw & ~0x0 & ~0x300) | 0x200;
- __asm__ __volatile__ ("fldcw %0" : : "m" (*&cw));
-
- 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])
- 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)
- else
- AC_MSG_RESULT(no)
- fi
-])
diff --git a/Zend/bench.php b/Zend/bench.php
index a6c0c6daed..8f84d64ee2 100644
--- a/Zend/bench.php
+++ b/Zend/bench.php
@@ -1,6 +1,6 @@
<?php
if (function_exists("date_default_timezone_set")) {
- date_default_timezone_set("UTC");
+ date_default_timezone_set("UTC");
}
function simple() {
@@ -220,30 +220,30 @@ function heapsort_r($n, &$ra) {
$ir = $n;
while (1) {
- if ($l > 1) {
- $rra = $ra[--$l];
- } else {
- $rra = $ra[$ir];
- $ra[$ir] = $ra[1];
- if (--$ir == 1) {
- $ra[1] = $rra;
- return;
- }
- }
- $i = $l;
- $j = $l << 1;
- while ($j <= $ir) {
- if (($j < $ir) && ($ra[$j] < $ra[$j+1])) {
- $j++;
- }
- if ($rra < $ra[$j]) {
- $ra[$i] = $ra[$j];
- $j += ($i = $j);
- } else {
- $j = $ir + 1;
- }
- }
- $ra[$i] = $rra;
+ if ($l > 1) {
+ $rra = $ra[--$l];
+ } else {
+ $rra = $ra[$ir];
+ $ra[$ir] = $ra[1];
+ if (--$ir == 1) {
+ $ra[1] = $rra;
+ return;
+ }
+ }
+ $i = $l;
+ $j = $l << 1;
+ while ($j <= $ir) {
+ if (($j < $ir) && ($ra[$j] < $ra[$j+1])) {
+ $j++;
+ }
+ if ($rra < $ra[$j]) {
+ $ra[$i] = $ra[$j];
+ $j += ($i = $j);
+ } else {
+ $j = $ir + 1;
+ }
+ }
+ $ra[$i] = $rra;
}
}
@@ -268,9 +268,9 @@ function mkmatrix ($rows, $cols) {
$count = 1;
$mx = array();
for ($i=0; $i<$rows; $i++) {
- for ($j=0; $j<$cols; $j++) {
- $mx[$i][$j] = $count++;
- }
+ for ($j=0; $j<$cols; $j++) {
+ $mx[$i][$j] = $count++;
+ }
}
return($mx);
}
@@ -278,13 +278,13 @@ function mkmatrix ($rows, $cols) {
function mmult ($rows, $cols, $m1, $m2) {
$m3 = array();
for ($i=0; $i<$rows; $i++) {
- for ($j=0; $j<$cols; $j++) {
- $x = 0;
- for ($k=0; $k<$cols; $k++) {
- $x += $m1[$i][$k] * $m2[$k][$j];
- }
- $m3[$i][$j] = $x;
- }
+ for ($j=0; $j<$cols; $j++) {
+ $x = 0;
+ for ($k=0; $k<$cols; $k++) {
+ $x += $m1[$i][$k] * $m2[$k][$j];
+ }
+ $m3[$i][$j] = $x;
+ }
}
return($m3);
}
@@ -353,7 +353,7 @@ function gethrtime()
function start_test()
{
- ob_start();
+ ob_start();
return gethrtime();
}
@@ -367,7 +367,7 @@ function end_test($start, $name)
$pad = str_repeat(" ", 24-strlen($name)-strlen($num));
echo $name.$pad.$num."\n";
- ob_start();
+ ob_start();
return gethrtime();
}
diff --git a/Zend/build.mk b/Zend/build.mk
deleted file mode 100644
index ef14b65e65..0000000000
--- a/Zend/build.mk
+++ /dev/null
@@ -1,41 +0,0 @@
-# Makefile to generate build tools
-#
-# Standard usage:
-# make -f build.mk
-#
-# Written by Sascha Schumann
-
-
-LT_TARGETS = ltmain.sh ltconfig
-
-config_h_in = zend_config.h.in
-
-makefile_am_files = Makefile.am
-makefile_in_files = $(makefile_am_files:.am=.in)
-makefile_files = $(makefile_am_files:e.am=e)
-
-targets = $(makefile_in_files) $(LT_TARGETS) configure $(config_h_in)
-
-all: $(targets)
-
-clean:
- rm -f $(targets)
-
-$(LT_TARGETS):
- rm -f $(LT_TARGETS)
- libtoolize --automake $(AMFLAGS) -f
-
-$(makefile_in_files): $(makefile_am_files)
- automake -a -i $(AMFLAGS) $(makefile_files)
-
-aclocal.m4: configure.ac acinclude.m4
- aclocal
-
-$(config_h_in): configure.ac
-# explicitly remove target since autoheader does not seem to work
-# correctly otherwise (timestamps are not updated)
- @rm -f $@
- autoheader
-
-configure: aclocal.m4 configure.ac
- autoconf
diff --git a/Zend/buildconf b/Zend/buildconf
deleted file mode 100755
index b2e0a2958c..0000000000
--- a/Zend/buildconf
+++ /dev/null
@@ -1,32 +0,0 @@
-#!/bin/sh
-
-case "$1" in
---copy)
- automake_flags=--copy
- shift
-;;
-esac
-
-libtoolize --force --automake $automake_flags
-
-mv aclocal.m4 aclocal.m4.old 2>/dev/null
-aclocal
-if cmp aclocal.m4.old aclocal.m4 > /dev/null 2>&1; then
- echo "buildconf: keeping ${1}aclocal.m4"
- mv aclocal.m4.old aclocal.m4
-else
- echo "buildconf: created or modified ${1}aclocal.m4"
-fi
-
-autoheader
-
-automake --add-missing --include-deps $automake_flags
-
-mv configure configure.old 2>/dev/null
-autoconf
-if cmp configure.old configure > /dev/null 2>&1; then
- echo "buildconf: keeping ${1}configure"
- mv configure.old configure
-else
- echo "buildconf: created or modified ${1}configure"
-fi
diff --git a/Zend/configure.ac b/Zend/configure.ac
deleted file mode 100644
index 73a001a7df..0000000000
--- a/Zend/configure.ac
+++ /dev/null
@@ -1,133 +0,0 @@
-dnl Process this file with autoconf to produce a configure script.
-
-AC_INIT(zend.c)
-AM_INIT_AUTOMAKE(zend, 0.80A, nodefine)
-AM_CONFIG_HEADER(zend_config.h)
-AM_SANITY_CHECK
-AM_MAINTAINER_MODE
-AC_PROG_CC
-AM_PROG_CC_STDC
-ZEND_VERSION=$VERSION
-AC_ZEND_C_BIGENDIAN
-
-AH_TOP([
-#if defined(__GNUC__) && __GNUC__ >= 4
-# define ZEND_API __attribute__ ((visibility("default")))
-# define ZEND_DLEXPORT __attribute__ ((visibility("default")))
-#else
-# define ZEND_API
-# define ZEND_DLEXPORT
-#endif
-
-#define ZEND_DLIMPORT
-
-#undef uint
-#undef ulong
-])
-
-AH_BOTTOM([
-#ifndef ZEND_ACCONFIG_H_NO_C_PROTOS
-
-#ifdef HAVE_STDLIB_H
-# include <stdlib.h>
-#endif
-
-#ifdef HAVE_SYS_TYPES_H
-# include <sys/types.h>
-#endif
-
-#ifdef HAVE_SYS_SELECT_H
-#include <sys/select.h>
-#endif
-
-#ifdef HAVE_IEEEFP_H
-# include <ieeefp.h>
-#endif
-
-#ifdef HAVE_STRING_H
-# include <string.h>
-#else
-# include <strings.h>
-#endif
-
-#if ZEND_BROKEN_SPRINTF
-int zend_sprintf(char *buffer, const char *format, ...);
-#else
-# define zend_sprintf sprintf
-#endif
-
-#include <math.h>
-
-#ifndef zend_isnan
-#if HAVE_DECL_ISNAN && (!defined(__cplusplus) || __cplusplus < 201103L)
-#define zend_isnan(a) isnan(a)
-#elif defined(HAVE_FPCLASS)
-#define zend_isnan(a) ((fpclass(a) == FP_SNAN) || (fpclass(a) == FP_QNAN))
-#else
-#define zend_isnan(a) ((a) != (a))
-#endif
-#endif
-
-#if HAVE_DECL_ISINF && (!defined(__cplusplus) || __cplusplus < 201103L)
-#define zend_isinf(a) isinf(a)
-#elif defined(INFINITY)
-/* Might not work, but is required by ISO C99 */
-#define zend_isinf(a) (((a)==INFINITY || (a)==-INFINITY)?1:0)
-#elif defined(HAVE_FPCLASS)
-#define zend_isinf(a) ((fpclass(a) == FP_PINF) || (fpclass(a) == FP_NINF))
-#else
-#define zend_isinf(a) 0
-#endif
-
-#if HAVE_DECL_ISFINITE && (!defined(__cplusplus) || __cplusplus < 201103L)
-#define zend_finite(a) isfinite(a)
-#elif defined(HAVE_FINITE)
-#define zend_finite(a) finite(a)
-#elif defined(fpclassify)
-#define zend_finite(a) ((fpclassify((a))!=FP_INFINITE&&fpclassify((a))!=FP_NAN)?1:0)
-#else
-#define zend_finite(a) (zend_isnan(a) ? 0 : zend_isinf(a) ? 0 : 1)
-#endif
-
-#endif /* ifndef ZEND_ACCONFIG_H_NO_C_PROTOS */
-
-])
-
-dnl We want this one before the checks, so the checks can modify CFLAGS.
-test -z "$CFLAGS" && auto_cflags=1
-
-AC_CHECK_SIZEOF(long, 8)
-AC_CHECK_SIZEOF(int, 4)
-
-sinclude(Zend.m4)
-
-LIBZEND_BASIC_CHECKS
-LIBZEND_LIBDL_CHECKS
-LIBZEND_DLSYM_CHECK
-
-AM_PROG_LIBTOOL
-if test "$enable_debug" != "yes"; then
- AM_SET_LIBTOOL_VARIABLE([--silent])
-fi
-
-dnl
-dnl Check for /usr/pkg/{lib,include} which is where NetBSD puts binary
-dnl and source packages. This should be harmless on other OSs.
-dnl
-if test -d /usr/pkg/include -a -d /usr/pkg/lib ; then
- CFLAGS="$CFLAGS -I/usr/pkg/include"
- LDFLAGS="$LDFLAGS -L/usr/pkg/lib"
-fi
-
-LIBZEND_ENABLE_DEBUG
-LIBZEND_OTHER_CHECKS
-
-ZEND_EXTRA_LIBS="$LIBS"
-LIBS=""
-AC_SUBST(ZEND_EXTRA_LIBS)
-AC_CONFIG_FILES([Makefile])
-AC_OUTPUT
-
-# Local Variables:
-# tab-width: 4
-# End:
diff --git a/Zend/micro_bench.php b/Zend/micro_bench.php
index 42f1110c88..96ced487e1 100644
--- a/Zend/micro_bench.php
+++ b/Zend/micro_bench.php
@@ -22,220 +22,220 @@ function simpleicall($n) {
}
class Foo {
- static $a = 0;
- public $b = 0;
- const TEST = 0;
-
- static function read_static($n) {
- for ($i = 0; $i < $n; ++$i) {
- $x = self::$a;
- }
- }
-
- static function write_static($n) {
- for ($i = 0; $i < $n; ++$i) {
- self::$a = 0;
- }
- }
-
- static function isset_static($n) {
- for ($i = 0; $i < $n; ++$i) {
- $x = isset(self::$a);
- }
- }
-
- static function empty_static($n) {
- for ($i = 0; $i < $n; ++$i) {
- $x = empty(self::$a);
- }
- }
-
- static function f() {
- }
-
- static function call_static($n) {
- for ($i = 0; $i < $n; ++$i) {
- self::f();
- }
- }
-
- function read_prop($n) {
- for ($i = 0; $i < $n; ++$i) {
- $x = $this->b;
- }
- }
-
- function write_prop($n) {
- for ($i = 0; $i < $n; ++$i) {
- $this->b = 0;
- }
- }
-
- function assign_add_prop($n) {
- for ($i = 0; $i < $n; ++$i) {
- $this->b += 2;
- }
- }
-
- function pre_inc_prop($n) {
- for ($i = 0; $i < $n; ++$i) {
- ++$this->b;
- }
- }
-
- function pre_dec_prop($n) {
- for ($i = 0; $i < $n; ++$i) {
- --$this->b;
- }
- }
-
- function post_inc_prop($n) {
- for ($i = 0; $i < $n; ++$i) {
- $this->b++;
- }
- }
-
- function post_dec_prop($n) {
- for ($i = 0; $i < $n; ++$i) {
- $this->b--;
- }
- }
-
- function isset_prop($n) {
- for ($i = 0; $i < $n; ++$i) {
- $x = isset($this->b);
- }
- }
-
- function empty_prop($n) {
- for ($i = 0; $i < $n; ++$i) {
- $x = empty($this->b);
- }
- }
-
- function g() {
- }
-
- function call($n) {
- for ($i = 0; $i < $n; ++$i) {
- $this->g();
- }
- }
-
- function read_const($n) {
- for ($i = 0; $i < $n; ++$i) {
- $x = $this::TEST;
- }
- }
+ static $a = 0;
+ public $b = 0;
+ const TEST = 0;
+
+ static function read_static($n) {
+ for ($i = 0; $i < $n; ++$i) {
+ $x = self::$a;
+ }
+ }
+
+ static function write_static($n) {
+ for ($i = 0; $i < $n; ++$i) {
+ self::$a = 0;
+ }
+ }
+
+ static function isset_static($n) {
+ for ($i = 0; $i < $n; ++$i) {
+ $x = isset(self::$a);
+ }
+ }
+
+ static function empty_static($n) {
+ for ($i = 0; $i < $n; ++$i) {
+ $x = empty(self::$a);
+ }
+ }
+
+ static function f() {
+ }
+
+ static function call_static($n) {
+ for ($i = 0; $i < $n; ++$i) {
+ self::f();
+ }
+ }
+
+ function read_prop($n) {
+ for ($i = 0; $i < $n; ++$i) {
+ $x = $this->b;
+ }
+ }
+
+ function write_prop($n) {
+ for ($i = 0; $i < $n; ++$i) {
+ $this->b = 0;
+ }
+ }
+
+ function assign_add_prop($n) {
+ for ($i = 0; $i < $n; ++$i) {
+ $this->b += 2;
+ }
+ }
+
+ function pre_inc_prop($n) {
+ for ($i = 0; $i < $n; ++$i) {
+ ++$this->b;
+ }
+ }
+
+ function pre_dec_prop($n) {
+ for ($i = 0; $i < $n; ++$i) {
+ --$this->b;
+ }
+ }
+
+ function post_inc_prop($n) {
+ for ($i = 0; $i < $n; ++$i) {
+ $this->b++;
+ }
+ }
+
+ function post_dec_prop($n) {
+ for ($i = 0; $i < $n; ++$i) {
+ $this->b--;
+ }
+ }
+
+ function isset_prop($n) {
+ for ($i = 0; $i < $n; ++$i) {
+ $x = isset($this->b);
+ }
+ }
+
+ function empty_prop($n) {
+ for ($i = 0; $i < $n; ++$i) {
+ $x = empty($this->b);
+ }
+ }
+
+ function g() {
+ }
+
+ function call($n) {
+ for ($i = 0; $i < $n; ++$i) {
+ $this->g();
+ }
+ }
+
+ function read_const($n) {
+ for ($i = 0; $i < $n; ++$i) {
+ $x = $this::TEST;
+ }
+ }
}
function read_static($n) {
- for ($i = 0; $i < $n; ++$i) {
- $x = Foo::$a;
- }
+ for ($i = 0; $i < $n; ++$i) {
+ $x = Foo::$a;
+ }
}
function write_static($n) {
- for ($i = 0; $i < $n; ++$i) {
- Foo::$a = 0;
- }
+ for ($i = 0; $i < $n; ++$i) {
+ Foo::$a = 0;
+ }
}
function isset_static($n) {
- for ($i = 0; $i < $n; ++$i) {
- $x = isset(Foo::$a);
- }
+ for ($i = 0; $i < $n; ++$i) {
+ $x = isset(Foo::$a);
+ }
}
function empty_static($n) {
- for ($i = 0; $i < $n; ++$i) {
- $x = empty(Foo::$a);
- }
+ for ($i = 0; $i < $n; ++$i) {
+ $x = empty(Foo::$a);
+ }
}
function call_static($n) {
- for ($i = 0; $i < $n; ++$i) {
- Foo::f();
- }
+ for ($i = 0; $i < $n; ++$i) {
+ Foo::f();
+ }
}
function create_object($n) {
- for ($i = 0; $i < $n; ++$i) {
- $x = new Foo();
- }
+ for ($i = 0; $i < $n; ++$i) {
+ $x = new Foo();
+ }
}
define('TEST', null);
function read_const($n) {
- for ($i = 0; $i < $n; ++$i) {
- $x = TEST;
- }
+ for ($i = 0; $i < $n; ++$i) {
+ $x = TEST;
+ }
}
function read_auto_global($n) {
- for ($i = 0; $i < $n; ++$i) {
- $x = $_GET;
- }
+ for ($i = 0; $i < $n; ++$i) {
+ $x = $_GET;
+ }
}
$g_var = 0;
function read_global_var($n) {
- for ($i = 0; $i < $n; ++$i) {
- $x = $GLOBALS['g_var'];
- }
+ for ($i = 0; $i < $n; ++$i) {
+ $x = $GLOBALS['g_var'];
+ }
}
function read_hash($n) {
- $hash = array('test' => 0);
- for ($i = 0; $i < $n; ++$i) {
- $x = $hash['test'];
- }
+ $hash = array('test' => 0);
+ for ($i = 0; $i < $n; ++$i) {
+ $x = $hash['test'];
+ }
}
function read_str_offset($n) {
- $str = "test";
- for ($i = 0; $i < $n; ++$i) {
- $x = $str[1];
- }
+ $str = "test";
+ for ($i = 0; $i < $n; ++$i) {
+ $x = $str[1];
+ }
}
function issetor($n) {
- $val = array(0,1,2,3,4,5,6,7,8,9);
- for ($i = 0; $i < $n; ++$i) {
- $x = $val ?: null;
- }
+ $val = array(0,1,2,3,4,5,6,7,8,9);
+ for ($i = 0; $i < $n; ++$i) {
+ $x = $val ?: null;
+ }
}
function issetor2($n) {
- $f = false; $j = 0;
- for ($i = 0; $i < $n; ++$i) {
- $x = $f ?: $j + 1;
- }
+ $f = false; $j = 0;
+ for ($i = 0; $i < $n; ++$i) {
+ $x = $f ?: $j + 1;
+ }
}
function ternary($n) {
- $val = array(0,1,2,3,4,5,6,7,8,9);
- $f = false;
- for ($i = 0; $i < $n; ++$i) {
- $x = $f ? null : $val;
- }
+ $val = array(0,1,2,3,4,5,6,7,8,9);
+ $f = false;
+ for ($i = 0; $i < $n; ++$i) {
+ $x = $f ? null : $val;
+ }
}
function ternary2($n) {
- $f = false; $j = 0;
- for ($i = 0; $i < $n; ++$i) {
- $x = $f ? $f : $j + 1;
- }
+ $f = false; $j = 0;
+ for ($i = 0; $i < $n; ++$i) {
+ $x = $f ? $f : $j + 1;
+ }
}
/*****/
function empty_loop($n) {
- for ($i = 0; $i < $n; ++$i) {
- }
+ for ($i = 0; $i < $n; ++$i) {
+ }
}
function gethrtime()
diff --git a/Zend/tests/014.phpt b/Zend/tests/014.phpt
index 18037a99e3..a2c5335923 100644
--- a/Zend/tests/014.phpt
+++ b/Zend/tests/014.phpt
@@ -5,17 +5,17 @@ get_included_files() tests
var_dump(get_included_files());
-include(dirname(__FILE__)."/014.inc");
+include(__DIR__."/014.inc");
var_dump(get_included_files());
var_dump(get_included_files(1,1));
-include_once(dirname(__FILE__)."/014.inc");
+include_once(__DIR__."/014.inc");
var_dump(get_included_files());
var_dump(get_included_files(1));
-include(dirname(__FILE__)."/014.inc");
+include(__DIR__."/014.inc");
var_dump(get_included_files());
echo "Done\n";
diff --git a/Zend/tests/019.phpt b/Zend/tests/019.phpt
index e3f64885d4..cde590734f 100644
--- a/Zend/tests/019.phpt
+++ b/Zend/tests/019.phpt
@@ -149,9 +149,9 @@ foreach ($array_variables as $array_var) {
var_dump( empty($array_var) ); // expected: bool(true)
}
-echo "\n*** Testing unset(), emtpy() & isset() with resource variables ***\n";
+echo "\n*** Testing unset(), empty() & isset() with resource variables ***\n";
$fp = fopen(__FILE__, "r");
-$dfp = opendir( dirname(__FILE__) );
+$dfp = opendir( __DIR__ );
$resources = array (
$fp,
$dfp
@@ -1184,7 +1184,7 @@ bool(false)
bool(false)
bool(true)
-*** Testing unset(), emtpy() & isset() with resource variables ***
+*** Testing unset(), empty() & isset() with resource variables ***
-- Iteration 1 --
resource(%d) of type (stream)
bool(true)
diff --git a/Zend/tests/024.phpt b/Zend/tests/024.phpt
index 34dac0f1e3..9e647d4231 100644
--- a/Zend/tests/024.phpt
+++ b/Zend/tests/024.phpt
@@ -16,19 +16,23 @@ var_dump($a->$b->{$c[1]});
?>
--EXPECTF--
Notice: Undefined variable: a in %s on line %d
+
+Notice: Trying to access array offset on value of type null in %s on line %d
NULL
-Notice: Undefined variable: %s in %s on line %d
+Notice: Undefined variable: a in %s on line %d
+
+Notice: Undefined variable: c in %s on line %d
-Notice: Undefined variable: %s in %s on line %d
+Notice: Trying to access array offset on value of type null in %s on line %d
NULL
Notice: Undefined variable: a in %s on line %d
int(1)
-Notice: Undefined variable: %s in %s on line %d
+Notice: Undefined variable: a in %s on line %d
-Notice: Undefined variable: %s in %s on line %d
+Notice: Undefined variable: b in %s on line %d
int(0)
Notice: Undefined variable: a in %s on line %d
@@ -45,6 +49,8 @@ NULL
Notice: Undefined variable: c in %s on line %d
+Notice: Trying to access array offset on value of type null in %s on line %d
+
Notice: Trying to get property '1' of non-object in %s on line %d
Notice: Trying to get property '' of non-object in %s on line %d
diff --git a/Zend/tests/033.phpt b/Zend/tests/033.phpt
index a76a322ccf..1e7fca1e0d 100644
--- a/Zend/tests/033.phpt
+++ b/Zend/tests/033.phpt
@@ -19,10 +19,40 @@ $arr[][]->bar = 2;
--EXPECTF--
Notice: Undefined variable: arr in %s on line %d
+Notice: Trying to access array offset on value of type null in %s on line %d
+
+Notice: Trying to access array offset on value of type null in %s on line %d
+
+Notice: Trying to access array offset on value of type null in %s on line %d
+
+Notice: Trying to access array offset on value of type null in %s on line %d
+
+Notice: Trying to access array offset on value of type null in %s on line %d
+
Notice: Undefined variable: arr in %s on line %d
+Notice: Trying to access array offset on value of type null in %s on line %d
+
+Notice: Trying to access array offset on value of type null in %s on line %d
+
+Notice: Trying to access array offset on value of type null in %s on line %d
+
+Notice: Trying to access array offset on value of type null in %s on line %d
+
+Notice: Trying to access array offset on value of type null in %s on line %d
+
Notice: Undefined variable: arr in %s on line %d
+Notice: Trying to access array offset on value of type null in %s on line %d
+
+Notice: Trying to access array offset on value of type null in %s on line %d
+
+Notice: Trying to access array offset on value of type null in %s on line %d
+
+Notice: Trying to access array offset on value of type null in %s on line %d
+
+Notice: Trying to access array offset on value of type null in %s on line %d
+
Notice: Trying to get property 'foo' of non-object in %s on line %d
Warning: Creating default object from empty value in %s on line %d
diff --git a/Zend/tests/036.phpt b/Zend/tests/036.phpt
index 6feb23f679..3ff522b16f 100644
--- a/Zend/tests/036.phpt
+++ b/Zend/tests/036.phpt
@@ -8,6 +8,9 @@ $a{function() { }} = 1;
?>
--EXPECTF--
+
+Deprecated: Array and string offset access syntax with curly braces is deprecated in %s line %d
+
Warning: Illegal offset type in %s on line %d
Warning: Illegal offset type in %s on line %d
diff --git a/Zend/tests/67468.phpt b/Zend/tests/67468.phpt
index 767217644a..691acd90db 100644
--- a/Zend/tests/67468.phpt
+++ b/Zend/tests/67468.phpt
@@ -1,7 +1,5 @@
--TEST--
Bug #67468 (Segfault in highlight_file()/highlight_string())
---SKIPIF--
-<?php if(!function_exists("leak")) print "skip only for debug builds"; ?>
--FILE--
<?php
highlight_string("<?php __CLASS__;", true);
diff --git a/Zend/tests/arg_unpack/many_args.phpt b/Zend/tests/arg_unpack/many_args.phpt
index 0ef5a30d6d..e1609d8e1e 100644
--- a/Zend/tests/arg_unpack/many_args.phpt
+++ b/Zend/tests/arg_unpack/many_args.phpt
@@ -3,12 +3,12 @@ Argument unpacking with many arguments
--FILE--
<?php
-function fn(...$args) {
+function f(...$args) {
var_dump(count($args));
}
$array = array_fill(0, 10000, 42);
-fn(...$array, ...$array);
+f(...$array, ...$array);
?>
--EXPECT--
diff --git a/Zend/tests/array_unpack/already_occupied.phpt b/Zend/tests/array_unpack/already_occupied.phpt
new file mode 100644
index 0000000000..27a18b6ced
--- /dev/null
+++ b/Zend/tests/array_unpack/already_occupied.phpt
@@ -0,0 +1,41 @@
+--TEST--
+Appending to an array via unpack may fail
+--SKIPIF--
+<?php if (PHP_INT_SIZE != 8) die("skip 64bit only"); ?>
+--FILE--
+<?php
+
+$arr = [1, 2, 3];
+var_dump([PHP_INT_MAX-1 => 0, ...$arr]);
+
+var_dump([PHP_INT_MAX-1 => 0, ...[1, 2, 3]]);
+
+const ARR = [1, 2, 3];
+const ARR2 = [PHP_INT_MAX-1 => 0, ...ARR];
+var_dump(ARR2);
+
+?>
+--EXPECTF--
+Warning: Cannot add element to the array as the next element is already occupied in %s on line %d
+array(2) {
+ [9223372036854775806]=>
+ int(0)
+ [9223372036854775807]=>
+ int(1)
+}
+
+Warning: Cannot add element to the array as the next element is already occupied in %s on line %d
+array(2) {
+ [9223372036854775806]=>
+ int(0)
+ [9223372036854775807]=>
+ int(1)
+}
+
+Warning: Cannot add element to the array as the next element is already occupied in %s on line %d
+array(2) {
+ [9223372036854775806]=>
+ int(0)
+ [9223372036854775807]=>
+ int(1)
+}
diff --git a/Zend/tests/array_unpack/basic.phpt b/Zend/tests/array_unpack/basic.phpt
new file mode 100644
index 0000000000..3363c487ec
--- /dev/null
+++ b/Zend/tests/array_unpack/basic.phpt
@@ -0,0 +1,119 @@
+--TEST--
+Basic array unpacking
+--FILE--
+<?php
+$array = [1, 2, 3];
+
+function getArr() {
+ return [4, 5];
+}
+
+function arrGen() {
+ for($i = 11; $i < 15; $i++) {
+ yield $i;
+ }
+}
+
+var_dump([...[]]);
+var_dump([...[1, 2, 3]]);
+var_dump([...$array]);
+var_dump([...getArr()]);
+var_dump([...arrGen()]);
+var_dump([...new ArrayIterator(['a', 'b', 'c'])]);
+
+var_dump([0, ...$array, ...getArr(), 6, 7, 8, 9, 10, ...arrGen()]);
+var_dump([0, ...$array, ...$array, 'end']);
+
+--EXPECT--
+array(0) {
+}
+array(3) {
+ [0]=>
+ int(1)
+ [1]=>
+ int(2)
+ [2]=>
+ int(3)
+}
+array(3) {
+ [0]=>
+ int(1)
+ [1]=>
+ int(2)
+ [2]=>
+ int(3)
+}
+array(2) {
+ [0]=>
+ int(4)
+ [1]=>
+ int(5)
+}
+array(4) {
+ [0]=>
+ int(11)
+ [1]=>
+ int(12)
+ [2]=>
+ int(13)
+ [3]=>
+ int(14)
+}
+array(3) {
+ [0]=>
+ string(1) "a"
+ [1]=>
+ string(1) "b"
+ [2]=>
+ string(1) "c"
+}
+array(15) {
+ [0]=>
+ int(0)
+ [1]=>
+ int(1)
+ [2]=>
+ int(2)
+ [3]=>
+ int(3)
+ [4]=>
+ int(4)
+ [5]=>
+ int(5)
+ [6]=>
+ int(6)
+ [7]=>
+ int(7)
+ [8]=>
+ int(8)
+ [9]=>
+ int(9)
+ [10]=>
+ int(10)
+ [11]=>
+ int(11)
+ [12]=>
+ int(12)
+ [13]=>
+ int(13)
+ [14]=>
+ int(14)
+}
+array(8) {
+ [0]=>
+ int(0)
+ [1]=>
+ int(1)
+ [2]=>
+ int(2)
+ [3]=>
+ int(3)
+ [4]=>
+ int(1)
+ [5]=>
+ int(2)
+ [6]=>
+ int(3)
+ [7]=>
+ string(3) "end"
+}
diff --git a/Zend/tests/array_unpack/classes.phpt b/Zend/tests/array_unpack/classes.phpt
new file mode 100644
index 0000000000..573c5f1c32
--- /dev/null
+++ b/Zend/tests/array_unpack/classes.phpt
@@ -0,0 +1,46 @@
+--TEST--
+Array unpacking with classes
+--FILE--
+<?php
+
+class C {
+ public const FOO = [0, ...self::ARR, 4];
+ public const ARR = [1, 2, 3];
+ public static $bar = [...self::ARR];
+}
+
+class D {
+ public const A = [...self::B];
+ public const B = [...self::A];
+}
+
+var_dump(C::FOO);
+var_dump(C::$bar);
+
+try {
+ var_dump(D::A);
+} catch (Error $ex) {
+ echo "Exception: " . $ex->getMessage() . "\n";
+}
+--EXPECT--
+array(5) {
+ [0]=>
+ int(0)
+ [1]=>
+ int(1)
+ [2]=>
+ int(2)
+ [3]=>
+ int(3)
+ [4]=>
+ int(4)
+}
+array(3) {
+ [0]=>
+ int(1)
+ [1]=>
+ int(2)
+ [2]=>
+ int(3)
+}
+Exception: Cannot declare self-referencing constant 'self::B'
diff --git a/Zend/tests/array_unpack/in_destructuring.phpt b/Zend/tests/array_unpack/in_destructuring.phpt
new file mode 100644
index 0000000000..fed2826d29
--- /dev/null
+++ b/Zend/tests/array_unpack/in_destructuring.phpt
@@ -0,0 +1,10 @@
+--TEST--
+Spread operator is not supported in destructuring assignments
+--FILE--
+<?php
+
+[$head, ...$tail] = [1, 2, 3];
+
+?>
+--EXPECTF--
+Fatal error: Spread operator is not supported in assignments in %s on line %d
diff --git a/Zend/tests/array_unpack/non_integer_keys.phpt b/Zend/tests/array_unpack/non_integer_keys.phpt
new file mode 100644
index 0000000000..5c93102907
--- /dev/null
+++ b/Zend/tests/array_unpack/non_integer_keys.phpt
@@ -0,0 +1,17 @@
+--TEST--
+Array unpacking does not work with non-integer keys
+--FILE--
+<?php
+function gen() {
+ yield [] => 1;
+ yield 1.23 => 123;
+}
+
+try {
+ [...gen()];
+} catch (Error $ex) {
+ echo "Exception: " . $ex->getMessage() . "\n";
+}
+
+--EXPECT--
+Exception: Cannot unpack Traversable with non-integer keys
diff --git a/Zend/tests/array_unpack/ref1.phpt b/Zend/tests/array_unpack/ref1.phpt
new file mode 100644
index 0000000000..a43e2fa09f
--- /dev/null
+++ b/Zend/tests/array_unpack/ref1.phpt
@@ -0,0 +1,17 @@
+--TEST--
+Array unpacking with element rc=1
+--FILE--
+<?php
+
+$a = 1;
+$b = [&$a]; //array (0 => (refcount=2, is_ref=1)=1)
+
+unset($a); //array (0 => (refcount=1, is_ref=1)=1)
+
+var_dump([...$b]); //array (0 => (refcount=0, is_ref=0)=1)
+
+--EXPECT--
+array(1) {
+ [0]=>
+ int(1)
+}
diff --git a/Zend/tests/array_unpack/string_keys.phpt b/Zend/tests/array_unpack/string_keys.phpt
new file mode 100644
index 0000000000..6032d7cc3f
--- /dev/null
+++ b/Zend/tests/array_unpack/string_keys.phpt
@@ -0,0 +1,21 @@
+--TEST--
+array unpacking with string keys (not supported)
+--FILE--
+<?php
+
+try {
+ $array = [1, 2, "foo" => 3, 4];
+ var_dump([...$array]);
+} catch (Error $ex) {
+ var_dump($ex->getMessage());
+}
+try {
+ $iterator = new ArrayIterator([1, 2, "foo" => 3, 4]);
+ var_dump([...$iterator]);
+} catch (Error $ex) {
+ var_dump($ex->getMessage());
+}
+
+--EXPECT--
+string(36) "Cannot unpack array with string keys"
+string(42) "Cannot unpack Traversable with string keys"
diff --git a/Zend/tests/array_unpack/undef_var.phpt b/Zend/tests/array_unpack/undef_var.phpt
new file mode 100644
index 0000000000..fff1f6171e
--- /dev/null
+++ b/Zend/tests/array_unpack/undef_var.phpt
@@ -0,0 +1,14 @@
+--TEST--
+array unpacking with undefinded variable
+--FILE--
+<?php
+
+var_dump([...$arr]);
+
+--EXPECTF--
+Notice: Undefined variable: arr in %s on line %d
+
+Fatal error: Uncaught Error: Only arrays and Traversables can be unpacked in %s:%d
+Stack trace:
+#0 {main}
+ thrown in %s on line %d \ No newline at end of file
diff --git a/Zend/tests/array_unpack/unpack_invalid_type_compile_time.phpt b/Zend/tests/array_unpack/unpack_invalid_type_compile_time.phpt
new file mode 100644
index 0000000000..19297430a5
--- /dev/null
+++ b/Zend/tests/array_unpack/unpack_invalid_type_compile_time.phpt
@@ -0,0 +1,10 @@
+--TEST--
+Unpacking non-array/Traversable detected at compile-time
+--FILE--
+<?php
+
+var_dump([...42]);
+
+?>
+--EXPECTF--
+Fatal error: Only arrays and Traversables can be unpacked in %s on line %d
diff --git a/Zend/tests/array_unpack/unpack_string_keys_compile_time.phpt b/Zend/tests/array_unpack/unpack_string_keys_compile_time.phpt
new file mode 100644
index 0000000000..1401fb9bd5
--- /dev/null
+++ b/Zend/tests/array_unpack/unpack_string_keys_compile_time.phpt
@@ -0,0 +1,10 @@
+--TEST--
+Unpacking of string keys detected at compile-time
+--FILE--
+<?php
+
+var_dump([...['a' => 'b']]);
+
+?>
+--EXPECTF--
+Fatal error: Cannot unpack array with string keys in %s on line %d
diff --git a/Zend/tests/array_unpack_string_keys.phpt b/Zend/tests/array_unpack_string_keys.phpt
new file mode 100644
index 0000000000..ce84a8e21d
--- /dev/null
+++ b/Zend/tests/array_unpack_string_keys.phpt
@@ -0,0 +1,20 @@
+--TEST--
+Using array unpacking in an array literal that also has string keys (OSS-Fuzz #17965)
+--FILE--
+<?php
+$y = [1, 2, 3];
+$z = "bar";
+$x = [...$y, "foo" => $z];
+var_dump($x);
+?>
+--EXPECT--
+array(4) {
+ [0]=>
+ int(1)
+ [1]=>
+ int(2)
+ [2]=>
+ int(3)
+ ["foo"]=>
+ string(3) "bar"
+}
diff --git a/Zend/tests/arrow_functions/001.phpt b/Zend/tests/arrow_functions/001.phpt
new file mode 100644
index 0000000000..27b2557b99
--- /dev/null
+++ b/Zend/tests/arrow_functions/001.phpt
@@ -0,0 +1,45 @@
+--TEST--
+Basic arrow function functionality check
+--FILE--
+<?php
+
+$foo = fn() => 1;
+var_dump($foo());
+
+$foo = fn($x) => $x;
+var_dump($foo(2));
+
+$foo = fn($x, $y) => $x + $y;
+var_dump($foo(1, 2));
+
+// Closing over $var
+$var = 4;
+$foo = fn() => $var;
+var_dump($foo());
+
+// Not closing over $var, it's a parameter
+$foo = fn($var) => $var;
+var_dump($foo(5));
+
+// Close over $var by-value, not by-reference
+$var = 5;
+$foo = fn() => ++$var;
+var_dump($foo());
+var_dump($var);
+
+// Nested arrow functions closing over variable
+$var = 6;
+var_dump((fn() => fn() => $var)()());
+var_dump((fn() => function() use($var) { return $var; })()());
+
+?>
+--EXPECT--
+int(1)
+int(2)
+int(3)
+int(4)
+int(5)
+int(6)
+int(5)
+int(6)
+int(6)
diff --git a/Zend/tests/arrow_functions/002.phpt b/Zend/tests/arrow_functions/002.phpt
new file mode 100644
index 0000000000..52c8020c19
--- /dev/null
+++ b/Zend/tests/arrow_functions/002.phpt
@@ -0,0 +1,13 @@
+--TEST--
+Arrow functions implicit use must be throwing notices only upon actual use
+--FILE--
+<?php
+
+$b = 1;
+
+var_dump((fn() => $b + $c)());
+
+?>
+--EXPECTF--
+Notice: Undefined variable: c in %s on line %d
+int(1)
diff --git a/Zend/tests/arrow_functions/003.phpt b/Zend/tests/arrow_functions/003.phpt
new file mode 100644
index 0000000000..5e77743fad
--- /dev/null
+++ b/Zend/tests/arrow_functions/003.phpt
@@ -0,0 +1,21 @@
+--TEST--
+Variable-variables inside arrow functions
+--FILE--
+<?php
+
+$a = 1;
+$var = "a";
+$fn = fn() => $$var;
+var_dump($fn());
+
+${5} = 2;
+$fn = fn() => ${5};
+var_dump($fn());
+
+?>
+--EXPECTF--
+Notice: Undefined variable: a in %s on line %d
+NULL
+
+Notice: Undefined variable: 5 in %s on line %d
+NULL
diff --git a/Zend/tests/arrow_functions/004.phpt b/Zend/tests/arrow_functions/004.phpt
new file mode 100644
index 0000000000..51467dae1d
--- /dev/null
+++ b/Zend/tests/arrow_functions/004.phpt
@@ -0,0 +1,13 @@
+--TEST--
+Auto-globals in arrow functions
+--FILE--
+<?php
+
+// This should work, but *not* generate a binding for $GLOBALS
+$a = 123;
+$fn = fn() => $GLOBALS['a'];
+var_dump($fn());
+
+?>
+--EXPECT--
+int(123)
diff --git a/Zend/tests/arrow_functions/005.phpt b/Zend/tests/arrow_functions/005.phpt
new file mode 100644
index 0000000000..7371be57bb
--- /dev/null
+++ b/Zend/tests/arrow_functions/005.phpt
@@ -0,0 +1,54 @@
+--TEST--
+Arrow function $this binding
+--FILE--
+<?php
+
+class Test {
+ public function method() {
+ // It would be okay if this is NULL, but the rest should work
+ $fn = fn() => 42;
+ $r = new ReflectionFunction($fn);
+ var_dump($r->getClosureThis());
+
+ $fn = fn() => $this;
+ var_dump($fn());
+
+ $fn = fn() => Test::method2();
+ $fn();
+
+ $fn = fn() => call_user_func('Test::method2');
+ $fn();
+
+ $thisName = "this";
+ $fn = fn() => $$thisName;
+ var_dump($fn());
+
+ $fn = fn() => self::class;
+ var_dump($fn());
+
+ // static can be used to unbind $this
+ $fn = static fn() => isset($this);
+ var_dump($fn());
+ }
+
+ public function method2() {
+ var_dump($this);
+ }
+}
+
+(new Test)->method();
+
+?>
+--EXPECT--
+object(Test)#1 (0) {
+}
+object(Test)#1 (0) {
+}
+object(Test)#1 (0) {
+}
+object(Test)#1 (0) {
+}
+object(Test)#1 (0) {
+}
+string(4) "Test"
+bool(false)
diff --git a/Zend/tests/arrow_functions/006.phpt b/Zend/tests/arrow_functions/006.phpt
new file mode 100644
index 0000000000..16427146a8
--- /dev/null
+++ b/Zend/tests/arrow_functions/006.phpt
@@ -0,0 +1,44 @@
+--TEST--
+Arrow functions syntax variations
+--FILE--
+<?php
+
+// By-reference argument and return
+$var = 1;
+$id = fn&(&$x) => $x;
+$ref =& $id($var);
+$ref++;
+var_dump($var);
+
+// int argument and return type
+$var = 10;
+$int_fn = fn(int $x): int => $x;
+var_dump($int_fn($var));
+try {
+ $int_fn("foo");
+} catch (TypeError $e) {
+ echo $e->getMessage(), "\n";
+}
+
+$varargs = fn(?int... $args): array => $args;
+var_dump($varargs(20, null, 30));
+try {
+ $varargs(40, "foo");
+} catch (TypeError $e) {
+ echo $e->getMessage(), "\n";
+}
+
+?>
+--EXPECTF--
+int(2)
+int(10)
+Argument 1 passed to {closure}() must be of the type int, string given, called in %s on line %d
+array(3) {
+ [0]=>
+ int(20)
+ [1]=>
+ NULL
+ [2]=>
+ int(30)
+}
+Argument 2 passed to {closure}() must be of the type int or null, string given, called in %s on line %d
diff --git a/Zend/tests/arrow_functions/007.phpt b/Zend/tests/arrow_functions/007.phpt
new file mode 100644
index 0000000000..0fcc4930d1
--- /dev/null
+++ b/Zend/tests/arrow_functions/007.phpt
@@ -0,0 +1,14 @@
+--TEST--
+Pretty printing for arrow functions
+--FILE--
+<?php
+
+// TODO We're missing parentheses for the direct call
+assert((fn() => false)());
+assert((fn&(int... $args): ?bool => $args[0])(false));
+
+?>
+--EXPECTF--
+Warning: assert(): assert(fn() => false()) failed in %s on line %d
+
+Warning: assert(): assert(fn&(int ...$args): ?bool => $args[0](false)) failed in %s on line %d
diff --git a/Zend/tests/arrow_functions/008.phpt b/Zend/tests/arrow_functions/008.phpt
new file mode 100644
index 0000000000..df3fe5dba7
--- /dev/null
+++ b/Zend/tests/arrow_functions/008.phpt
@@ -0,0 +1,28 @@
+--TEST--
+Yield inside arrow functions
+--FILE--
+<?php
+
+// This doesn't make terribly much sense, but it works...
+
+$fn = fn() => yield 123;
+foreach ($fn() as $val) {
+ var_dump($val);
+}
+
+$fn = fn() => yield from [456, 789];
+foreach ($fn() as $val) {
+ var_dump($val);
+}
+
+$fn = fn() => fn() => yield 987;
+foreach ($fn()() as $val) {
+ var_dump($val);
+}
+
+?>
+--EXPECT--
+int(123)
+int(456)
+int(789)
+int(987)
diff --git a/Zend/tests/assign_coalesce_001.phpt b/Zend/tests/assign_coalesce_001.phpt
new file mode 100644
index 0000000000..163f72f051
--- /dev/null
+++ b/Zend/tests/assign_coalesce_001.phpt
@@ -0,0 +1,127 @@
+--TEST--
+Coalesce assign (??=): Basic behavior
+--FILE--
+<?php
+
+// Refcounted values
+$foo = "fo";
+$foo .= "o";
+$bar = "ba";
+$bar .= "r";
+
+// Identity function used to track single-evaluation
+function id($arg) {
+ echo "id($arg)\n";
+ return $arg;
+}
+
+echo "Simple variables:\n";
+$a = 123;
+$a ??= 456;
+var_dump($a);
+
+$b = null;
+$b ??= $foo;
+var_dump($b);
+
+$c = $foo;
+$c ??= $bar;
+var_dump($c);
+
+$d ??= $foo;
+var_dump($c);
+
+echo "\nArrays:\n";
+$ary = [];
+$ary["foo"] ??= 123;
+$ary[$foo] ??= $bar;
+$ary[$bar] ??= $foo;
+var_dump($ary);
+
+$ary = [];
+$ary[id($foo)] ??= 123;
+$ary[id($foo)] ??= $bar;
+$ary[id($bar)] ??= $foo;
+var_dump($ary);
+
+echo "\nObjects:\n";
+$obj = new stdClass;
+$obj->foo ??= 123;
+$obj->$foo ??= $bar;
+$obj->$bar ??= $foo;
+var_dump($obj);
+
+$obj = new stdClass;
+$obj->{id($foo)} ??= 123;
+$obj->{id($foo)} ??= $bar;
+$obj->{id($bar)} ??= $foo;
+var_dump($obj);
+
+class Test {
+ public static $foo;
+ public static $bar;
+}
+
+echo "\nStatic props:\n";
+Test::$foo ??= 123;
+Test::$$foo ??= $bar;
+Test::$$bar ??= $foo;
+var_dump(Test::$foo, Test::$bar);
+
+Test::$foo = null;
+Test::$bar = null;
+Test::${id($foo)} ??= 123;
+Test::${id($foo)} ??= $bar;
+Test::${id($bar)} ??= $foo;
+var_dump(Test::$foo, Test::$bar);
+
+?>
+--EXPECT--
+Simple variables:
+int(123)
+string(3) "foo"
+string(3) "foo"
+string(3) "foo"
+
+Arrays:
+array(2) {
+ ["foo"]=>
+ int(123)
+ ["bar"]=>
+ string(3) "foo"
+}
+id(foo)
+id(foo)
+id(bar)
+array(2) {
+ ["foo"]=>
+ int(123)
+ ["bar"]=>
+ string(3) "foo"
+}
+
+Objects:
+object(stdClass)#1 (2) {
+ ["foo"]=>
+ int(123)
+ ["bar"]=>
+ string(3) "foo"
+}
+id(foo)
+id(foo)
+id(bar)
+object(stdClass)#2 (2) {
+ ["foo"]=>
+ int(123)
+ ["bar"]=>
+ string(3) "foo"
+}
+
+Static props:
+int(123)
+string(3) "foo"
+id(foo)
+id(foo)
+id(bar)
+int(123)
+string(3) "foo"
diff --git a/Zend/tests/assign_coalesce_002.phpt b/Zend/tests/assign_coalesce_002.phpt
new file mode 100644
index 0000000000..e49544effc
--- /dev/null
+++ b/Zend/tests/assign_coalesce_002.phpt
@@ -0,0 +1,84 @@
+--TEST--
+Coalesce assign (??=): Exception handling
+--FILE--
+<?php
+
+$foo = "fo";
+$foo .= "o";
+$bar = "ba";
+$bar .= "r";
+
+function id($arg) {
+ echo "id($arg)\n";
+ return $arg;
+}
+
+function do_throw($msg) {
+ throw new Exception($msg);
+}
+
+$ary = [];
+try {
+ $ary[id($foo)] ??= do_throw("ex1");
+} catch (Exception $e) {
+ echo $e->getMessage(), "\n";
+}
+var_dump($ary);
+
+class AA implements ArrayAccess {
+ public function offsetExists($k) {
+ return true;
+ }
+ public function &offsetGet($k) {
+ $var = ["foo" => "bar"];
+ return $var;
+ }
+ public function offsetSet($k,$v) {}
+ public function offsetUnset($k) {}
+}
+
+class Dtor {
+ public function __destruct() {
+ throw new Exception("dtor");
+ }
+}
+
+$ary = new AA;
+try {
+ $ary[new Dtor][id($foo)] ??= $bar;
+} catch (Exception $e) {
+ echo $e->getMessage(), "\n";
+}
+var_dump($foo);
+
+class AA2 implements ArrayAccess {
+ public function offsetExists($k) {
+ return false;
+ }
+ public function offsetGet($k) {
+ return null;
+ }
+ public function offsetSet($k,$v) {}
+ public function offsetUnset($k) {}
+}
+
+$ary = ["foo" => new AA2];
+try {
+ $ary[id($foo)][new Dtor] ??= $bar;
+} catch (Exception $e) {
+ echo $e->getMessage(), "\n";
+}
+var_dump($foo);
+
+?>
+--EXPECT--
+id(foo)
+ex1
+array(0) {
+}
+id(foo)
+dtor
+string(3) "foo"
+id(foo)
+dtor
+string(3) "foo"
diff --git a/Zend/tests/assign_coalesce_003.phpt b/Zend/tests/assign_coalesce_003.phpt
new file mode 100644
index 0000000000..8509aa114d
--- /dev/null
+++ b/Zend/tests/assign_coalesce_003.phpt
@@ -0,0 +1,70 @@
+--TEST--
+Coalesce assign (??=): ArrayAccess handling
+--FILE--
+<?php
+
+function id($arg) {
+ echo "id($arg)\n";
+ return $arg;
+}
+
+class AA implements ArrayAccess {
+ public $data;
+ public function __construct($data = []) {
+ $this->data = $data;
+ }
+ public function &offsetGet($k) {
+ echo "offsetGet($k)\n";
+ return $this->data[$k];
+ }
+ public function offsetExists($k) {
+ echo "offsetExists($k)\n";
+ return array_key_exists($k, $this->data);
+ }
+ public function offsetSet($k,$v) {
+ echo "offsetSet($k,$v)\n";
+ $this->data[$k] = $v;
+ }
+ public function offsetUnset($k) { }
+}
+
+$ary = new AA(["foo" => new AA, "null" => null]);
+
+echo "[foo]\n";
+$ary["foo"] ??= "bar";
+
+echo "[bar]\n";
+$ary["bar"] ??= "foo";
+
+echo "[null]\n";
+$ary["null"] ??= "baz";
+
+echo "[foo][bar]\n";
+$ary["foo"]["bar"] ??= "abc";
+
+echo "[foo][bar]\n";
+$ary["foo"]["bar"] ??= "def";
+
+?>
+--EXPECT--
+[foo]
+offsetExists(foo)
+offsetGet(foo)
+[bar]
+offsetExists(bar)
+offsetSet(bar,foo)
+[null]
+offsetExists(null)
+offsetGet(null)
+offsetSet(null,baz)
+[foo][bar]
+offsetExists(foo)
+offsetGet(foo)
+offsetExists(bar)
+offsetGet(foo)
+offsetSet(bar,abc)
+[foo][bar]
+offsetExists(foo)
+offsetGet(foo)
+offsetExists(bar)
+offsetGet(bar)
diff --git a/Zend/tests/assign_coalesce_004.phpt b/Zend/tests/assign_coalesce_004.phpt
new file mode 100644
index 0000000000..51b9d2ff4b
--- /dev/null
+++ b/Zend/tests/assign_coalesce_004.phpt
@@ -0,0 +1,11 @@
+--TEST--
+Coalesce assign (??=): Non-writable variable
+--FILE--
+<?php
+
+function foo() { return 123; }
+foo() ??= 456;
+
+?>
+--EXPECTF--
+Fatal error: Can't use function return value in write context in %s on line %d
diff --git a/Zend/tests/assign_coalesce_005.phpt b/Zend/tests/assign_coalesce_005.phpt
new file mode 100644
index 0000000000..20510105e1
--- /dev/null
+++ b/Zend/tests/assign_coalesce_005.phpt
@@ -0,0 +1,14 @@
+--TEST--
+Coalesce assign (??=): Cannot reassign $this
+--FILE--
+<?php
+
+class Test {
+ public function foobar() {
+ $this ??= 123;
+ }
+}
+
+?>
+--EXPECTF--
+Fatal error: Cannot re-assign $this in %s on line %d
diff --git a/Zend/tests/assign_coalesce_006.phpt b/Zend/tests/assign_coalesce_006.phpt
new file mode 100644
index 0000000000..dfe43b3c29
--- /dev/null
+++ b/Zend/tests/assign_coalesce_006.phpt
@@ -0,0 +1,12 @@
+--TEST--
+Null coalesce assign with memoized constant operand that is later interned (OSS-Fuzz #17903)
+--FILE--
+<?php
+$foo[__DIR__] ??= 42;
+var_dump($foo);
+?>
+--EXPECTF--
+array(1) {
+ ["%s"]=>
+ int(42)
+}
diff --git a/Zend/tests/assign_obj_ref_byval_function.phpt b/Zend/tests/assign_obj_ref_byval_function.phpt
new file mode 100644
index 0000000000..561ef087d2
--- /dev/null
+++ b/Zend/tests/assign_obj_ref_byval_function.phpt
@@ -0,0 +1,20 @@
+--TEST--
+Assign result of by-value function to object property by-reference
+--FILE--
+<?php
+
+function notRef() {
+ return null;
+}
+
+$obj = new stdClass;
+$obj->prop =& notRef();
+var_dump($obj);
+
+?>
+--EXPECTF--
+Notice: Only variables should be assigned by reference in %s on line %d
+object(stdClass)#1 (1) {
+ ["prop"]=>
+ NULL
+}
diff --git a/Zend/tests/assign_ref_error_var_handling.phpt b/Zend/tests/assign_ref_error_var_handling.phpt
index ad01663131..5ecb577ba7 100644
--- a/Zend/tests/assign_ref_error_var_handling.phpt
+++ b/Zend/tests/assign_ref_error_var_handling.phpt
@@ -1,5 +1,5 @@
--TEST--
-If the LHS of ref-assign ERRORs, that takes precendence over the "only variables" notice
+If the LHS of ref-assign ERRORs, that takes precedence over the "only variables" notice
--FILE--
<?php
diff --git a/Zend/tests/assign_ref_func_leak.phpt b/Zend/tests/assign_ref_func_leak.phpt
new file mode 100644
index 0000000000..fe4c8017b6
--- /dev/null
+++ b/Zend/tests/assign_ref_func_leak.phpt
@@ -0,0 +1,23 @@
+--TEST--
+Assigning the result of a non-reference function by-reference should not leak
+--FILE--
+<?php
+
+function func() {
+ return [0];
+}
+
+$x = $y =& func();
+var_dump($x, $y);
+
+?>
+--EXPECTF--
+Notice: Only variables should be assigned by reference in %s on line %d
+array(1) {
+ [0]=>
+ int(0)
+}
+array(1) {
+ [0]=>
+ int(0)
+}
diff --git a/Zend/tests/assign_to_obj_001.phpt b/Zend/tests/assign_to_obj_001.phpt
index 3dccc1cd60..a4eb7c0141 100644
--- a/Zend/tests/assign_to_obj_001.phpt
+++ b/Zend/tests/assign_to_obj_001.phpt
@@ -1,5 +1,5 @@
--TEST--
-assgin to object leaks with ref
+assign to object leaks with ref
--FILE--
<?php
function &a($i) {
diff --git a/Zend/tests/assign_to_var_003.phpt b/Zend/tests/assign_to_var_003.phpt
index b915c7231e..bbe1b372bb 100644
--- a/Zend/tests/assign_to_var_003.phpt
+++ b/Zend/tests/assign_to_var_003.phpt
@@ -12,7 +12,8 @@ var_dump($var1);
echo "Done\n";
?>
---EXPECT--
+--EXPECTF--
+Notice: Trying to access array offset on value of type float in %s on line %d
NULL
NULL
Done
diff --git a/Zend/tests/bug21478.phpt b/Zend/tests/bug21478.phpt
index 8da1980400..2738b7964d 100644
--- a/Zend/tests/bug21478.phpt
+++ b/Zend/tests/bug21478.phpt
@@ -15,7 +15,7 @@ class debugfilter extends php_user_filter {
stream_filter_register("myfilter","debugfilter");
-$fp = fopen(dirname(__FILE__)."/test.txt","w");
+$fp = fopen(__DIR__."/test.txt","w");
stream_filter_append($fp, "myfilter");
stream_filter_append($fp, "myfilter");
stream_filter_append($fp, "myfilter");
@@ -24,8 +24,8 @@ print "Done.\n";
fclose($fp);
// Uncommenting the following 'print' line causes the segfault to stop occurring
// print "2\n";
-readfile(dirname(__FILE__)."/test.txt");
-unlink(dirname(__FILE__)."/test.txt");
+readfile(__DIR__."/test.txt");
+unlink(__DIR__."/test.txt");
?>
--EXPECT--
Done.
diff --git a/Zend/tests/bug26166.phpt b/Zend/tests/bug26166.phpt
index a77989c7c2..7a3be86c3f 100644
--- a/Zend/tests/bug26166.phpt
+++ b/Zend/tests/bug26166.phpt
@@ -31,12 +31,6 @@ echo $o;
echo "===NONE===\n";
-function my_error_handler($errno, $errstr, $errfile, $errline) {
- var_dump($errstr);
-}
-
-set_error_handler('my_error_handler');
-
class NoneTest
{
function __toString() {
@@ -44,7 +38,11 @@ class NoneTest
}
$o = new NoneTest;
-echo $o;
+try {
+ echo $o;
+} catch (Error $e) {
+ echo $e->getMessage(), "\n";
+}
echo "===THROW===\n";
@@ -58,17 +56,16 @@ class ErrorTest
$o = new ErrorTest;
try {
echo $o;
-}
-catch (Exception $e) {
- echo "Got the exception\n";
+} catch (Exception $e) {
+ echo $e->getMessage(), "\n";
}
?>
===DONE===
---EXPECTF--
+--EXPECT--
Hello World!
===NONE===
-string(%d) "Method NoneTest::__toString() must return a string value"
+Method NoneTest::__toString() must return a string value
===THROW===
-
-Fatal error: Method ErrorTest::__toString() must not throw an exception, caught Exception: This is an error! in %sbug26166.php on line %d
+This is an error!
+===DONE===
diff --git a/Zend/tests/bug26698.phpt b/Zend/tests/bug26698.phpt
index a4d6ad13f8..8fbf551b6b 100644
--- a/Zend/tests/bug26698.phpt
+++ b/Zend/tests/bug26698.phpt
@@ -1,5 +1,5 @@
--TEST--
-Bug #26698 (Thrown exceptions while evaluting argument to pass as parameter crash PHP)
+Bug #26698 (Thrown exceptions while evaluating argument to pass as parameter crash PHP)
--FILE--
<?php
diff --git a/Zend/tests/bug28444.phpt b/Zend/tests/bug28444.phpt
index b7e863da92..464aaef4c7 100644
--- a/Zend/tests/bug28444.phpt
+++ b/Zend/tests/bug28444.phpt
@@ -3,12 +3,6 @@ Bug #28444 (Cannot access undefined property for object with overloaded property
--FILE--
<?php
-function my_error_handler($errno, $errstr, $errfile, $errline) {
- var_dump($errstr);
-}
-
-set_error_handler('my_error_handler');
-
class ObjectOne
{
public $x;
@@ -17,6 +11,10 @@ class ObjectOne
{
$this->x = $x;
}
+
+ function __toString() {
+ return "Object";
+ }
}
class Overloaded
@@ -55,8 +53,8 @@ var_dump($y->z->x = 6);
?>
===DONE===
---EXPECTF--
-object(ObjectOne)#%d (1) {
+--EXPECT--
+object(ObjectOne)#2 (1) {
["x"]=>
int(2)
}
@@ -66,9 +64,8 @@ Overloaded::__set(y,3)
int(3)
Overloaded::__get(y)
int(3)
-string(58) "Object of class ObjectOne could not be converted to string"
-Overloaded::__set(z,)
-object(ObjectOne)#%d (1) {
+Overloaded::__set(z,Object)
+object(ObjectOne)#3 (1) {
["x"]=>
int(4)
}
diff --git a/Zend/tests/bug29368_2.phpt b/Zend/tests/bug29368_2.phpt
new file mode 100644
index 0000000000..acecefcb9b
--- /dev/null
+++ b/Zend/tests/bug29368_2.phpt
@@ -0,0 +1,21 @@
+--TEST--
+Bug #29368.2 (The destructor is called when an exception is thrown from the constructor).
+--FILE--
+<?php
+class Bomb {
+ function foo() {
+ }
+ function __destruct() {
+ throw new Exception("bomb!");
+ }
+}
+try {
+ $x = new ReflectionMethod(new Bomb(), "foo");
+} catch (Throwable $e) {
+ echo $e->getMessage() . "\n";
+}
+echo "ok\n";
+?>
+--EXPECT--
+bomb!
+ok
diff --git a/Zend/tests/bug29368_3.phpt b/Zend/tests/bug29368_3.phpt
new file mode 100644
index 0000000000..fafcc2a0ef
--- /dev/null
+++ b/Zend/tests/bug29368_3.phpt
@@ -0,0 +1,33 @@
+--TEST--
+Bug #29368.3 (The destructor is called when an exception is thrown from the constructor).
+--FILE--
+<?php
+class Foo {
+ function __construct() {
+ echo __METHOD__ . "\n";
+ }
+ function __destruct() {
+ echo __METHOD__ . "\n";
+ }
+}
+class Bar {
+ function __construct() {
+ echo __METHOD__ . "\n";
+ throw new Exception;
+ }
+ function __destruct() {
+ echo __METHOD__ . "\n";
+ }
+}
+
+try {
+ new Foo() + new Bar();
+} catch(Exception $exc) {
+ echo "Caught exception!\n";
+}
+?>
+--EXPECT--
+Foo::__construct
+Bar::__construct
+Foo::__destruct
+Caught exception!
diff --git a/Zend/tests/bug30519.phpt b/Zend/tests/bug30519.phpt
index f633d11445..f6c7d15bc8 100644
--- a/Zend/tests/bug30519.phpt
+++ b/Zend/tests/bug30519.phpt
@@ -6,4 +6,7 @@ class test implements a {
}
?>
--EXPECTF--
-Fatal error: Interface 'a' not found in %sbug30519.php on line 2
+Fatal error: Uncaught Error: Interface 'a' not found in %s:%d
+Stack trace:
+#0 {main}
+ thrown in %s on line %d
diff --git a/Zend/tests/bug30791.phpt b/Zend/tests/bug30791.phpt
index e9991f3ad5..1b3b2ffe24 100644
--- a/Zend/tests/bug30791.phpt
+++ b/Zend/tests/bug30791.phpt
@@ -3,32 +3,25 @@ Bug #30791 (magic methods (__sleep/__wakeup/__toString) call __call if object is
--FILE--
<?php
-function my_error_handler($errno, $errstr, $errfile, $errline) {
- var_dump($errstr);
-}
-
-set_error_handler('my_error_handler');
-
class a
{
- public $a = 4;
- function __call($a,$b) {
- return "unknown method";
- }
+ public $a = 4;
+ function __call($name, $args) {
+ echo __METHOD__, "\n";
+ }
}
$b = new a;
-echo $b,"\n";
+var_dump($b);
$c = unserialize(serialize($b));
-echo $c,"\n";
var_dump($c);
?>
--EXPECT--
-string(50) "Object of class a could not be converted to string"
-
-string(50) "Object of class a could not be converted to string"
-
+object(a)#1 (1) {
+ ["a"]=>
+ int(4)
+}
object(a)#2 (1) {
["a"]=>
int(4)
diff --git a/Zend/tests/bug30922.phpt b/Zend/tests/bug30922.phpt
index 8da0f2192d..7a0316bee8 100644
--- a/Zend/tests/bug30922.phpt
+++ b/Zend/tests/bug30922.phpt
@@ -10,4 +10,7 @@ var_dump($a instanceOf A);
echo "ok\n";
?>
--EXPECTF--
-Fatal error: Interface RecurisiveFooFar cannot implement itself in %sbug30922.php on line %d
+Fatal error: Uncaught Error: Interface 'RecurisiveFooFar' not found in %s:%d
+Stack trace:
+#0 {main}
+ thrown in %s on line %d
diff --git a/Zend/tests/bug32674.phpt b/Zend/tests/bug32674.phpt
index 275a33562a..f932517d9b 100644
--- a/Zend/tests/bug32674.phpt
+++ b/Zend/tests/bug32674.phpt
@@ -34,7 +34,7 @@ class collection implements Iterator {
}
public function valid() {
- throw new Exception('shit happend');
+ throw new Exception('shit happened');
return ($this->current() !== false);
}
diff --git a/Zend/tests/bug33771.phpt b/Zend/tests/bug33771.phpt
index 0f3dd9815f..6eea49edbe 100644
--- a/Zend/tests/bug33771.phpt
+++ b/Zend/tests/bug33771.phpt
@@ -3,7 +3,7 @@ Bug #33771 (error_reporting falls to 0 when @ was used inside try/catch block)
--FILE--
<?php
-error_reporting(E_ALL | E_STRICT);
+error_reporting(E_ALL);
var_dump(error_reporting());
@@ -14,7 +14,7 @@ function make_exception()
function make_exception_and_change_err_reporting()
{
- error_reporting(E_ALL & ~E_STRICT);
+ error_reporting(E_ALL & ~E_NOTICE);
throw new Exception();
}
@@ -36,5 +36,5 @@ echo "Done\n";
--EXPECT--
int(32767)
int(32767)
-int(30719)
+int(32759)
Done
diff --git a/Zend/tests/bug35017.phpt b/Zend/tests/bug35017.phpt
index 46b2487a62..9944df55e0 100644
--- a/Zend/tests/bug35017.phpt
+++ b/Zend/tests/bug35017.phpt
@@ -11,11 +11,11 @@ try {
}
echo "?\n";
} catch(Exception $e) {
- echo "This Exception should be catched\n";
+ echo "This Exception should be caught\n";
}
function errorHandler($errno, $errstr, $errfile, $errline, $vars) {
throw new Exception('Some Exception');
}
?>
--EXPECT--
-This Exception should be catched
+This Exception should be caught
diff --git a/Zend/tests/bug35437.phpt b/Zend/tests/bug35437.phpt
index 73222a9f23..4f61e4fbfd 100644
--- a/Zend/tests/bug35437.phpt
+++ b/Zend/tests/bug35437.phpt
@@ -20,8 +20,8 @@ class TestClass
try {
TestClass::testMethod();
} catch (Exception $e) {
- echo "Catched: ".$e->getMessage()."\n";
+ echo "Caught: ".$e->getMessage()."\n";
}
?>
--EXPECT--
-Catched: Error occuried: Non-static method TestClass::testMethod() should not be called statically
+Caught: Error occuried: Non-static method TestClass::testMethod() should not be called statically
diff --git a/Zend/tests/bug35655.phpt b/Zend/tests/bug35655.phpt
index bbb137799a..47e7a7bd7e 100644
--- a/Zend/tests/bug35655.phpt
+++ b/Zend/tests/bug35655.phpt
@@ -6,6 +6,7 @@ highlight.comment = #FF8000
highlight.keyword = #007700
highlight.default = #0000BB
highlight.html = #000000
+--WHITESPACE_SENSITIVE--
--FILE--
<?php
$code = '
diff --git a/Zend/tests/bug38461.phpt b/Zend/tests/bug38461.phpt
index 6f571876b8..3dfa89c055 100644
--- a/Zend/tests/bug38461.phpt
+++ b/Zend/tests/bug38461.phpt
@@ -21,5 +21,9 @@ $op->x = 'test';
echo "Done\n";
?>
---EXPECT--
-Done
+--EXPECTF--
+Fatal error: Uncaught Error: Cannot access private property ExtOperation::$x in %s:%d
+Stack trace:
+#0 %s(%d): Operation->__set('x', 'test')
+#1 {main}
+ thrown in %s on line %d
diff --git a/Zend/tests/bug38779.phpt b/Zend/tests/bug38779.phpt
index 2d0949714e..d552f8e20d 100644
--- a/Zend/tests/bug38779.phpt
+++ b/Zend/tests/bug38779.phpt
@@ -22,6 +22,9 @@ class Loader {
function stream_stat() {
return array('size' => strlen($this->data));
}
+ function stream_set_option($option, $arg1, $arg2) {
+ return false;
+ }
}
stream_wrapper_register('Loader', 'Loader');
require 'Loader://qqq.php';
diff --git a/Zend/tests/bug38779_1.phpt b/Zend/tests/bug38779_1.phpt
index 2b69653eb0..f4f89235a4 100644
--- a/Zend/tests/bug38779_1.phpt
+++ b/Zend/tests/bug38779_1.phpt
@@ -23,14 +23,14 @@ class Loader {
var_dump("flush!");
}
function stream_close() {
- @unlink(dirname(__FILE__)."/bug38779.txt");
+ @unlink(__DIR__."/bug38779.txt");
var_dump("close!");
}
}
stream_wrapper_register('Loader', 'Loader');
$fp = fopen ('Loader://qqq.php', 'r');
-$filename = dirname(__FILE__)."/bug38779.txt";
+$filename = __DIR__."/bug38779.txt";
$fp1 = fopen($filename, "w");
fwrite($fp1, "<"."?php blah blah?".">");
fclose($fp1);
@@ -42,9 +42,9 @@ echo "Done\n";
--CLEAN--
<?php
-$filename = dirname(__FILE__)."/bug38779.txt";
+$filename = __DIR__."/bug38779.txt";
if (file_exists($filename)) {
- @unlink(dirname(__FILE__)."/bug38779.txt");
+ @unlink(__DIR__."/bug38779.txt");
}
?>
--EXPECTF--
diff --git a/Zend/tests/bug39542.phpt b/Zend/tests/bug39542.phpt
index 2008fe140a..336deb7f18 100644
--- a/Zend/tests/bug39542.phpt
+++ b/Zend/tests/bug39542.phpt
@@ -3,15 +3,15 @@ Bug #39542 (Behaviour of require_once/include_once different to < 5.2.0)
--FILE--
<?php
$oldcwd = getcwd();
-chdir(dirname(__FILE__));
+chdir(__DIR__);
if (substr(PHP_OS, 0, 3) == 'WIN') {
- set_include_path(dirname(__FILE__).'/bug39542;.');
+ set_include_path(__DIR__.'/bug39542;.');
} else {
- set_include_path(dirname(__FILE__).'/bug39542:.');
+ set_include_path(__DIR__.'/bug39542:.');
}
spl_autoload_register(function ($class) {
- if (!require_once($class.'.php')) {
+ if (!require_once($class.'.inc')) {
error_log('Error: Autoload class: '.$class.' not found!');
}
});
diff --git a/Zend/tests/bug39542/bug39542.php b/Zend/tests/bug39542/bug39542.inc
index 13b3b3eaf4..13b3b3eaf4 100755..100644
--- a/Zend/tests/bug39542/bug39542.php
+++ b/Zend/tests/bug39542/bug39542.inc
diff --git a/Zend/tests/bug40236.phpt b/Zend/tests/bug40236.phpt
index f9a4277249..81cd56f71f 100644
--- a/Zend/tests/bug40236.phpt
+++ b/Zend/tests/bug40236.phpt
@@ -8,7 +8,7 @@ if (extension_loaded("readline")) die("skip Test doesn't support readline");
--FILE--
<?php
$php = getenv('TEST_PHP_EXECUTABLE');
-$cmd = "\"$php\" -n -d memory_limit=4M -a \"".dirname(__FILE__)."\"/bug40236.inc";
+$cmd = "\"$php\" -n -d memory_limit=4M -a \"".__DIR__."\"/bug40236.inc";
echo `$cmd`;
?>
--EXPECTF--
diff --git a/Zend/tests/bug43200.phpt b/Zend/tests/bug43200.phpt
index 35b96b1ba1..be94a64531 100644
--- a/Zend/tests/bug43200.phpt
+++ b/Zend/tests/bug43200.phpt
@@ -19,7 +19,7 @@ class x extends c implements a, b {
function foo() { }
}
-ReflectionClass::export('x');
+echo new ReflectionClass('x');
?>
--EXPECTF--
diff --git a/Zend/tests/bug44660.phpt b/Zend/tests/bug44660.phpt
index 002744ce64..980c2274cd 100644
--- a/Zend/tests/bug44660.phpt
+++ b/Zend/tests/bug44660.phpt
@@ -1,5 +1,5 @@
--TEST--
-Bug #44660 (Indexed and reference assignment to propery of non-object don't trigger warning)
+Bug #44660 (Indexed and reference assignment to property of non-object don't trigger warning)
--FILE--
<?php
$s = "hello";
diff --git a/Zend/tests/bug46665.phpt b/Zend/tests/bug46665.phpt
index 29491dc26c..d8de8159a5 100644
--- a/Zend/tests/bug46665.phpt
+++ b/Zend/tests/bug46665.phpt
@@ -12,5 +12,5 @@ $baz = '\\Foo\\Bar\\Baz';
new $baz();
?>
---EXPECTF--
+--EXPECT--
string(11) "Foo\Bar\Baz"
diff --git a/Zend/tests/bug48248.phpt b/Zend/tests/bug48248.phpt
index 9cdb7c1a00..16fb3273f2 100644
--- a/Zend/tests/bug48248.phpt
+++ b/Zend/tests/bug48248.phpt
@@ -21,7 +21,8 @@ var_dump($b->test);
?>
--EXPECTF--
-Notice: Undefined property: B::$test in %s on line %d
-
-Notice: Only variable references should be returned by reference in %s on line %d
-NULL
+Fatal error: Uncaught Error: Cannot access private property B::$test in %s:%d
+Stack trace:
+#0 %s(%d): A->__get('test')
+#1 {main}
+ thrown in %s on line %d
diff --git a/Zend/tests/bug49908.phpt b/Zend/tests/bug49908.phpt
index 2f33080258..e3e91d3452 100644
--- a/Zend/tests/bug49908.phpt
+++ b/Zend/tests/bug49908.phpt
@@ -13,12 +13,19 @@ spl_autoload_register(function ($className) {
}
});
-new Foo;
+try {
+ new Foo();
+} catch (Exception $e) { }
+
+// We never reach here.
+var_dump(new Foo());
?>
--EXPECTF--
string(3) "Foo"
string(3) "Bar"
+string(3) "Foo"
+string(3) "Bar"
Fatal error: Uncaught Exception: Bar in %s:%d
Stack trace:
diff --git a/Zend/tests/bug51791.phpt b/Zend/tests/bug51791.phpt
index b6ced4bccd..0b92fa8c62 100644
--- a/Zend/tests/bug51791.phpt
+++ b/Zend/tests/bug51791.phpt
@@ -1,5 +1,5 @@
--TEST--
-Bug #51791 (constant() failed to check undefined constant and php interpreter stoped)
+Bug #51791 (constant() failed to check undefined constant and php interpreter stopped)
--FILE--
<?php
diff --git a/Zend/tests/bug52041.phpt b/Zend/tests/bug52041.phpt
index 7e1f3423a6..a1eb1f841b 100644
--- a/Zend/tests/bug52041.phpt
+++ b/Zend/tests/bug52041.phpt
@@ -31,6 +31,8 @@ Notice: Undefined variable: x in %sbug52041.php on line 3
Warning: Creating default object from empty value in %sbug52041.php on line 7
+Warning: Creating default object from empty value in %sbug52041.php on line 7
+
Notice: Undefined variable: x in %sbug52041.php on line 3
Warning: Creating default object from empty value in %sbug52041.php on line 8
@@ -39,6 +41,8 @@ Notice: Undefined property: stdClass::$a in %sbug52041.php on line 8
Notice: Undefined variable: x in %sbug52041.php on line 3
+Warning: Creating default object from empty value in %sbug52041.php on line 9
+
Notice: Undefined property: stdClass::$a in %sbug52041.php on line 9
Warning: Creating default object from empty value in %sbug52041.php on line 9
@@ -53,6 +57,8 @@ Notice: Undefined property: stdClass::$a in %sbug52041.php on line 10
Notice: Undefined variable: x in %sbug52041.php on line 3
+Warning: Creating default object from empty value in %sbug52041.php on line 11
+
Notice: Undefined property: stdClass::$a in %sbug52041.php on line 11
Warning: Creating default object from empty value in %sbug52041.php on line 11
diff --git a/Zend/tests/bug52160.phpt b/Zend/tests/bug52160.phpt
index a0e5a9d7ae..f0a57000e0 100644
--- a/Zend/tests/bug52160.phpt
+++ b/Zend/tests/bug52160.phpt
@@ -1,5 +1,5 @@
--TEST--
-Bug #52160 (Invalid E_STRICT redefined constructor error)
+Bug #52160 (Invalid E_DEPRECATED redefined constructor error)
--FILE--
<?php
diff --git a/Zend/tests/bug52508.phpt b/Zend/tests/bug52508.phpt
index 83292a5405..a9b12e793c 100644
--- a/Zend/tests/bug52508.phpt
+++ b/Zend/tests/bug52508.phpt
@@ -3,7 +3,7 @@ Bug #52508 (newline problem with parse_ini_file+INI_SCANNER_RAW)
--FILE--
<?php
-$file = dirname(__FILE__) .'/bug52508.ini';
+$file = __DIR__ .'/bug52508.ini';
file_put_contents($file, "a = 1");
diff --git a/Zend/tests/bug53511.phpt b/Zend/tests/bug53511.phpt
index 0075655428..583df3c258 100644
--- a/Zend/tests/bug53511.phpt
+++ b/Zend/tests/bug53511.phpt
@@ -20,12 +20,7 @@ function test() {
test();
echo "bug\n";
--EXPECTF--
-Fatal error: Uncaught Exception: ops 2 in %sbug53511.php:11
-Stack trace:
-#0 %sbug53511.php(17): test()
-#1 {main}
-
-Next Exception: ops 1 in %sbug53511.php:4
+Fatal error: Uncaught Exception: ops 1 in %sbug53511.php:4
Stack trace:
#0 %sbug53511.php(12): Foo->__destruct()
#1 %sbug53511.php(17): test()
diff --git a/Zend/tests/bug60161.phpt b/Zend/tests/bug60161.phpt
new file mode 100644
index 0000000000..0d71aaecb2
--- /dev/null
+++ b/Zend/tests/bug60161.phpt
@@ -0,0 +1,18 @@
+--TEST--
+Bug #60161: Implementing an interface extending Traversable is order dependent
+--FILE--
+<?php
+
+interface Foo extends Traversable {
+}
+
+class Example implements Foo, IteratorAggregate {
+ public function getIterator() {
+ return new ArrayIterator([]);
+ }
+}
+
+?>
+===DONE===
+--EXPECT--
+===DONE===
diff --git a/Zend/tests/bug60909_1.phpt b/Zend/tests/bug60909_1.phpt
index e4c07face1..c82cf6c4d5 100644
--- a/Zend/tests/bug60909_1.phpt
+++ b/Zend/tests/bug60909_1.phpt
@@ -11,14 +11,12 @@ set_error_handler(function($errno, $errstr, $errfile, $errline){
require 'notfound.php';
--EXPECTF--
error(require(notfound.php): failed to open stream: %s)
-Warning: Uncaught Exception: Foo in %sbug60909_1.php:5
+Fatal error: Uncaught Exception: Foo in %sbug60909_1.php:5
Stack trace:
#0 %sbug60909_1.php(8): {closure}(2, 'require(notfoun...', '%s', 8, Array)
#1 %sbug60909_1.php(8): require()
#2 {main}
thrown in %sbug60909_1.php on line 5
-Fatal error: main(): Failed opening required 'notfound.php' (include_path='%s') in %sbug60909_1.php on line 8
-
!!!shutdown!!!
diff --git a/Zend/tests/bug60909_2.phpt b/Zend/tests/bug60909_2.phpt
index 1808b1c2fe..9660a9653f 100644
--- a/Zend/tests/bug60909_2.phpt
+++ b/Zend/tests/bug60909_2.phpt
@@ -3,18 +3,21 @@ Bug #60909 (custom error handler throwing Exception + fatal error = no shutdown
--FILE--
<?php
register_shutdown_function(function(){echo("\n\n!!!shutdown!!!\n\n");});
-set_error_handler(function($errno, $errstr, $errfile, $errline){throw new Exception("Foo");});
class Bad {
public function __toString() {
- throw new Exception('Oops, I cannot do this');
+ throw new Exception('I CAN DO THIS');
}
}
$bad = new Bad();
echo "$bad";
--EXPECTF--
-Fatal error: Method Bad::__toString() must not throw an exception, caught Exception: Oops, I cannot do this in %sbug60909_2.php on line %d
+Fatal error: Uncaught Exception: I CAN DO THIS in %s:%d
+Stack trace:
+#0 %s(%d): Bad->__toString()
+#1 {main}
+ thrown in %s on line %d
!!!shutdown!!!
diff --git a/Zend/tests/bug61165.phpt b/Zend/tests/bug61165.phpt
index 478fa00a0f..900a7a8d2b 100644
--- a/Zend/tests/bug61165.phpt
+++ b/Zend/tests/bug61165.phpt
@@ -10,7 +10,7 @@ class T {
public function __toString() {
global $handler;
$handler = $this;
- $this->_this = $this; // <-- uncoment this
+ $this->_this = $this; // <-- uncomment this
return 'A';
}
}
diff --git a/Zend/tests/bug61970_1.phpt b/Zend/tests/bug61970_1.phpt
index 15dc781385..417eaa0aef 100644
--- a/Zend/tests/bug61970_1.phpt
+++ b/Zend/tests/bug61970_1.phpt
@@ -11,4 +11,4 @@ class Bar extends Foo {
protected function __construct(){}
}
--EXPECTF--
-Fatal error: Access level to Bar::__construct() must be public (as in class Foo) in %s
+Fatal error: Access level to Bar::__construct() must be public (as in class Foo) in %s on line 8
diff --git a/Zend/tests/bug61970_2.phpt b/Zend/tests/bug61970_2.phpt
index d1e11e9407..403ba7510a 100644
--- a/Zend/tests/bug61970_2.phpt
+++ b/Zend/tests/bug61970_2.phpt
@@ -15,4 +15,4 @@ class Baz extends Bar {
protected function __construct(){}
}
--EXPECTF--
-Fatal error: Access level to Baz::__construct() must be public (as in class Bar) in %s
+Fatal error: Access level to Baz::__construct() must be public (as in class Foo) in %s on line 12
diff --git a/Zend/tests/bug62358.phpt b/Zend/tests/bug62358.phpt
index 97381c3403..d10b42eaf3 100644
--- a/Zend/tests/bug62358.phpt
+++ b/Zend/tests/bug62358.phpt
@@ -23,4 +23,4 @@ class B extends A {
}
?>
--EXPECTF--
-Fatal error: Declaration of B::foo($var) must be compatible with A::foo() in %sbug62358.php on line 17
+Fatal error: Declaration of B::foo($var) must be compatible with A::foo() in %sbug62358.php on line 18
diff --git a/Zend/tests/bug62441.phpt b/Zend/tests/bug62441.phpt
index 581c0dad68..2b9f35cb30 100644
--- a/Zend/tests/bug62441.phpt
+++ b/Zend/tests/bug62441.phpt
@@ -16,4 +16,4 @@ namespace ns {
}
?>
--EXPECTF--
-Fatal error: Declaration of ns\Foo::method(ns\stdClass $o) must be compatible with Iface::method(stdClass $o) in %s on line %d
+Fatal error: Could not check compatibility between ns\Foo::method(ns\stdClass $o) and Iface::method(stdClass $o), because class ns\stdClass is not available in %s on line %d
diff --git a/Zend/tests/bug62814.phpt b/Zend/tests/bug62814.phpt
index 6646aa283f..c08360dd95 100644
--- a/Zend/tests/bug62814.phpt
+++ b/Zend/tests/bug62814.phpt
@@ -17,4 +17,4 @@ class C extends B {
?>
--EXPECTF--
-Fatal error: Access level to C::test() must be protected (as in class B) or weaker in %s on line %d
+Fatal error: Access level to C::test() must be protected (as in class B) or weaker in %s on line 12
diff --git a/Zend/tests/bug62956.phpt b/Zend/tests/bug62956.phpt
index c8694d5bea..fab180b4c3 100644
--- a/Zend/tests/bug62956.phpt
+++ b/Zend/tests/bug62956.phpt
@@ -1,5 +1,5 @@
--TEST--
-Bug #62956: "incompatible" signatures for private methods should not cause E_STRICT
+Bug #62956: "incompatible" signatures for private methods should not cause E_WARNING
--FILE--
<?php
class Base
diff --git a/Zend/tests/bug63635.phpt b/Zend/tests/bug63635.phpt
index 03cbfaf751..035588b295 100644
--- a/Zend/tests/bug63635.phpt
+++ b/Zend/tests/bug63635.phpt
@@ -4,17 +4,17 @@ Bug #63635 (Segfault in gc_collect_cycles)
<?php
class Node {
public $parent = NULL;
- public $childs = array();
+ public $children = array();
function __construct(Node $parent=NULL) {
if ($parent) {
- $parent->childs[] = $this;
+ $parent->children[] = $this;
}
- $this->childs[] = $this;
+ $this->children[] = $this;
}
function __destruct() {
- $this->childs = NULL;
+ $this->children = NULL;
}
}
diff --git a/Zend/tests/bug63741.phpt b/Zend/tests/bug63741.phpt
index fc04c9e79c..354acfdb97 100644
--- a/Zend/tests/bug63741.phpt
+++ b/Zend/tests/bug63741.phpt
@@ -2,7 +2,7 @@
Bug #63741 (Crash when autoloading from spl)
--FILE--
<?php
-file_put_contents(dirname(__FILE__)."/bug63741.tmp.php",
+file_put_contents(__DIR__."/bug63741.tmp.php",
<<<'EOT'
<?php
if (isset($autoloading))
@@ -41,10 +41,10 @@ else
EOT
);
-include dirname(__FILE__)."/bug63741.tmp.php";
+include __DIR__."/bug63741.tmp.php";
?>
--CLEAN--
-<?php unlink(dirname(__FILE__)."/bug63741.tmp.php"); ?>
+<?php unlink(__DIR__."/bug63741.tmp.php"); ?>
--EXPECT--
autoloading...
OK!
diff --git a/Zend/tests/bug63816.phpt b/Zend/tests/bug63816.phpt
new file mode 100644
index 0000000000..b6db9bd1da
--- /dev/null
+++ b/Zend/tests/bug63816.phpt
@@ -0,0 +1,45 @@
+--TEST--
+Bug #63816: implementation child interface and after parent cause fatal error
+--FILE--
+<?php
+
+interface RootInterface
+{
+ function foo();
+}
+
+interface FirstChildInterface extends RootInterface
+{
+ function foo();
+}
+
+interface SecondChildInterface extends RootInterface
+{
+ function foo();
+}
+
+class A implements FirstChildInterface, SecondChildInterface
+{
+ function foo()
+ {
+ }
+}
+
+class B implements RootInterface, FirstChildInterface
+{
+ function foo()
+ {
+ }
+}
+
+class C implements FirstChildInterface, RootInterface
+{
+ function foo()
+ {
+ }
+}
+
+?>
+===DONE===
+--EXPECT--
+===DONE===
diff --git a/Zend/tests/bug64988.phpt b/Zend/tests/bug64988.phpt
index 971c864d65..41d89cc54c 100644
--- a/Zend/tests/bug64988.phpt
+++ b/Zend/tests/bug64988.phpt
@@ -1,5 +1,5 @@
--TEST--
-Bug #64988 (Class loading order affects E_STRICT warning)
+Bug #64988 (Class loading order affects E_WARNING warning)
--FILE--
<?php
abstract class Base1 {
@@ -26,5 +26,5 @@ $o = new Smooth1();
echo "okey";
?>
--EXPECTF--
-Warning: Declaration of Smooth1::insert(array $data) should be compatible with Noisy1::insert(array $data, $option1 = NULL) in %sbug64988.php on line 20
+Warning: Declaration of Smooth1::insert(array $data) should be compatible with Noisy1::insert(array $data, $option1 = NULL) in %sbug64988.php on line 17
okey
diff --git a/Zend/tests/bug65784.phpt b/Zend/tests/bug65784.phpt
index 663ea95761..43369e2d60 100644
--- a/Zend/tests/bug65784.phpt
+++ b/Zend/tests/bug65784.phpt
@@ -8,7 +8,7 @@ function foo1() {
return true;
} finally {
try {
- throw new Exception("catched");
+ throw new Exception("caught");
} catch (Exception $e) {
}
}
@@ -25,11 +25,11 @@ try {
function foo2() {
try {
try {
- throw new Exception("catched");
+ throw new Exception("caught");
return true;
} finally {
try {
- throw new Exception("catched");
+ throw new Exception("caught");
} catch (Exception $e) {
}
}
@@ -42,7 +42,7 @@ var_dump($foo);
function foo3() {
try {
- throw new Exception("not catched");
+ throw new Exception("not caught");
return true;
} finally {
try {
@@ -57,7 +57,7 @@ $bar = foo3();
string(9) "not catch"
NULL
-Fatal error: Uncaught Exception: not catched in %sbug65784.php:42
+Fatal error: Uncaught Exception: not caught in %sbug65784.php:42
Stack trace:
#0 %sbug65784.php(52): foo3()
#1 {main}
diff --git a/Zend/tests/bug67436/a.php b/Zend/tests/bug67436/a.inc
index c560c2db7d..c560c2db7d 100644
--- a/Zend/tests/bug67436/a.php
+++ b/Zend/tests/bug67436/a.inc
diff --git a/Zend/tests/bug67436/b.php b/Zend/tests/bug67436/b.inc
index 793a1394d6..793a1394d6 100644
--- a/Zend/tests/bug67436/b.php
+++ b/Zend/tests/bug67436/b.inc
diff --git a/Zend/tests/bug67436/bug67436.phpt b/Zend/tests/bug67436/bug67436.phpt
index 7f35bfe7a3..0ef339dc47 100644
--- a/Zend/tests/bug67436/bug67436.phpt
+++ b/Zend/tests/bug67436/bug67436.phpt
@@ -7,7 +7,7 @@ error_reporting=-1
spl_autoload_register(function($classname) {
if (in_array($classname, array('a','b','c'))) {
- require_once __DIR__ . "/{$classname}.php";
+ require_once __DIR__ . "/{$classname}.inc";
}
});
diff --git a/Zend/tests/bug67436/bug67436_nohandler.phpt b/Zend/tests/bug67436/bug67436_nohandler.phpt
index d9e6e169ff..a155ccc842 100644
--- a/Zend/tests/bug67436/bug67436_nohandler.phpt
+++ b/Zend/tests/bug67436/bug67436_nohandler.phpt
@@ -1,11 +1,11 @@
--TEST--
-bug67436: E_STRICT instead of custom error handler
+bug67436: E_WARNING instead of custom error handler
--FILE--
<?php
spl_autoload_register(function($classname) {
if (in_array($classname, array('a','b','c'))) {
- require_once __DIR__ . "/{$classname}.php";
+ require_once __DIR__ . "/{$classname}.inc";
}
});
@@ -14,6 +14,6 @@ a::staticTest();
$b = new b();
$b->test();
--EXPECTF--
-Warning: Declaration of b::test() should be compatible with a::test($arg = c::TESTCONSTANT) in %s%ebug67436%eb.php on line %d
+Warning: Declaration of b::test() should be compatible with a::test($arg = c::TESTCONSTANT) in %s%ebug67436%eb.inc on line %d
b::test()
a::test(c::TESTCONSTANT)
diff --git a/Zend/tests/bug67436/c.php b/Zend/tests/bug67436/c.inc
index 47c848bfa0..47c848bfa0 100644
--- a/Zend/tests/bug67436/c.php
+++ b/Zend/tests/bug67436/c.inc
diff --git a/Zend/tests/bug69788.phpt b/Zend/tests/bug69788.phpt
index 326328ccfa..ff028411b1 100644
--- a/Zend/tests/bug69788.phpt
+++ b/Zend/tests/bug69788.phpt
@@ -3,6 +3,6 @@ Bug #69788: Malformed script causes Uncaught Error in php-cgi, valgrind SIGILL
--FILE--
<?php [t.[]]; ?>
--EXPECTF--
-Notice: Array to string conversion in %s on line %d
-
Warning: Use of undefined constant t - assumed 't' (this will throw an Error in a future version of PHP) in %s on line %d
+
+Notice: Array to string conversion in %s on line %d
diff --git a/Zend/tests/bug69892.phpt b/Zend/tests/bug69892.phpt
index d14f85fa52..f638044935 100644
--- a/Zend/tests/bug69892.phpt
+++ b/Zend/tests/bug69892.phpt
@@ -1,5 +1,5 @@
--TEST--
-Bug #69892: Different arrays compare indentical due to integer key truncation
+Bug #69892: Different arrays compare identical due to integer key truncation
--SKIPIF--
<?php if (PHP_INT_SIZE != 8) die("skip this test is for 64bit platforms only"); ?>
--FILE--
diff --git a/Zend/tests/bug70012.phpt b/Zend/tests/bug70012.phpt
index 5337649d2d..9e532218a9 100644
--- a/Zend/tests/bug70012.phpt
+++ b/Zend/tests/bug70012.phpt
@@ -15,7 +15,7 @@ try {
echo " Inner finally\n";
}
}
- echo "Outer shouldnt get here\n";
+ echo "Outer shouldn't get here\n";
} catch (Exception $e) {
echo "Outer catch\n";
} finally {
diff --git a/Zend/tests/bug70083.phpt b/Zend/tests/bug70083.phpt
index 6b20eabb39..5bc3656e9f 100644
--- a/Zend/tests/bug70083.phpt
+++ b/Zend/tests/bug70083.phpt
@@ -13,12 +13,17 @@ class foo {
function &noref() { $foo = 1; return $foo; }
$foo = new foo;
-$foo->i = &noref();
+try {
+ $foo->i = &noref();
+} catch (Error $e) {
+ echo $e->getMessage(), "\n";
+}
var_dump($foo);
?>
---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
+--EXPECT--
+Cannot assign by reference to overloaded object
+object(foo)#1 (1) {
+ ["var":"foo":private]=>
+ NULL
+}
diff --git a/Zend/tests/bug70253.phpt b/Zend/tests/bug70253.phpt
index dd760df28b..053e49d902 100644
--- a/Zend/tests/bug70253.phpt
+++ b/Zend/tests/bug70253.phpt
@@ -1,17 +1,8 @@
--TEST--
Bug #70253 (segfault at _efree () in zend_alloc.c:1389)
---INI--
-memory_limit=2M
---SKIPIF--
-<?php
-$zend_mm_enabled = getenv("USE_ZEND_ALLOC");
-if ($zend_mm_enabled === "0") {
- die("skip Zend MM disabled");
-}
-?>
--FILE--
<?php
unserialize('a:2:{i:0;O:9:"000000000":10000000');
?>
--EXPECTF--
-Fatal error: Allowed memory size of 2097152 bytes exhausted%s(tried to allocate %d bytes) in %s on line %d
+Notice: unserialize(): Error at offset 33 of 33 bytes in %s on line %d
diff --git a/Zend/tests/bug70662.phpt b/Zend/tests/bug70662.phpt
index 2bda8141ba..ab540c9d16 100644
--- a/Zend/tests/bug70662.phpt
+++ b/Zend/tests/bug70662.phpt
@@ -14,5 +14,5 @@ var_dump($a);
--EXPECT--
array(1) {
["b"]=>
- int(1)
+ int(2)
}
diff --git a/Zend/tests/bug70748.phpt b/Zend/tests/bug70748.phpt
index feb0e2a59d..d6703487ce 100644
--- a/Zend/tests/bug70748.phpt
+++ b/Zend/tests/bug70748.phpt
@@ -15,6 +15,6 @@ var_dump(parse_ini_file($ini_file));
unlink(__DIR__ . "/bug70748.ini");
?>
--EXPECTF--
-Warning: syntax error, unexpected $end, expecting '}' in %sbug70748.ini on line %d
+Warning: syntax error, unexpected end of file, expecting '}' in %sbug70748.ini on line %d
in %sbug70748.php on line %d
bool(false)
diff --git a/Zend/tests/bug70873.phpt b/Zend/tests/bug70873.phpt
index 3edb7eac43..aecc0e879b 100644
--- a/Zend/tests/bug70873.phpt
+++ b/Zend/tests/bug70873.phpt
@@ -27,7 +27,7 @@ $b = new C;
$b->bar();
?>
--EXPECTF--
-Fatal error: Uncaught Error: Cannot access property B::$x in %sbug70873.php:%d
+Fatal error: Uncaught Error: Cannot access private property B::$x in %sbug70873.php:%d
Stack trace:
#0 %sbug70873.php(%d): B->bar()
#1 {main}
diff --git a/Zend/tests/bug70967.phpt b/Zend/tests/bug70967.phpt
index 89fc80b3f7..d254ea8d89 100644
--- a/Zend/tests/bug70967.phpt
+++ b/Zend/tests/bug70967.phpt
@@ -11,4 +11,8 @@ class A {
echo (new A);
?>
--EXPECTF--
-Fatal error: Method A::__toString() must not throw an exception, caught Error: Call to undefined function undefined_function() in %sbug70967.php on line %d
+Fatal error: Uncaught Error: Call to undefined function undefined_function() in %s:%d
+Stack trace:
+#0 %s(%d): A->__toString()
+#1 {main}
+ thrown in %s on line %d
diff --git a/Zend/tests/bug71030.phpt b/Zend/tests/bug71030.phpt
new file mode 100644
index 0000000000..86d204bf62
--- /dev/null
+++ b/Zend/tests/bug71030.phpt
@@ -0,0 +1,28 @@
+--TEST--
+Bug #71030: Self-assignment in list() may have inconsistent behavior
+--FILE--
+<?php
+
+function test1() {
+ $a = [1, 2];
+ $c =& $a;
+ list($c, $b) = $a;
+ var_dump($a, $b);
+}
+
+function test2() {
+ $a = [1, 2];
+ $_a = "a";
+ list($$_a, $b) = $a;
+ var_dump($a, $b);
+}
+
+test1();
+test2();
+
+?>
+--EXPECT--
+int(1)
+int(2)
+int(1)
+int(2)
diff --git a/Zend/tests/bug71086.phpt b/Zend/tests/bug71086.phpt
index a7600c51fd..3e64f9c13a 100644
--- a/Zend/tests/bug71086.phpt
+++ b/Zend/tests/bug71086.phpt
@@ -9,6 +9,6 @@ var_dump($highlightedString);
?>
--EXPECT--
string(169) "<code><span style="color: #000000">
-<span style="color: #0000BB">&lt;?php&nbsp;<br />&nbsp;</span><span style="color: #007700">09&nbsp;09&nbsp;09;</span>
+<span style="color: #0000BB">&lt;?php&nbsp;<br />&nbsp;09&nbsp;09&nbsp;09</span><span style="color: #007700">;</span>
</span>
</code>"
diff --git a/Zend/tests/bug71428.1.phpt b/Zend/tests/bug71428.1.phpt
index 2e9a52d3d0..490fc30070 100644
--- a/Zend/tests/bug71428.1.phpt
+++ b/Zend/tests/bug71428.1.phpt
@@ -9,4 +9,4 @@ class B extends A {
public function m(array $a = []) {}
}
--EXPECTF--
-Warning: Declaration of B::m(array $a = Array) should be compatible with A::m(?array $a = NULL) in %sbug71428.1.php on line 7
+Warning: Declaration of B::m(array $a = Array) should be compatible with A::m(?array $a = NULL) in %sbug71428.1.php on line 6
diff --git a/Zend/tests/bug71539_5.phpt b/Zend/tests/bug71539_5.phpt
index 14559bf65e..7e89971ec2 100644
--- a/Zend/tests/bug71539_5.phpt
+++ b/Zend/tests/bug71539_5.phpt
@@ -7,7 +7,8 @@ $array['']->prop =& $array[0];
$array[0] = 42;
var_dump($array);
?>
---EXPECT--
+--EXPECTF--
+Warning: Creating default object from empty value in %sbug71539_5.php on line 3
array(2) {
[0]=>
&int(42)
diff --git a/Zend/tests/bug71572.phpt b/Zend/tests/bug71572.phpt
index 4eb16246a1..f4f44449cd 100644
--- a/Zend/tests/bug71572.phpt
+++ b/Zend/tests/bug71572.phpt
@@ -4,10 +4,10 @@ Bug #71572: String offset assignment from an empty string inserts null byte
<?php
$str = "abc";
-var_dump($str{0} = "");
-var_dump($str{1} = "");
-var_dump($str{3} = "");
-var_dump($str{10} = "");
+var_dump($str[0] = "");
+var_dump($str[1] = "");
+var_dump($str[3] = "");
+var_dump($str[10] = "");
var_dump($str);
?>
==DONE==
diff --git a/Zend/tests/bug71818.phpt b/Zend/tests/bug71818.phpt
index e09255ddac..67094c09f7 100644
--- a/Zend/tests/bug71818.phpt
+++ b/Zend/tests/bug71818.phpt
@@ -19,7 +19,7 @@ class MemoryLeak
private $things = [];
}
-ini_set('memory_limit', '10M');
+ini_set('memory_limit', '20M');
for ($i = 0; $i < 100000; ++$i) {
$obj = new MemoryLeak();
diff --git a/Zend/tests/bug72162.phpt b/Zend/tests/bug72162.phpt
index 493342d838..44237038a1 100644
--- a/Zend/tests/bug72162.phpt
+++ b/Zend/tests/bug72162.phpt
@@ -7,4 +7,8 @@ $var11 = new StdClass();
$var16 = error_reporting($var11);
?>
--EXPECTF--
-Recoverable fatal error: Object of class stdClass could not be converted to string in %sbug72162.php on line %d
+Fatal error: Uncaught Error: Object of class stdClass could not be converted to string in %s:%d
+Stack trace:
+#0 %s(%d): error_reporting(Object(stdClass))
+#1 {main}
+ thrown in %s on line %d
diff --git a/Zend/tests/bug72530.phpt b/Zend/tests/bug72530.phpt
new file mode 100644
index 0000000000..b70be0b98f
--- /dev/null
+++ b/Zend/tests/bug72530.phpt
@@ -0,0 +1,31 @@
+--TEST--
+Bug #72530: Use After Free in GC with Certain Destructors
+--FILE--
+<?php
+
+class ryat {
+ var $ryat;
+ var $chtg;
+
+ function __destruct() {
+ $this->chtg = $this->ryat;
+ $this->ryat = 1;
+ }
+}
+
+$o = new ryat;
+$o->ryat = $o;
+$x =& $o->chtg;
+
+unset($o);
+gc_collect_cycles();
+var_dump($x);
+
+?>
+--EXPECT--
+object(ryat)#1 (2) {
+ ["ryat"]=>
+ int(1)
+ ["chtg"]=>
+ *RECURSION*
+}
diff --git a/Zend/tests/bug72944.phpt b/Zend/tests/bug72944.phpt
index 5f494beb40..0ee8bd62c6 100644
--- a/Zend/tests/bug72944.phpt
+++ b/Zend/tests/bug72944.phpt
@@ -2,7 +2,7 @@
Bug #72944 (Null pointer deref in zval_delref_p).
--FILE--
<?php
-"a"== e & $A = $A? 0 : 0 ?:0;
+("a"== e & $A = $A? 0 : 0) ?:0;
echo "OK\n";
?>
--EXPECTF--
diff --git a/Zend/tests/bug73663.phpt b/Zend/tests/bug73663.phpt
index 66b9a0565d..06dd7f6700 100644
--- a/Zend/tests/bug73663.phpt
+++ b/Zend/tests/bug73663.phpt
@@ -14,12 +14,11 @@ $func = function (&$ref) {
$array = [1];
var_dump(list($val) = $array); // NG: Invalid opcode
-change(list($val) = $array);
+change(list(&$val) = $array);
var_dump($array);
$array = [1];
-
-$func(list($val) = $array);
+$func(list(&$val) = $array);
var_dump($array);
?>
--EXPECT--
diff --git a/Zend/tests/bug73663_2.phpt b/Zend/tests/bug73663_2.phpt
new file mode 100644
index 0000000000..660a4f845e
--- /dev/null
+++ b/Zend/tests/bug73663_2.phpt
@@ -0,0 +1,15 @@
+--TEST--
+Bug #73663.2 ("Invalid opcode 65/16/8" occurs with a variable created with list())
+--FILE--
+<?php
+function change(&$ref) {
+ $ref = range(1, 10);
+ return;
+}
+
+$array = [1];
+change(list($val) = $array);
+var_dump($array);
+?>
+--EXPECTF--
+Fatal error: Only variables can be passed by reference in %s on line %d
diff --git a/Zend/tests/bug73816.phpt b/Zend/tests/bug73816.phpt
new file mode 100644
index 0000000000..aea392be5e
--- /dev/null
+++ b/Zend/tests/bug73816.phpt
@@ -0,0 +1,24 @@
+--TEST--
+Bug #73816: Broken eval(anonymous class)
+--FILE--
+<?php
+
+function anon()
+{
+ static $i = 0;
+ return eval(sprintf('return new class { private $prop%s; };', ++$i));
+}
+
+var_dump(anon());
+var_dump(anon());
+
+?>
+--EXPECT--
+object(class@anonymous)#1 (1) {
+ ["prop1":"class@anonymous":private]=>
+ NULL
+}
+object(class@anonymous)#1 (1) {
+ ["prop2":"class@anonymous":private]=>
+ NULL
+}
diff --git a/Zend/tests/bug75420.phpt b/Zend/tests/bug75420.phpt
index 5528ad301b..05ef892879 100644
--- a/Zend/tests/bug75420.phpt
+++ b/Zend/tests/bug75420.phpt
@@ -1,5 +1,5 @@
--TEST--
-Bug #75420 (Crash when modifing property name in __isset for BP_VAR_IS)
+Bug #75420 (Crash when modifying property name in __isset for BP_VAR_IS)
--FILE--
<?php
diff --git a/Zend/tests/bug75573.phpt b/Zend/tests/bug75573.phpt
index 476ff6e6cf..f5e87f8283 100644
--- a/Zend/tests/bug75573.phpt
+++ b/Zend/tests/bug75573.phpt
@@ -6,10 +6,6 @@ Bug #75573 (Segmentation fault in 7.1.12 and 7.0.26)
class A
{
var $_stdObject;
- function initialize($properties = FALSE) {
- $this->_stdObject = $properties ? (object) $properties : new stdClass();
- parent::initialize();
- }
function &__get($property)
{
if (isset($this->_stdObject->{$property})) {
@@ -31,10 +27,6 @@ class A
class B extends A
{
- function initialize($properties = array())
- {
- parent::initialize($properties);
- }
function &__get($property)
{
if (isset($this->settings) && isset($this->settings[$property])) {
diff --git a/Zend/tests/bug75921.phpt b/Zend/tests/bug75921.phpt
new file mode 100644
index 0000000000..917dd413cc
--- /dev/null
+++ b/Zend/tests/bug75921.phpt
@@ -0,0 +1,80 @@
+--TEST--
+Bug #75921: Inconsistent error when creating stdObject from empty variable
+--FILE--
+<?php
+
+$null->a = 42;
+var_dump($null);
+unset($null);
+
+$null->a['hello'] = 42;
+var_dump($null);
+unset($null);
+
+$null->a->b = 42;
+var_dump($null);
+unset($null);
+
+$null->a['hello']->b = 42;
+var_dump($null);
+unset($null);
+
+$null->a->b['hello'] = 42;
+var_dump($null);
+unset($null);
+
+?>
+--EXPECTF--
+Warning: Creating default object from empty value in %sbug75921.php on line 3
+object(stdClass)#1 (1) {
+ ["a"]=>
+ int(42)
+}
+
+Warning: Creating default object from empty value in %sbug75921.php on line 7
+object(stdClass)#1 (1) {
+ ["a"]=>
+ array(1) {
+ ["hello"]=>
+ int(42)
+ }
+}
+
+Warning: Creating default object from empty value in %sbug75921.php on line 11
+
+Warning: Creating default object from empty value in %sbug75921.php on line 11
+object(stdClass)#1 (1) {
+ ["a"]=>
+ object(stdClass)#2 (1) {
+ ["b"]=>
+ int(42)
+ }
+}
+
+Warning: Creating default object from empty value in %sbug75921.php on line 15
+
+Warning: Creating default object from empty value in %sbug75921.php on line 15
+object(stdClass)#1 (1) {
+ ["a"]=>
+ array(1) {
+ ["hello"]=>
+ object(stdClass)#2 (1) {
+ ["b"]=>
+ int(42)
+ }
+ }
+}
+
+Warning: Creating default object from empty value in %sbug75921.php on line 19
+
+Warning: Creating default object from empty value in %sbug75921.php on line 19
+object(stdClass)#1 (1) {
+ ["a"]=>
+ object(stdClass)#2 (1) {
+ ["b"]=>
+ array(1) {
+ ["hello"]=>
+ int(42)
+ }
+ }
+}
diff --git a/Zend/tests/bug76430.phpt b/Zend/tests/bug76430.phpt
new file mode 100644
index 0000000000..f122d00984
--- /dev/null
+++ b/Zend/tests/bug76430.phpt
@@ -0,0 +1,22 @@
+--TEST--
+Bug #76430: __METHOD__ inconsistent outside of method
+--FILE--
+<?php
+
+class Foo {
+ const X = __METHOD__;
+}
+function foo() {
+ class Bar {
+ const X = __METHOD__;
+ }
+}
+
+foo();
+var_dump(Foo::X);
+var_dump(Bar::X);
+
+?>
+--EXPECT--
+string(0) ""
+string(0) ""
diff --git a/Zend/tests/bug76451.inc b/Zend/tests/bug76451.inc
new file mode 100644
index 0000000000..18d3b50789
--- /dev/null
+++ b/Zend/tests/bug76451.inc
@@ -0,0 +1,4 @@
+<?php
+
+class Foo {}
+class_alias('Foo', 'Bar');
diff --git a/Zend/tests/bug76451.phpt b/Zend/tests/bug76451.phpt
new file mode 100644
index 0000000000..ad72056e4b
--- /dev/null
+++ b/Zend/tests/bug76451.phpt
@@ -0,0 +1,16 @@
+--TEST--
+Bug #76451: Aliases during inheritance type checks affected by opcache
+--FILE--
+<?php
+require __DIR__ . "/bug76451.inc";
+
+class A {
+ public function test(Foo $foo) {}
+}
+class B extends A {
+ public function test(Bar $foo) {}
+}
+?>
+===DONE===
+--EXPECT--
+===DONE===
diff --git a/Zend/tests/bug76451_2.inc b/Zend/tests/bug76451_2.inc
new file mode 100644
index 0000000000..df7cfd6645
--- /dev/null
+++ b/Zend/tests/bug76451_2.inc
@@ -0,0 +1,8 @@
+<?php
+class A {
+ public function test(Foo $foo) {}
+}
+class B extends A {
+ public function test(Bar $foo) {}
+}
+?>
diff --git a/Zend/tests/bug76451_2.phpt b/Zend/tests/bug76451_2.phpt
new file mode 100644
index 0000000000..75cacccf30
--- /dev/null
+++ b/Zend/tests/bug76451_2.phpt
@@ -0,0 +1,12 @@
+--TEST--
+Bug #76451: Aliases during inheritance type checks affected by opcache (variation)
+--FILE--
+<?php
+class Foo {}
+class_alias('Foo', 'Bar');
+
+require __DIR__ . '/bug76451_2.inc';
+?>
+===DONE===
+--EXPECT--
+===DONE===
diff --git a/Zend/tests/bug76860.phpt b/Zend/tests/bug76860.phpt
new file mode 100644
index 0000000000..046edba7f2
--- /dev/null
+++ b/Zend/tests/bug76860.phpt
@@ -0,0 +1,31 @@
+--TEST--
+Bug #76860 (Missed "Accessing static property as non static" warning)
+--FILE--
+<?php
+class A {
+ private static $a = "a";
+ protected static $b = "b";
+ public static $c = "c";
+ public function __construct() {
+ var_dump($this->a, $this->b, $this->c);
+ }
+}
+class B extends A {
+}
+new B;
+?>
+--EXPECTF--
+Notice: Accessing static property B::$a as non static in %sbug76860.php on line 7
+
+Notice: Undefined property: B::$a in %sbug76860.php on line 7
+
+Notice: Accessing static property B::$b as non static in %sbug76860.php on line 7
+
+Notice: Undefined property: B::$b in %sbug76860.php on line 7
+
+Notice: Accessing static property B::$c as non static in %sbug76860.php on line 7
+
+Notice: Undefined property: B::$c in %sbug76860.php on line 7
+NULL
+NULL
+NULL
diff --git a/Zend/tests/bug76860_2.phpt b/Zend/tests/bug76860_2.phpt
new file mode 100644
index 0000000000..bc92702fc1
--- /dev/null
+++ b/Zend/tests/bug76860_2.phpt
@@ -0,0 +1,34 @@
+--TEST--
+Bug #76860 (Missed "Accessing static property as non static" warning)
+--FILE--
+<?php
+class A {
+ private static $a = "a";
+ private static $b = "b";
+ private static $c = "c";
+ public function __construct() {
+ var_dump($this->a, $this->b, $this->c);
+ }
+}
+class B extends A {
+ private static $a = "a1";
+ protected static $b = "b1";
+ public static $c = "c1";
+}
+new B;
+?>
+--EXPECTF--
+Notice: Accessing static property B::$a as non static in %sbug76860_2.php on line 7
+
+Notice: Undefined property: B::$a in %sbug76860_2.php on line 7
+
+Notice: Accessing static property B::$b as non static in %sbug76860_2.php on line 7
+
+Notice: Undefined property: B::$b in %sbug76860_2.php on line 7
+
+Notice: Accessing static property B::$c as non static in %sbug76860_2.php on line 7
+
+Notice: Undefined property: B::$c in %sbug76860_2.php on line 7
+NULL
+NULL
+NULL
diff --git a/Zend/tests/bug77613.phpt b/Zend/tests/bug77613.phpt
new file mode 100644
index 0000000000..02d7ad4b72
--- /dev/null
+++ b/Zend/tests/bug77613.phpt
@@ -0,0 +1,19 @@
+--TEST--
+Bug #77613 (method visibility change)
+--FILE--
+<?php
+class A {
+ public function __construct() {
+ static $foo;
+ }
+}
+
+class B extends A { }
+
+class C extends B {
+ private function __construct() {}
+}
+?>
+OK
+--EXPECT--
+OK
diff --git a/Zend/tests/bug77877.phpt b/Zend/tests/bug77877.phpt
new file mode 100644
index 0000000000..d4627f77c8
--- /dev/null
+++ b/Zend/tests/bug77877.phpt
@@ -0,0 +1,23 @@
+--TEST--
+Bug #77877 call_user_func() passes $this to static methods
+--FILE--
+<?php
+class Foo {
+ static public function bar() {
+ var_dump($this);
+ }
+}
+try {
+ array_map([new Foo, 'bar'],[1]);
+} catch (Throwable $e) {
+ echo $e->getMessage() . "\n";
+}
+try {
+ call_user_func([new Foo, 'bar']);
+} catch (Throwable $e) {
+ echo $e->getMessage() . "\n";
+}
+?>
+--EXPECT--
+Using $this when not in object context
+Using $this when not in object context
diff --git a/Zend/tests/bug78151.phpt b/Zend/tests/bug78151.phpt
new file mode 100644
index 0000000000..87b98a4e44
--- /dev/null
+++ b/Zend/tests/bug78151.phpt
@@ -0,0 +1,23 @@
+--TEST--
+Bug #78151 Segfault caused by indirect expressions in PHP 7.4a1
+--FILE--
+<?php
+
+class Arr
+{
+ private $foo = '';
+
+ public function __construct(array $array = [])
+ {
+ $property = 'foo';
+
+ $this->{$property} = &$array[$property];
+
+ \var_dump($this->foo);
+ }
+}
+
+$arr = new Arr(['foo' => 'bar']);
+?>
+--EXPECT--
+string(3) "bar"
diff --git a/Zend/tests/bug78154.phpt b/Zend/tests/bug78154.phpt
new file mode 100644
index 0000000000..2a69ebe811
--- /dev/null
+++ b/Zend/tests/bug78154.phpt
@@ -0,0 +1,23 @@
+--TEST--
+Bug #78154: SEND_VAR_NO_REF does not always send reference
+--FILE--
+<?php
+
+namespace {
+ var_dump(similar_text('a', 'a', $c=0x44444444));
+ var_dump($c);
+}
+namespace Foo {
+ var_dump(similar_text('a', 'a', $d=0x44444444));
+ var_dump($d);
+}
+
+?>
+--EXPECTF--
+Notice: Only variables should be passed by reference in %s on line %d
+int(1)
+int(1145324612)
+
+Notice: Only variables should be passed by reference in %s on line %d
+int(1)
+int(1145324612)
diff --git a/Zend/tests/bug78182.phpt b/Zend/tests/bug78182.phpt
new file mode 100644
index 0000000000..4b0f08dc3b
--- /dev/null
+++ b/Zend/tests/bug78182.phpt
@@ -0,0 +1,15 @@
+--TEST--
+Bug #78182: Segmentation fault during by-reference property assignment
+--FILE--
+<?php
+$varName = 'var';
+$propName = 'prop';
+$$varName->$propName =& $$varName;
+var_dump($var);
+?>
+--EXPECTF--
+Warning: Creating default object from empty value in %s on line %d
+object(stdClass)#1 (1) {
+ ["prop"]=>
+ *RECURSION*
+}
diff --git a/Zend/tests/bug78239.phpt b/Zend/tests/bug78239.phpt
new file mode 100644
index 0000000000..94908a785b
--- /dev/null
+++ b/Zend/tests/bug78239.phpt
@@ -0,0 +1,30 @@
+--TEST--
+Bug #78239: Deprecation notice during string conversion converted to exception hangs
+--FILE--
+<?php
+function handleError($level, $message, $file = '', $line = 0, $context = [])
+{
+ throw new ErrorException($message, 0, $level, $file, $line);
+}
+
+set_error_handler('handleError');
+
+class A
+{
+
+ public function abc(): bool
+ {
+ return false;
+ }
+}
+
+$r = new ReflectionMethod("A", "abc");
+(string)$r->getReturnType() ?: "";
+
+?>
+--EXPECTF--
+Fatal error: Uncaught ErrorException: Function ReflectionType::__toString() is deprecated in %s:%d
+Stack trace:
+#0 %s(%d): handleError(%s)
+#1 {main}
+ thrown in %s on line %d
diff --git a/Zend/tests/bug78335.phpt b/Zend/tests/bug78335.phpt
new file mode 100644
index 0000000000..68e885885e
--- /dev/null
+++ b/Zend/tests/bug78335.phpt
@@ -0,0 +1,28 @@
+--TEST--
+Bug #78335: Static properties/variables containing cycles report as leak
+--FILE--
+<?php
+
+class Test {
+ public static $test;
+
+ public static function method() {
+ static $foo;
+ $foo = [&$foo];
+ }
+}
+
+function test() {
+ static $foo;
+ $foo = [&$foo];
+}
+
+$foo = [&$foo];
+Test::$test = $foo;
+test();
+Test::method();
+
+?>
+===DONE===
+--EXPECT--
+===DONE===
diff --git a/Zend/tests/bug78335_2.phpt b/Zend/tests/bug78335_2.phpt
new file mode 100644
index 0000000000..5fb5fcb788
--- /dev/null
+++ b/Zend/tests/bug78335_2.phpt
@@ -0,0 +1,14 @@
+--TEST--
+Bug #78335: Static properties containing cycles report as leak (internal class variant)
+--SKIPIF--
+<?php if (!extension_loaded("zend-test")) die("skip requires zend-test"); ?>
+--FILE--
+<?php
+
+$foo = [&$foo];
+_ZendTestClass::$_StaticProp = $foo;
+
+?>
+===DONE===
+--EXPECT--
+===DONE===
diff --git a/Zend/tests/bug78340.phpt b/Zend/tests/bug78340.phpt
new file mode 100644
index 0000000000..06acf9ef88
--- /dev/null
+++ b/Zend/tests/bug78340.phpt
@@ -0,0 +1,54 @@
+--TEST--
+Bug #78340: Include of stream wrapper not reading whole file
+--FILE--
+<?php
+
+class lib {
+ public static $files= [];
+
+ private $bytes, $pos;
+
+ function stream_open($path, $mode, $options, $opened_path) {
+ $this->bytes= self::$files[$path];
+ $this->pos= 0;
+ $this->ino= crc32($path);
+ return true;
+ }
+
+ function stream_read($count) {
+ $chunk= substr($this->bytes, $this->pos, $count);
+ $this->pos+= strlen($chunk);
+ return $chunk;
+ }
+
+ function stream_eof() {
+ return $this->pos >= strlen($this->bytes);
+ }
+
+ function stream_close() {
+ $this->bytes= null;
+ }
+
+ function stream_stat() {
+ return [
+ 'dev' => 3632233996,
+ 'size' => strlen($this->bytes),
+ 'ino' => $this->ino
+ ];
+ }
+
+ function stream_set_option($option, $arg1, $arg2) {
+ return false;
+ }
+}
+
+$fill = str_repeat('.', 8192);
+lib::$files['lib://test.php']= '<?php /* '.$fill.' */ function test() { echo "Works!\n"; }';
+stream_wrapper_register('lib', lib::class);
+
+include('lib://test.php');
+test();
+
+?>
+--EXPECT--
+Works!
diff --git a/Zend/tests/bug78344.phpt b/Zend/tests/bug78344.phpt
new file mode 100644
index 0000000000..c1ff5e0b40
--- /dev/null
+++ b/Zend/tests/bug78344.phpt
@@ -0,0 +1,24 @@
+--TEST--
+Bug #78344: Segmentation fault on zend_check_protected
+--FILE--
+<?php
+
+class A {
+ protected const FOO = 1;
+}
+
+class B {}
+class C extends B {
+ public function method() {
+ var_dump(A::FOO);
+ }
+}
+(new C)->method();
+
+?>
+--EXPECTF--
+Fatal error: Uncaught Error: Cannot access protected const A::FOO in %s:%d
+Stack trace:
+#0 %s(%d): C->method()
+#1 {main}
+ thrown in %s on line %d
diff --git a/Zend/tests/bug78356.phpt b/Zend/tests/bug78356.phpt
new file mode 100644
index 0000000000..3c24f0a3e9
--- /dev/null
+++ b/Zend/tests/bug78356.phpt
@@ -0,0 +1,20 @@
+--TEST--
+Bug #78356: Array returned from ArrayAccess is incorrectly unpacked as argument
+--FILE--
+<?php
+$object = new class implements ArrayAccess {
+ public function offsetGet($offset)
+ {
+ return [1, 2];
+ }
+ public function offsetExists($offset)
+ {
+ return true;
+ }
+ public function offsetUnset($offset) {}
+ public function offsetSet($offset, $value) {}
+};
+var_dump(max(...$object[0]));
+?>
+--EXPECT--
+int(2)
diff --git a/Zend/tests/bug78396.phpt b/Zend/tests/bug78396.phpt
new file mode 100644
index 0000000000..1f08a47dc4
--- /dev/null
+++ b/Zend/tests/bug78396.phpt
@@ -0,0 +1,18 @@
+--TEST--
+Bug #78396: Second file_put_contents in Shutdown hangs script
+--FILE--
+<?php
+
+register_shutdown_function(function () {
+ file_put_contents(__DIR__ . '/bug78396.txt', '1', FILE_APPEND | LOCK_EX);
+ file_put_contents(__DIR__ . '/bug78396.txt', '2', FILE_APPEND | LOCK_EX);
+ echo "Done\n";
+});
+
+?>
+--CLEAN--
+<?php
+unlink(__DIR__ . '/bug78396.txt');
+?>
+--EXPECT--
+Done
diff --git a/Zend/tests/bug78406.phpt b/Zend/tests/bug78406.phpt
new file mode 100644
index 0000000000..64fd2a1945
--- /dev/null
+++ b/Zend/tests/bug78406.phpt
@@ -0,0 +1,44 @@
+--TEST--
+Bug #78406: Broken file includes with user-defined stream filters
+--FILE--
+<?php
+
+echo "bug\n"; // Should be transformed by filter on second include
+
+if (!class_exists(SampleFilter::class)) {
+ class SampleFilter extends php_user_filter
+ {
+ private $data = '';
+
+ public function filter($in, $out, &$consumed, $closing)
+ {
+ while ($bucket = stream_bucket_make_writeable($in))
+ {
+ $this->data .= $bucket->data;
+ }
+
+ if ($closing || feof($this->stream))
+ {
+ $consumed = strlen($this->data);
+
+ $this->data = str_replace('bug', 'feature', $this->data);
+
+ $bucket = stream_bucket_new($this->stream, $this->data);
+ stream_bucket_append($out, $bucket);
+
+ return PSFS_PASS_ON;
+ }
+
+ return PSFS_FEED_ME;
+ }
+ }
+ stream_filter_register('sample.filter', SampleFilter::class);
+ $uri = 'php://filter/read=sample.filter/resource='. __FILE__;
+
+ include $uri; // We expect one more "feature" output at line 3
+}
+
+?>
+--EXPECT--
+bug
+feature
diff --git a/Zend/tests/bug78454_1.phpt b/Zend/tests/bug78454_1.phpt
new file mode 100644
index 0000000000..184d358372
--- /dev/null
+++ b/Zend/tests/bug78454_1.phpt
@@ -0,0 +1,7 @@
+--TEST--
+Invalid consecutive numeric separators after hex literal
+--FILE--
+<?php
+0x0__F;
+--EXPECTF--
+Parse error: syntax error, unexpected '__F' (T_STRING) in %s on line %d
diff --git a/Zend/tests/bug78454_2.phpt b/Zend/tests/bug78454_2.phpt
new file mode 100644
index 0000000000..b67b8396ac
--- /dev/null
+++ b/Zend/tests/bug78454_2.phpt
@@ -0,0 +1,7 @@
+--TEST--
+Invalid consecutive numeric separators after binary literal
+--FILE--
+<?php
+0b0__1
+--EXPECTF--
+Parse error: syntax error, unexpected '__1' (T_STRING) in %s on line %d
diff --git a/Zend/tests/bug78502.phpt b/Zend/tests/bug78502.phpt
new file mode 100644
index 0000000000..1f83e27644
--- /dev/null
+++ b/Zend/tests/bug78502.phpt
@@ -0,0 +1,31 @@
+--TEST--
+Bug #78502: Incorrect stack size calculation for indirectly recursive function call
+--FILE--
+<?php
+
+$tree = [
+ 'name' => 'a',
+ 'quant' => 1,
+ 'children' => [
+ ['name' => 'b', 'quant' => 1],
+ ['name' => 'c', 'quant' => 1, 'children' => [
+ ['name' => 'd', 'quant' => 1],
+ ]],
+ ],
+];
+
+function tree_map($tree, $recursive_attr, closure $callback){
+ if(isset($tree[$recursive_attr])){
+ $tree[$recursive_attr] = array_map(function($c) use($recursive_attr, $callback){
+ return tree_map($c, $recursive_attr, $callback);
+ }, $tree[$recursive_attr]);
+ }
+ return $callback($tree);
+}
+
+tree_map($tree, 'children', function ($node) {});
+
+?>
+===DONE===
+--EXPECT--
+===DONE===
diff --git a/Zend/tests/bug78531.phpt b/Zend/tests/bug78531.phpt
new file mode 100644
index 0000000000..ba460ee05a
--- /dev/null
+++ b/Zend/tests/bug78531.phpt
@@ -0,0 +1,18 @@
+--TEST--
+Bug #78531 (Crash when using undefined variable as object)
+--FILE--
+<?php
+@$u1->a += 5;
+var_dump($u1->a);
+@$x = ++$u2->a;
+var_dump($u2->a);
+@$x = $u3->a++;
+var_dump($u3->a);
+@$u4->a->a += 5;
+var_dump($u4->a->a);
+?>
+--EXPECT--
+int(5)
+int(1)
+int(1)
+int(5) \ No newline at end of file
diff --git a/Zend/tests/bug78589.phpt b/Zend/tests/bug78589.phpt
new file mode 100644
index 0000000000..ac4761f794
--- /dev/null
+++ b/Zend/tests/bug78589.phpt
@@ -0,0 +1,19 @@
+--TEST--
+Bug #78589: Memory leak with GC + __destruct()
+--FILE--
+<?php
+
+class Test {
+ public function __destruct() {}
+}
+
+$test = new Test;
+$test->foo = [&$test->foo];
+$ary = [&$ary, $test];
+unset($ary, $test);
+gc_collect_cycles();
+
+?>
+===DONE===
+--EXPECT--
+===DONE===
diff --git a/Zend/tests/bug78598.phpt b/Zend/tests/bug78598.phpt
new file mode 100644
index 0000000000..7e3559f27c
--- /dev/null
+++ b/Zend/tests/bug78598.phpt
@@ -0,0 +1,31 @@
+--TEST--
+Bug #78598: Changing array during undef index RW error segfaults
+--FILE--
+<?php
+
+$my_var = null;
+set_error_handler(function() use(&$my_var) {
+ $my_var = 0;
+});
+
+$my_var[0] .= "xyz";
+var_dump($my_var);
+
+$my_var = null;
+$my_var[0][0][0] .= "xyz";
+var_dump($my_var);
+
+$my_var = null;
+$my_var["foo"] .= "xyz";
+var_dump($my_var);
+
+$my_var = null;
+$my_var["foo"]["bar"]["baz"] .= "xyz";
+var_dump($my_var);
+
+?>
+--EXPECT--
+int(0)
+int(0)
+int(0)
+int(0)
diff --git a/Zend/tests/bug78644.phpt b/Zend/tests/bug78644.phpt
new file mode 100644
index 0000000000..3889e9fb05
--- /dev/null
+++ b/Zend/tests/bug78644.phpt
@@ -0,0 +1,16 @@
+--TEST--
+Bug #78644: SEGFAULT in ZEND_UNSET_OBJ_SPEC_VAR_CONST_HANDLER
+--FILE--
+<?php
+
+$a = new stdClass;
+unset($a->b->c->d);
+unset($a->b->c['d']);
+var_dump($a);
+
+?>
+--EXPECT--
+object(stdClass)#1 (1) {
+ ["b"]=>
+ NULL
+}
diff --git a/Zend/tests/bug78776.phpt b/Zend/tests/bug78776.phpt
new file mode 100644
index 0000000000..3696d955a3
--- /dev/null
+++ b/Zend/tests/bug78776.phpt
@@ -0,0 +1,28 @@
+--TEST--
+Bug #78776: Abstract method implementation from trait does not check "static"
+--FILE--
+<?php
+
+abstract class A
+{
+ abstract public function createApp();
+}
+
+class B extends A
+{
+ use C;
+}
+
+trait C
+{
+ public static function createApp()
+ {
+ echo "You should not be here\n";
+ }
+}
+
+B::createApp();
+
+?>
+--EXPECTF--
+Fatal error: Cannot make non static method A::createApp() static in class C in %s on line %d
diff --git a/Zend/tests/bug78810.phpt b/Zend/tests/bug78810.phpt
new file mode 100644
index 0000000000..0fd56f0ced
--- /dev/null
+++ b/Zend/tests/bug78810.phpt
@@ -0,0 +1,25 @@
+--TEST--
+Bug #78810: RW fetches do not throw "uninitialized property" exception
+--FILE--
+<?php
+
+class Test {
+ public int $i;
+}
+
+$test = new Test;
+try {
+ $test->i++;
+} catch (Error $e) {
+ echo $e->getMessage(), "\n";
+}
+try {
+ $test->i += 1;
+} catch (Error $e) {
+ echo $e->getMessage(), "\n";
+}
+
+?>
+--EXPECT--
+Typed property Test::$i must not be accessed before initialization
+Typed property Test::$i must not be accessed before initialization
diff --git a/Zend/tests/bug78898.phpt b/Zend/tests/bug78898.phpt
new file mode 100644
index 0000000000..9efd1416e2
--- /dev/null
+++ b/Zend/tests/bug78898.phpt
@@ -0,0 +1,34 @@
+--TEST--
+Bug #78898: call_user_func(['parent', ...]) fails while other succeed
+--FILE--
+<?php
+
+class A
+{
+ protected function _x()
+ {
+ echo "a";
+ }
+
+ public function __call($methodName, array $arguments)
+ {
+ throw new Exception("Unknown method.");
+ }
+}
+
+class B extends A
+{
+ public function x()
+ {
+ parent::_x();
+ call_user_func('parent::_x');
+ call_user_func(['parent', '_x']);
+ }
+}
+
+$b = new B;
+$b->x();
+
+?>
+--EXPECT--
+aaa
diff --git a/Zend/tests/bug78926.phpt b/Zend/tests/bug78926.phpt
new file mode 100644
index 0000000000..5df92bdb5a
--- /dev/null
+++ b/Zend/tests/bug78926.phpt
@@ -0,0 +1,22 @@
+--TEST--
+Bug #78926: Segmentation fault on Symfony cache:clear
+--FILE--
+<?php
+
+spl_autoload_register(function($class) {
+ for ($i = 0; $i < 100; $i++) {
+ eval("class C$i {}");
+ }
+});
+
+try {
+ class B extends A {}
+} catch (Error $e) {
+ echo $e->getMessage(), "\n";
+}
+var_dump(class_exists('B', false));
+
+?>
+--EXPECT--
+Class 'A' not found
+bool(false)
diff --git a/Zend/tests/bug78973.phpt b/Zend/tests/bug78973.phpt
new file mode 100644
index 0000000000..688f4e6cc5
--- /dev/null
+++ b/Zend/tests/bug78973.phpt
@@ -0,0 +1,18 @@
+--TEST--
+Bug #78973: Destructor during CV freeing causes segfault if opline never saved
+--INI--
+opcache.optimization_level=0
+--FILE--
+<?php
+
+function test($x) {
+}
+test(new class {
+ public function __destruct() {
+ debug_print_backtrace();
+ }
+});
+
+?>
+--EXPECTF--
+#0 class@anonymous->__destruct() called at [%s:%d]
diff --git a/Zend/tests/bug79022.phpt b/Zend/tests/bug79022.phpt
new file mode 100644
index 0000000000..0657b20355
--- /dev/null
+++ b/Zend/tests/bug79022.phpt
@@ -0,0 +1,39 @@
+--TEST--
+Bug #79022 (class_exists returns True for classes that are not ready to be used)
+--FILE--
+<?php
+function my_autoloader($class) {
+ if (class_exists('Foo', 0)) {
+ new Foo();
+ }
+ if ($class == 'Foo') {
+ eval("class Foo extends Bar{}");
+ }
+
+ if ($class == 'Bar') {
+ eval("class Bar {}");
+ }
+
+ if ($class == 'Dummy') {
+ eval ("class Dummy implements iFoo {}");
+ }
+
+
+ if (interface_exists('iFoo', 0)) {
+ new Dummy();
+ }
+ if ($class == 'iFoo') {
+ eval ("interface iFoo extends iBar {}");
+ }
+
+ if ($class == 'iBar') {
+ eval ("interface iBar {}");
+ }
+}
+spl_autoload_register('my_autoloader');
+new Foo();
+new Dummy();
+echo "okey";
+?>
+--EXPECT--
+okey
diff --git a/Zend/tests/bug79155.phpt b/Zend/tests/bug79155.phpt
new file mode 100644
index 0000000000..be9488da86
--- /dev/null
+++ b/Zend/tests/bug79155.phpt
@@ -0,0 +1,36 @@
+--TEST--
+Bug #79155: Property nullability lost when using multiple property definition
+--FILE--
+<?php
+
+class Foo {
+ public ?string $a, $b;
+ public ?stdClass $c, $d;
+}
+
+$t = new Foo;
+$t->a = "str";
+$t->b = "str";
+$t->c = new stdClass;
+$t->d = new stdClass;
+
+var_dump($t->a, $t->b, $t->c, $t->d);
+
+$t->a = null;
+$t->b = null;
+$t->c = null;
+$t->d = null;
+var_dump($t->a, $t->b, $t->c, $t->d);
+
+?>
+--EXPECT--
+string(3) "str"
+string(3) "str"
+object(stdClass)#2 (0) {
+}
+object(stdClass)#3 (0) {
+}
+NULL
+NULL
+NULL
+NULL
diff --git a/Zend/tests/bug79514.phpt b/Zend/tests/bug79514.phpt
new file mode 100644
index 0000000000..5182489964
--- /dev/null
+++ b/Zend/tests/bug79514.phpt
@@ -0,0 +1,13 @@
+--TEST--
+Bug #79514 (Memory leaks while including unexistent file)
+--FILE--
+<?php
+$mem1 = memory_get_usage(true);
+for ($i = 0; $i < 100000; $i++) {
+ @include __DIR__ . '/bug79514.doesnotexist';
+}
+$mem2 = memory_get_usage(true);
+var_dump($mem2 - $mem1 < 100000);
+?>
+--EXPECT--
+bool(true)
diff --git a/Zend/tests/bug79599.phpt b/Zend/tests/bug79599.phpt
new file mode 100644
index 0000000000..d3ae8edacc
--- /dev/null
+++ b/Zend/tests/bug79599.phpt
@@ -0,0 +1,27 @@
+--TEST--
+Bug #79599 (coredump in set_error_handler)
+--FILE--
+<?php
+set_error_handler(function($code, $message){
+ throw new \Exception($message);
+});
+function test1(){
+ $a[] = $b;
+}
+function test2(){
+ $a[$c] = $b;
+}
+try{
+ test1();
+}catch(\Exception $e){
+ var_dump($e->getMessage());
+}
+try{
+ test2();
+}catch(\Exception $e){
+ var_dump($e->getMessage());
+}
+?>
+--EXPECT--
+string(21) "Undefined variable: b"
+string(21) "Undefined variable: b"
diff --git a/Zend/tests/bug79657.phpt b/Zend/tests/bug79657.phpt
new file mode 100644
index 0000000000..fb2ccab3e3
--- /dev/null
+++ b/Zend/tests/bug79657.phpt
@@ -0,0 +1,42 @@
+--TEST--
+Bug #79657: "yield from" hangs when invalid value encountered
+--FILE--
+<?php
+
+function throwException(): iterable
+{
+ throw new Exception();
+}
+
+function loop(): iterable
+{
+ $callbacks = [
+ function () {
+ yield 'first';
+ },
+ function () {
+ yield from throwException();
+ }
+ ];
+
+ foreach ($callbacks as $callback) {
+ yield from $callback();
+ }
+}
+
+function get(string $first, int $second): array
+{
+ return [];
+}
+
+get(...loop());
+
+?>
+--EXPECTF--
+Fatal error: Uncaught Exception in %s:%d
+Stack trace:
+#0 %s(%d): throwException()
+#1 %s(%d): {closure}()
+#2 %s(%d): loop()
+#3 {main}
+ thrown in %s on line %d
diff --git a/Zend/tests/bug79740.phpt b/Zend/tests/bug79740.phpt
new file mode 100644
index 0000000000..311bcbcf56
--- /dev/null
+++ b/Zend/tests/bug79740.phpt
@@ -0,0 +1,22 @@
+--TEST--
+Bug #79740: serialize() and unserialize() methods can not be called statically
+--FILE--
+<?php
+class A {
+ public function serialize() { }
+ public function unserialize() { }
+}
+
+var_dump(is_callable(['A', 'serialize']));
+var_dump(is_callable(['A', 'unserialize']));
+A::serialize();
+A::unserialize();
+
+?>
+--EXPECTF--
+bool(true)
+bool(true)
+
+Deprecated: Non-static method A::serialize() should not be called statically in %s on line %d
+
+Deprecated: Non-static method A::unserialize() should not be called statically in %s on line %d
diff --git a/Zend/tests/bug79779.phpt b/Zend/tests/bug79779.phpt
new file mode 100644
index 0000000000..fe11ed76cc
--- /dev/null
+++ b/Zend/tests/bug79779.phpt
@@ -0,0 +1,12 @@
+--TEST--
+Bug #79779: Assertion failure when assigning property of string offset by reference
+--FILE--
+<?php
+$str = "";
+$str[1]->a = &$b;
+?>
+--EXPECTF--
+Fatal error: Uncaught Error: Cannot use string offset as an object in %s:%d
+Stack trace:
+#0 {main}
+ thrown in %s on line %d
diff --git a/Zend/tests/bug79783.phpt b/Zend/tests/bug79783.phpt
new file mode 100644
index 0000000000..959e90b06d
--- /dev/null
+++ b/Zend/tests/bug79783.phpt
@@ -0,0 +1,11 @@
+--TEST--
+Bug #79783: Segfault in php_str_replace_common
+--FILE--
+<?php
+str_replace("a", "b", "c", strlen("d"));
+?>
+--EXPECTF--
+Fatal error: Uncaught Error: Cannot pass parameter 4 by reference in %s:%d
+Stack trace:
+#0 {main}
+ thrown in %s on line %d
diff --git a/Zend/tests/bug79784.phpt b/Zend/tests/bug79784.phpt
new file mode 100644
index 0000000000..be1cd729e9
--- /dev/null
+++ b/Zend/tests/bug79784.phpt
@@ -0,0 +1,20 @@
+--TEST--
+Bug #79784: Use after free if changing array during undef var during array write fetch
+--FILE--
+<?php
+set_error_handler(function () {
+ $GLOBALS['a'] = null;
+});
+
+$a[$c] = 'x' ;
+var_dump($a);
+$a[$c] .= 'x' ;
+var_dump($a);
+$a[$c][$c] = 'x' ;
+var_dump($a);
+
+?>
+--EXPECT--
+NULL
+NULL
+NULL
diff --git a/Zend/tests/bug79793.phpt b/Zend/tests/bug79793.phpt
new file mode 100644
index 0000000000..9e4e2e20be
--- /dev/null
+++ b/Zend/tests/bug79793.phpt
@@ -0,0 +1,32 @@
+--TEST--
+Bug #79793: Use after free if string used in undefined index warning is changed
+--FILE--
+<?php
+
+$key = "foo";
+$key .= "bar";
+set_error_handler(function($_, $m) use (&$key) {
+ echo "$m\n";
+ $key .= "baz";
+});
+
+$ary = [];
+$ary[$key]++;
+var_dump($ary);
+$ary[$key] += 1;
+var_dump($ary);
+
+?>
+--EXPECT--
+Undefined index: foobar
+array(1) {
+ ["foobar"]=>
+ int(1)
+}
+Undefined index: foobarbaz
+array(2) {
+ ["foobar"]=>
+ int(1)
+ ["foobarbaz"]=>
+ int(1)
+}
diff --git a/Zend/tests/bug79862.phpt b/Zend/tests/bug79862.phpt
new file mode 100644
index 0000000000..b923da78b4
--- /dev/null
+++ b/Zend/tests/bug79862.phpt
@@ -0,0 +1,60 @@
+--TEST--
+Bug #79862: Public non-static property in child should take priority over private static
+--FILE--
+<?php
+
+class a {
+ private static $prop1;
+ private static $prop2;
+ private $prop3;
+ private $prop4;
+ private static $prop5;
+ private static $prop6;
+ public function __construct() {
+ $this->prop1 = 1;
+ $this->prop2 = 2;
+ $this->prop3 = 3;
+ $this->prop4 = 4;
+ $this->prop5 = 5;
+ $this->prop6 = 6;
+ var_dump(self::$prop1);
+ var_dump(self::$prop2);
+ var_dump(self::$prop5);
+ var_dump(self::$prop6);
+ var_dump($this);
+ }
+}
+class c extends a {
+ public $prop1;
+ protected $prop2;
+ public static $prop3;
+ protected static $prop4;
+ public static $prop5;
+ protected static $prop6;
+}
+
+$c = new c;
+
+?>
+--EXPECTF--
+Notice: Accessing static property c::$prop5 as non static in %s on line %d
+
+Notice: Accessing static property c::$prop6 as non static in %s on line %d
+NULL
+NULL
+NULL
+NULL
+object(c)#1 (6) {
+ ["prop1"]=>
+ int(1)
+ ["prop2":protected]=>
+ int(2)
+ ["prop3":"a":private]=>
+ int(3)
+ ["prop4":"a":private]=>
+ int(4)
+ ["prop5"]=>
+ int(5)
+ ["prop6"]=>
+ int(6)
+}
diff --git a/Zend/tests/call_to_abstract_method_args.phpt b/Zend/tests/call_to_abstract_method_args.phpt
new file mode 100644
index 0000000000..cbbc276d2c
--- /dev/null
+++ b/Zend/tests/call_to_abstract_method_args.phpt
@@ -0,0 +1,26 @@
+--TEST--
+Check that arguments are freed when a call to an abstract method throws
+--FILE--
+<?php
+
+abstract class Test {
+ abstract static function method();
+}
+
+try {
+ Test::method(new stdClass);
+} catch (Error $e) {
+ echo $e->getMessage(), "\n";
+}
+
+$ret = new stdClass;
+try {
+ $ret = Test::method(new stdClass);
+} catch (Error $e) {
+ echo $e->getMessage(), "\n";
+}
+
+?>
+--EXPECT--
+Cannot call abstract method Test::method()
+Cannot call abstract method Test::method()
diff --git a/Zend/tests/call_to_deprecated_function_args.phpt b/Zend/tests/call_to_deprecated_function_args.phpt
new file mode 100644
index 0000000000..5c3eb9ae16
--- /dev/null
+++ b/Zend/tests/call_to_deprecated_function_args.phpt
@@ -0,0 +1,43 @@
+--TEST--
+Check that arguments are freed when calling a deprecated function
+--FILE--
+<?php
+
+set_error_handler(function($code, $msg) {
+ throw new Error($msg);
+});
+
+try {
+ ezmlm_hash(new stdClass);
+} catch (Error $e) {
+ echo $e->getMessage(), "\n";
+}
+
+$ret = new stdClass;
+try {
+ $ret = ezmlm_hash(new stdClass);
+} catch (Error $e) {
+ echo $e->getMessage(), "\n";
+}
+
+try {
+ $fn = 'ezmlm_hash';
+ $fn(new stdClass);
+} catch (Error $e) {
+ echo $e->getMessage(), "\n";
+}
+
+$ret = new stdClass;
+try {
+ $fn = 'ezmlm_hash';
+ $ret = $fn(new stdClass);
+} catch (Error $e) {
+ echo $e->getMessage(), "\n";
+}
+
+?>
+--EXPECT--
+Function ezmlm_hash() is deprecated
+Function ezmlm_hash() is deprecated
+Function ezmlm_hash() is deprecated
+Function ezmlm_hash() is deprecated
diff --git a/Zend/tests/call_user_func_007.phpt b/Zend/tests/call_user_func_007.phpt
index f73f14b1ff..ed44320c3f 100644
--- a/Zend/tests/call_user_func_007.phpt
+++ b/Zend/tests/call_user_func_007.phpt
@@ -13,6 +13,8 @@ var_dump($a);
--EXPECTF--
Notice: Undefined offset: 0 in %s on line %d
+Notice: Trying to access array offset on value of type null in %s on line %d
+
Warning: Parameter 1 to foo() expected to be a reference, value given in %s on line %d
array(0) {
}
diff --git a/Zend/tests/call_with_refs.phpt b/Zend/tests/call_with_refs.phpt
index f7b18365b4..0e01779a21 100644
--- a/Zend/tests/call_with_refs.phpt
+++ b/Zend/tests/call_with_refs.phpt
@@ -2,16 +2,17 @@
Check call to non-ref function with call-time refs
--FILE--
<?php
-function my_errorhandler($errno,$errormsg) {
- global $my_var;
- $my_var=0x12345;
- echo $errormsg."\n";
- return true;
+class Test {
+ public function __toString() {
+ global $my_var;
+ $my_var=0x12345;
+ return "";
+ }
}
-$oldhandler = set_error_handler("my_errorhandler");
+
$my_var = str_repeat("A",64);
-$data = call_user_func_array("substr_replace",array(&$my_var, new StdClass(),1));
+$data = call_user_func_array("substr_replace",array(&$my_var, new Test(), 1));
echo "OK!";
+?>
--EXPECT--
-Object of class stdClass could not be converted to string
OK!
diff --git a/Zend/tests/class_constants_003.phpt b/Zend/tests/class_constants_003.phpt
index 14222a4960..3e61a8ab97 100644
--- a/Zend/tests/class_constants_003.phpt
+++ b/Zend/tests/class_constants_003.phpt
@@ -11,7 +11,7 @@ class test {
?>
DATA;
-$filename = dirname(__FILE__)."/cc003.dat";
+$filename = __DIR__."/cc003.dat";
file_put_contents($filename, $class_data);
function foo($v = test::val) {
diff --git a/Zend/tests/class_name_as_scalar_error_002.phpt b/Zend/tests/class_name_as_scalar_error_002.phpt
index 59b7a2edc9..cbea0c2dcc 100644
--- a/Zend/tests/class_name_as_scalar_error_002.phpt
+++ b/Zend/tests/class_name_as_scalar_error_002.phpt
@@ -7,7 +7,13 @@ namespace Foo\Bar {
class One {
const Baz = parent::class;
}
+ var_dump(One::Baz);
}
?>
--EXPECTF--
-Fatal error: parent::class cannot be used for compile-time class name resolution in %s on line %d
+Deprecated: Cannot use "parent" when current class scope has no parent in %s on line %d
+
+Fatal error: Uncaught Error: Cannot use "parent" when current class scope has no parent in %s:%d
+Stack trace:
+#0 {main}
+ thrown in %s on line %d
diff --git a/Zend/tests/class_name_as_scalar_error_004.phpt b/Zend/tests/class_name_as_scalar_error_004.phpt
index c00037fca3..5b743df2db 100644
--- a/Zend/tests/class_name_as_scalar_error_004.phpt
+++ b/Zend/tests/class_name_as_scalar_error_004.phpt
@@ -4,10 +4,14 @@ class name as scalar from ::class keyword error using parent in method signature
<?php
namespace Foo\Bar {
- class One {
- public function baz($x = parent::class) {}
+ class One {}
+ class Two extends One {
+ public function baz($x = parent::class) {
+ var_dump($x);
+ }
}
+ (new Two)->baz();
}
?>
---EXPECTF--
-Fatal error: parent::class cannot be used for compile-time class name resolution in %s on line %d
+--EXPECT--
+string(11) "Foo\Bar\One"
diff --git a/Zend/tests/class_name_as_scalar_error_007.phpt b/Zend/tests/class_name_as_scalar_error_007.phpt
index 22099f6104..cbaf518ea8 100644
--- a/Zend/tests/class_name_as_scalar_error_007.phpt
+++ b/Zend/tests/class_name_as_scalar_error_007.phpt
@@ -3,11 +3,18 @@ Cannot access self::class when no class scope is active
--FILE--
<?php
-var_dump(self::class);
+try {
+ var_dump(self::class);
+} catch (Error $e) {
+ echo $e->getMessage(), "\n";
+}
+try {
+ var_dump([self::class]);
+} catch (Error $e) {
+ echo $e->getMessage(), "\n";
+}
?>
---EXPECTF--
-Fatal error: Uncaught Error: Cannot use "self" when no class scope is active in %s:3
-Stack trace:
-#0 {main}
- thrown in %s on line 3
+--EXPECT--
+Cannot use "self" when no class scope is active
+Cannot use "self" when no class scope is active
diff --git a/Zend/tests/class_name_of_var.phpt b/Zend/tests/class_name_of_var.phpt
new file mode 100644
index 0000000000..29f19e9fac
--- /dev/null
+++ b/Zend/tests/class_name_of_var.phpt
@@ -0,0 +1,11 @@
+--TEST--
+$var::class is not supported
+--FILE--
+<?php
+
+$obj = new stdClass;
+var_dump($obj::class);
+
+?>
+--EXPECTF--
+Fatal error: Cannot use ::class with dynamic class name in %s on line %d
diff --git a/Zend/tests/class_properties_const.phpt b/Zend/tests/class_properties_const.phpt
index 8f607bcfe2..6f5471d20a 100644
--- a/Zend/tests/class_properties_const.phpt
+++ b/Zend/tests/class_properties_const.phpt
@@ -22,4 +22,7 @@ NULL
Notice: Undefined property: A::$1 in %sclass_properties_const.php on line %d
NULL
-Recoverable fatal error: Object of class Closure could not be converted to string in %sclass_properties_const.php on line %d
+Fatal error: Uncaught Error: Object of class Closure could not be converted to string in %s:%d
+Stack trace:
+#0 {main}
+ thrown in %s on line %d
diff --git a/Zend/tests/closure_015.phpt b/Zend/tests/closure_015.phpt
index 33c732d723..f6903ebdb1 100644
--- a/Zend/tests/closure_015.phpt
+++ b/Zend/tests/closure_015.phpt
@@ -2,18 +2,20 @@
Closure 015: converting to string/unicode
--FILE--
<?php
-set_error_handler('myErrorHandler', E_RECOVERABLE_ERROR);
-function myErrorHandler($errno, $errstr, $errfile, $errline) {
- echo "Error: $errstr at $errfile($errline)\n";
- return true;
-}
+
$x = function() { return 1; };
-print (string) $x;
-print "\n";
-print $x;
-print "\n";
-?>
---EXPECTF--
-Error: Object of class Closure could not be converted to string at %sclosure_015.php(8)
+try {
+ print (string) $x;
+} catch (Error $e) {
+ echo $e->getMessage(), "\n";
+}
+try {
+ print $x;
+} catch (Error $e) {
+ echo $e->getMessage(), "\n";
+}
-Error: Object of class Closure could not be converted to string at %sclosure_015.php(10)
+?>
+--EXPECT--
+Object of class Closure could not be converted to string
+Object of class Closure could not be converted to string
diff --git a/Zend/tests/closure_038.phpt b/Zend/tests/closure_038.phpt
index 568db49b81..d1ec446c9d 100644
--- a/Zend/tests/closure_038.phpt
+++ b/Zend/tests/closure_038.phpt
@@ -59,9 +59,4 @@ Fatal error: Uncaught Error: Cannot access private property B::$x in %s:%d
Stack trace:
#0 %s(%d): Closure->{closure}()
#1 {main}
-
-Next Error: Cannot access private property B::$x in %s:%d
-Stack trace:
-#0 %s(%d): Closure->{closure}()
-#1 {main}
thrown in %s on line %d
diff --git a/Zend/tests/closure_039.phpt b/Zend/tests/closure_039.phpt
index f72223d206..fa454c38c4 100644
--- a/Zend/tests/closure_039.phpt
+++ b/Zend/tests/closure_039.phpt
@@ -59,9 +59,4 @@ Fatal error: Uncaught Error: Cannot access private property B::$x in %s:%d
Stack trace:
#0 %s(%d): Closure->{closure}()
#1 {main}
-
-Next Error: Cannot access private property B::$x in %s:%d
-Stack trace:
-#0 %s(%d): Closure->{closure}()
-#1 {main}
thrown in %s on line %d
diff --git a/Zend/tests/closure_041.phpt b/Zend/tests/closure_041.phpt
index 33cf03b14c..cfe4f9487f 100644
--- a/Zend/tests/closure_041.phpt
+++ b/Zend/tests/closure_041.phpt
@@ -80,6 +80,8 @@ scoped to A: bool(false)
bound: no
scoped to A: bool(true)
bound: no
+
+Deprecated: Unbinding $this of closure is deprecated in %s on line %d
scoped to A: bool(true)
bound: no
After binding, with same-class instance for the bound ones
diff --git a/Zend/tests/closure_044.phpt b/Zend/tests/closure_044.phpt
index c71204b130..225d7540d2 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";
---EXPECT--
+--EXPECTF--
Before binding
bool(false)
bool(false)
@@ -50,6 +50,8 @@ After binding, null scope, no instance
bool(false)
bool(false)
+
+Deprecated: Unbinding $this of closure is deprecated in %s on line %d
bool(false)
bool(false)
@@ -64,6 +66,8 @@ After binding, with scope, no instance
bool(true)
bool(false)
+
+Deprecated: Unbinding $this of closure is deprecated in %s on line %d
bool(true)
bool(false)
diff --git a/Zend/tests/closure_046.phpt b/Zend/tests/closure_046.phpt
index ef8aff4bbc..e10cc1b57e 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";
---EXPECT--
+--EXPECTF--
Before binding
bool(false)
bool(false)
@@ -50,6 +50,8 @@ After binding, no instance
bool(false)
bool(false)
+
+Deprecated: Unbinding $this of closure is deprecated in %s on line %d
bool(true)
bool(false)
diff --git a/Zend/tests/closure_061.phpt b/Zend/tests/closure_061.phpt
index 1aa579a409..f01e393570 100644
--- a/Zend/tests/closure_061.phpt
+++ b/Zend/tests/closure_061.phpt
@@ -175,6 +175,8 @@ Cannot rebind scope of closure created by ReflectionFunctionAbstract::getClosure
-------------------
bindTo(null, Cls::class):
+Unbinding $this of a method is deprecated
+
Success!
bindTo(new Cls, Cls::class):
diff --git a/Zend/tests/closure_062.phpt b/Zend/tests/closure_062.phpt
new file mode 100644
index 0000000000..d56b4f0663
--- /dev/null
+++ b/Zend/tests/closure_062.phpt
@@ -0,0 +1,56 @@
+--TEST--
+Closure $this unbinding deprecation
+--FILE--
+<?php
+
+class Test {
+ public function method() {
+ echo "instance scoped, non-static, \$this used\n";
+ $fn = function() {
+ var_dump($this);
+ };
+ $fn->bindTo(null);
+ echo "instance scoped, static, \$this used\n";
+ $fn = static function() {
+ var_dump($this);
+ };
+ $fn->bindTo(null);
+ echo "instance scoped, non-static, \$this not used\n";
+ $fn = function() {
+ var_dump($notThis);
+ };
+ $fn->bindTo(null);
+ }
+
+ public static function staticMethod() {
+ echo "static scoped, non-static, \$this used\n";
+ $fn = function() {
+ var_dump($this);
+ };
+ $fn->bindTo(null);
+ echo "static scoped, static, \$this used\n";
+ $fn = static function() {
+ var_dump($this);
+ };
+ $fn->bindTo(null);
+ echo "static scoped, static, \$this not used\n";
+ $fn = function() {
+ var_dump($notThis);
+ };
+ $fn->bindTo(null);
+ }
+}
+
+(new Test)->method();
+Test::staticMethod();
+
+?>
+--EXPECTF--
+instance scoped, non-static, $this used
+
+Deprecated: Unbinding $this of closure is deprecated in %s on line %d
+instance scoped, static, $this used
+instance scoped, non-static, $this not used
+static scoped, non-static, $this used
+static scoped, static, $this used
+static scoped, static, $this not used
diff --git a/Zend/tests/closure_write_prop.phpt b/Zend/tests/closure_write_prop.phpt
new file mode 100644
index 0000000000..38bebf4e1b
--- /dev/null
+++ b/Zend/tests/closure_write_prop.phpt
@@ -0,0 +1,22 @@
+--TEST--
+Cannot write to closure properties
+--FILE--
+<?php
+
+class A {
+ function getFn() {
+ return function() {
+ };
+ }
+}
+
+$a = new A;
+try {
+ $c = $a->getFn()->b = new stdClass;
+} catch (Error $e) {
+ echo $e->getMessage(), "\n";
+}
+
+?>
+--EXPECT--
+Closure object cannot have properties
diff --git a/Zend/tests/closures/closure_instantiate.phpt b/Zend/tests/closures/closure_instantiate.phpt
new file mode 100644
index 0000000000..fa936a219b
--- /dev/null
+++ b/Zend/tests/closures/closure_instantiate.phpt
@@ -0,0 +1,21 @@
+--TEST--
+Closures cannot be instantiated directly
+--CREDITS--
+Mark Baker mark@lange.demon.co.uk at the PHPNW2017 Conference for PHP Testfest 2017
+--FILE--
+<?php
+
+try {
+ // Closures should be instantiatable using new
+ $x = new Closure();
+} catch (Exception $e) {
+ // Instantiating a closure is an error, not an exception, so we shouldn't see this
+ echo 'EXCEPTION: ', $e->getMessage();
+} catch (Throwable $e) {
+ // This is the mesage that we should see for a caught error
+ echo 'ERROR: ', $e->getMessage();
+}
+
+?>
+--EXPECT--
+ERROR: Instantiation of 'Closure' is not allowed
diff --git a/Zend/tests/concat_003.phpt b/Zend/tests/concat_003.phpt
index 13c6fdc087..dc22bae1a7 100644
--- a/Zend/tests/concat_003.phpt
+++ b/Zend/tests/concat_003.phpt
@@ -1,7 +1,10 @@
--TEST--
Concatenating many small strings should not slowdown allocations
--SKIPIF--
-<?php if (PHP_DEBUG) { die ("skip debug version is slow"); } ?>
+<?php
+if (PHP_DEBUG) { die ("skip debug version is slow"); }
+if (getenv('SKIP_PERF_SENSITIVE')) die("skip performance sensitive test");
+?>
--FILE--
<?php
diff --git a/Zend/tests/constant_expressions_classes.phpt b/Zend/tests/constant_expressions_classes.phpt
index e394442b85..eed006bfe1 100644
--- a/Zend/tests/constant_expressions_classes.phpt
+++ b/Zend/tests/constant_expressions_classes.phpt
@@ -5,7 +5,7 @@ opcache.enable=1
opcache.enable_cli=1
opcache.optimization_level=-1
--SKIPIF--
-<?php if (!extension_loaded('Zend OPcache') || php_sapi_name() != "cli") die("skip CLI only"); ?>
+<?php if (php_sapi_name() != "cli") die("skip CLI only"); ?>
--FILE--
<?php
diff --git a/Zend/tests/constant_expressions_coalesce.phpt b/Zend/tests/constant_expressions_coalesce.phpt
index 425aba69c4..27740aa72e 100644
--- a/Zend/tests/constant_expressions_coalesce.phpt
+++ b/Zend/tests/constant_expressions_coalesce.phpt
@@ -5,6 +5,12 @@ Constant expressions with null coalescing operator ??
const A = [1 => [[]]];
+// should produce deprecation notices
+const D_1 = null ?? A[1]{'undefined'}['index'] ?? 1;
+const D_2 = null ?? A['undefined']{'index'} ?? 2;
+const D_3 = null ?? A[1]{0}{2} ?? 3; // 2 deprecation notices
+const D_4 = A[1]{0} ?? 4;
+
const T_1 = null ?? A[1]['undefined']['index'] ?? 1;
const T_2 = null ?? A['undefined']['index'] ?? 2;
const T_3 = null ?? A[1][0][2] ?? 3;
@@ -12,6 +18,11 @@ const T_4 = A[1][0][2] ?? 4;
const T_5 = null ?? __LINE__;
const T_6 = __LINE__ ?? "bar";
+var_dump(D_1);
+var_dump(D_2);
+var_dump(D_3);
+var_dump(D_4);
+
var_dump(T_1);
var_dump(T_2);
var_dump(T_3);
@@ -31,6 +42,21 @@ var_dump((new class { public $var = A[1][0][2] ?? 4; })->var);
?>
--EXPECTF--
+
+Deprecated: Array and string offset access syntax with curly braces is deprecated in %s line %d
+
+Deprecated: Array and string offset access syntax with curly braces is deprecated in %s line %d
+
+Deprecated: Array and string offset access syntax with curly braces is deprecated in %s line %d
+
+Deprecated: Array and string offset access syntax with curly braces is deprecated in %s line %d
+
+Deprecated: Array and string offset access syntax with curly braces is deprecated in %s line %d
+int(1)
+int(2)
+int(3)
+array(0) {
+}
int(1)
int(2)
int(3)
diff --git a/Zend/tests/constants/fixtures/folder1/fixture.inc b/Zend/tests/constants/fixtures/folder1/fixture.inc
index 3406c998ac..3406c998ac 100755..100644
--- a/Zend/tests/constants/fixtures/folder1/fixture.inc
+++ b/Zend/tests/constants/fixtures/folder1/fixture.inc
diff --git a/Zend/tests/constants/fixtures/folder1/subfolder1/fixture.inc b/Zend/tests/constants/fixtures/folder1/subfolder1/fixture.inc
index 86e6859363..86e6859363 100755..100644
--- a/Zend/tests/constants/fixtures/folder1/subfolder1/fixture.inc
+++ b/Zend/tests/constants/fixtures/folder1/subfolder1/fixture.inc
diff --git a/Zend/tests/constants/fixtures/folder1/subfolder2/fixture.inc b/Zend/tests/constants/fixtures/folder1/subfolder2/fixture.inc
index 86e6859363..86e6859363 100755..100644
--- a/Zend/tests/constants/fixtures/folder1/subfolder2/fixture.inc
+++ b/Zend/tests/constants/fixtures/folder1/subfolder2/fixture.inc
diff --git a/Zend/tests/constants/fixtures/folder1/subfolder3/fixture.inc b/Zend/tests/constants/fixtures/folder1/subfolder3/fixture.inc
index 86e6859363..86e6859363 100755..100644
--- a/Zend/tests/constants/fixtures/folder1/subfolder3/fixture.inc
+++ b/Zend/tests/constants/fixtures/folder1/subfolder3/fixture.inc
diff --git a/Zend/tests/constants/fixtures/folder1/subfolder4/fixture.inc b/Zend/tests/constants/fixtures/folder1/subfolder4/fixture.inc
index 86e6859363..86e6859363 100755..100644
--- a/Zend/tests/constants/fixtures/folder1/subfolder4/fixture.inc
+++ b/Zend/tests/constants/fixtures/folder1/subfolder4/fixture.inc
diff --git a/Zend/tests/constants/fixtures/folder2/fixture.inc b/Zend/tests/constants/fixtures/folder2/fixture.inc
index 3406c998ac..3406c998ac 100755..100644
--- a/Zend/tests/constants/fixtures/folder2/fixture.inc
+++ b/Zend/tests/constants/fixtures/folder2/fixture.inc
diff --git a/Zend/tests/constants/fixtures/folder2/subfolder1/fixture.inc b/Zend/tests/constants/fixtures/folder2/subfolder1/fixture.inc
index 86e6859363..86e6859363 100755..100644
--- a/Zend/tests/constants/fixtures/folder2/subfolder1/fixture.inc
+++ b/Zend/tests/constants/fixtures/folder2/subfolder1/fixture.inc
diff --git a/Zend/tests/constants/fixtures/folder2/subfolder2/fixture.inc b/Zend/tests/constants/fixtures/folder2/subfolder2/fixture.inc
index 86e6859363..86e6859363 100755..100644
--- a/Zend/tests/constants/fixtures/folder2/subfolder2/fixture.inc
+++ b/Zend/tests/constants/fixtures/folder2/subfolder2/fixture.inc
diff --git a/Zend/tests/constants/fixtures/folder2/subfolder3/fixture.inc b/Zend/tests/constants/fixtures/folder2/subfolder3/fixture.inc
index 86e6859363..86e6859363 100755..100644
--- a/Zend/tests/constants/fixtures/folder2/subfolder3/fixture.inc
+++ b/Zend/tests/constants/fixtures/folder2/subfolder3/fixture.inc
diff --git a/Zend/tests/constants/fixtures/folder2/subfolder4/fixture.inc b/Zend/tests/constants/fixtures/folder2/subfolder4/fixture.inc
index 86e6859363..86e6859363 100755..100644
--- a/Zend/tests/constants/fixtures/folder2/subfolder4/fixture.inc
+++ b/Zend/tests/constants/fixtures/folder2/subfolder4/fixture.inc
diff --git a/Zend/tests/constants/fixtures/folder3/fixture.inc b/Zend/tests/constants/fixtures/folder3/fixture.inc
index 3406c998ac..3406c998ac 100755..100644
--- a/Zend/tests/constants/fixtures/folder3/fixture.inc
+++ b/Zend/tests/constants/fixtures/folder3/fixture.inc
diff --git a/Zend/tests/constants/fixtures/folder3/subfolder1/fixture.inc b/Zend/tests/constants/fixtures/folder3/subfolder1/fixture.inc
index 86e6859363..86e6859363 100755..100644
--- a/Zend/tests/constants/fixtures/folder3/subfolder1/fixture.inc
+++ b/Zend/tests/constants/fixtures/folder3/subfolder1/fixture.inc
diff --git a/Zend/tests/constants/fixtures/folder3/subfolder2/fixture.inc b/Zend/tests/constants/fixtures/folder3/subfolder2/fixture.inc
index 86e6859363..86e6859363 100755..100644
--- a/Zend/tests/constants/fixtures/folder3/subfolder2/fixture.inc
+++ b/Zend/tests/constants/fixtures/folder3/subfolder2/fixture.inc
diff --git a/Zend/tests/constants/fixtures/folder3/subfolder3/fixture.inc b/Zend/tests/constants/fixtures/folder3/subfolder3/fixture.inc
index 86e6859363..86e6859363 100755..100644
--- a/Zend/tests/constants/fixtures/folder3/subfolder3/fixture.inc
+++ b/Zend/tests/constants/fixtures/folder3/subfolder3/fixture.inc
diff --git a/Zend/tests/constants/fixtures/folder3/subfolder4/fixture.inc b/Zend/tests/constants/fixtures/folder3/subfolder4/fixture.inc
index 86e6859363..86e6859363 100755..100644
--- a/Zend/tests/constants/fixtures/folder3/subfolder4/fixture.inc
+++ b/Zend/tests/constants/fixtures/folder3/subfolder4/fixture.inc
diff --git a/Zend/tests/constants/fixtures/folder4/fixture.inc b/Zend/tests/constants/fixtures/folder4/fixture.inc
index 3406c998ac..3406c998ac 100755..100644
--- a/Zend/tests/constants/fixtures/folder4/fixture.inc
+++ b/Zend/tests/constants/fixtures/folder4/fixture.inc
diff --git a/Zend/tests/constants/fixtures/folder4/subfolder1/fixture.inc b/Zend/tests/constants/fixtures/folder4/subfolder1/fixture.inc
index 86e6859363..86e6859363 100755..100644
--- a/Zend/tests/constants/fixtures/folder4/subfolder1/fixture.inc
+++ b/Zend/tests/constants/fixtures/folder4/subfolder1/fixture.inc
diff --git a/Zend/tests/constants/fixtures/folder4/subfolder2/fixture.inc b/Zend/tests/constants/fixtures/folder4/subfolder2/fixture.inc
index 86e6859363..86e6859363 100755..100644
--- a/Zend/tests/constants/fixtures/folder4/subfolder2/fixture.inc
+++ b/Zend/tests/constants/fixtures/folder4/subfolder2/fixture.inc
diff --git a/Zend/tests/constants/fixtures/folder4/subfolder3/fixture.inc b/Zend/tests/constants/fixtures/folder4/subfolder3/fixture.inc
index 86e6859363..86e6859363 100755..100644
--- a/Zend/tests/constants/fixtures/folder4/subfolder3/fixture.inc
+++ b/Zend/tests/constants/fixtures/folder4/subfolder3/fixture.inc
diff --git a/Zend/tests/constants/fixtures/folder4/subfolder4/fixture.inc b/Zend/tests/constants/fixtures/folder4/subfolder4/fixture.inc
index 86e6859363..86e6859363 100755..100644
--- a/Zend/tests/constants/fixtures/folder4/subfolder4/fixture.inc
+++ b/Zend/tests/constants/fixtures/folder4/subfolder4/fixture.inc
diff --git a/Zend/tests/constructor_abstract_grantparent.phpt b/Zend/tests/constructor_abstract_grantparent.phpt
new file mode 100644
index 0000000000..b813c4c1f7
--- /dev/null
+++ b/Zend/tests/constructor_abstract_grantparent.phpt
@@ -0,0 +1,18 @@
+--TEST--
+LSP checks are performed against an abstract constructor even if it is not a direct parent
+--FILE--
+<?php
+
+abstract class A {
+ abstract function __construct(X $x);
+}
+class B extends A {
+ function __construct(X $x) {}
+}
+class C extends B {
+ function __construct() {}
+}
+
+?>
+--EXPECTF--
+Fatal error: Declaration of C::__construct() must be compatible with A::__construct(X $x) in %s on line 10
diff --git a/Zend/tests/declare_already_in_use.phpt b/Zend/tests/declare_already_in_use.phpt
new file mode 100644
index 0000000000..c7e4ce8d67
--- /dev/null
+++ b/Zend/tests/declare_already_in_use.phpt
@@ -0,0 +1,14 @@
+--TEST--
+Cannot declare class, because the name is already in use
+--FILE--
+<?php
+
+function test() {
+ class A {}
+}
+test();
+test();
+
+?>
+--EXPECTF--
+Fatal error: Cannot declare class A, because the name is already in use in %s on line %d
diff --git a/Zend/tests/dereference_002.phpt b/Zend/tests/dereference_002.phpt
index d16e1bb483..7290df7714 100644
--- a/Zend/tests/dereference_002.phpt
+++ b/Zend/tests/dereference_002.phpt
@@ -69,6 +69,8 @@ array(2) {
int(5)
}
int(1)
+
+Notice: Trying to access array offset on value of type int in %s on line %d
NULL
Notice: Undefined offset: 4 in %s on line %d
diff --git a/Zend/tests/dereference_010.phpt b/Zend/tests/dereference_010.phpt
index 981fe31160..c63f6acaf9 100644
--- a/Zend/tests/dereference_010.phpt
+++ b/Zend/tests/dereference_010.phpt
@@ -21,7 +21,10 @@ var_dump(b()[1]);
?>
--EXPECTF--
+Notice: Trying to access array offset on value of type int in %s on line %d
NULL
+
+Notice: Trying to access array offset on value of type int in %s on line %d
NULL
Fatal error: Uncaught Error: Cannot use object of type stdClass as array in %s:%d
diff --git a/Zend/tests/dereference_014.phpt b/Zend/tests/dereference_014.phpt
index f8910dd016..189dca7a38 100644
--- a/Zend/tests/dereference_014.phpt
+++ b/Zend/tests/dereference_014.phpt
@@ -27,8 +27,12 @@ var_dump($h);
?>
--EXPECTF--
+Notice: Trying to access array offset on value of type null in %s on line %d
+
Notice: Trying to get property 'a' of non-object in %s on line %d
NULL
+Notice: Trying to access array offset on value of type null in %s on line %d
+
Notice: Trying to get property 'b' of non-object in %s on line %d
NULL
diff --git a/Zend/tests/empty_str_offset.phpt b/Zend/tests/empty_str_offset.phpt
index 044719a382..f89987109d 100644
--- a/Zend/tests/empty_str_offset.phpt
+++ b/Zend/tests/empty_str_offset.phpt
@@ -62,7 +62,7 @@ var_dump(empty($str[$f]));
print "done\n";
?>
---EXPECTF--
+--EXPECT--
- empty ---
bool(false)
bool(true)
diff --git a/Zend/tests/error_reporting02.phpt b/Zend/tests/error_reporting02.phpt
index 6ceb8deaa3..c76c5b54c8 100644
--- a/Zend/tests/error_reporting02.phpt
+++ b/Zend/tests/error_reporting02.phpt
@@ -3,13 +3,13 @@ testing @ and error_reporting - 2
--FILE--
<?php
-error_reporting(E_ALL);
+error_reporting(E_ALL & ~E_DEPRECATED);
function foo($arg) {
}
function bar() {
- error_reporting(E_ALL|E_STRICT);
+ error_reporting(E_ALL);
throw new Exception("test");
}
diff --git a/Zend/tests/error_reporting03.phpt b/Zend/tests/error_reporting03.phpt
index 959a29b557..f344e9557b 100644
--- a/Zend/tests/error_reporting03.phpt
+++ b/Zend/tests/error_reporting03.phpt
@@ -3,7 +3,7 @@ testing @ and error_reporting - 3
--FILE--
<?php
-error_reporting(E_ALL);
+error_reporting(E_ALL & ~E_DEPRECATED);
function foo($arg) {
echo @$nonex_foo;
@@ -16,7 +16,7 @@ function bar() {
function foo1() {
echo $undef1;
- error_reporting(E_ALL|E_STRICT);
+ error_reporting(E_ALL);
echo $undef2;
}
diff --git a/Zend/tests/error_reporting04.phpt b/Zend/tests/error_reporting04.phpt
index 295a3a4d40..5b476cdf7f 100644
--- a/Zend/tests/error_reporting04.phpt
+++ b/Zend/tests/error_reporting04.phpt
@@ -3,11 +3,11 @@ testing @ and error_reporting - 4
--FILE--
<?php
-error_reporting(E_ALL);
+error_reporting(E_ALL & ~E_DEPRECATED);
function foo() {
echo $undef;
- error_reporting(E_ALL|E_STRICT);
+ error_reporting(E_ALL);
}
diff --git a/Zend/tests/error_reporting08.phpt b/Zend/tests/error_reporting08.phpt
index 13d32ca4bc..32cb6b8d16 100644
--- a/Zend/tests/error_reporting08.phpt
+++ b/Zend/tests/error_reporting08.phpt
@@ -3,7 +3,7 @@ testing @ and error_reporting - 8
--FILE--
<?php
-error_reporting(E_ALL);
+error_reporting(E_ALL & ~E_DEPRECATED);
function foo1($arg) {
}
@@ -12,7 +12,7 @@ function foo2($arg) {
}
function foo3() {
- error_reporting(E_ALL|E_STRICT);
+ error_reporting(E_ALL);
echo $undef3;
throw new Exception("test");
}
diff --git a/Zend/tests/error_reporting09.phpt b/Zend/tests/error_reporting09.phpt
index a3c254d94d..3d723f36c0 100644
--- a/Zend/tests/error_reporting09.phpt
+++ b/Zend/tests/error_reporting09.phpt
@@ -3,7 +3,7 @@ testing @ and error_reporting - 9
--FILE--
<?php
-error_reporting(E_ALL);
+error_reporting(E_ALL & ~E_DEPRECATED);
function bar() {
echo @$blah;
@@ -12,7 +12,7 @@ function bar() {
function foo() {
echo @$undef;
- error_reporting(E_ALL|E_STRICT);
+ error_reporting(E_ALL);
echo $blah;
return bar();
}
diff --git a/Zend/tests/exception_004.phpt b/Zend/tests/exception_004.phpt
index 29288e25ac..d9ffc748a4 100644
--- a/Zend/tests/exception_004.phpt
+++ b/Zend/tests/exception_004.phpt
@@ -3,8 +3,6 @@ Throwing exception using a class that isn't derived from the Exception base clas
--FILE--
<?php
-error_reporting(E_ALL|E_STRICT);
-
class Foo { }
try {
diff --git a/Zend/tests/exception_009.phpt b/Zend/tests/exception_009.phpt
index 32b048c40b..340bd99eb0 100644
--- a/Zend/tests/exception_009.phpt
+++ b/Zend/tests/exception_009.phpt
@@ -25,4 +25,8 @@ throw new my_exception;
?>
--EXPECT--
-Recoverable fatal error: Object of class stdClass could not be converted to string in Unknown on line 0
+Fatal error: Uncaught Error: Object of class stdClass could not be converted to string in [no active file]:0
+Stack trace:
+#0 [internal function]: Exception->__toString()
+#1 {main}
+ thrown in [no active file] on line 0
diff --git a/Zend/tests/exception_010.phpt b/Zend/tests/exception_010.phpt
deleted file mode 100644
index 6bff8c6e5e..0000000000
--- a/Zend/tests/exception_010.phpt
+++ /dev/null
@@ -1,30 +0,0 @@
---TEST--
-Testing Exception's methods
---FILE--
-<?php
-
-$x = new Exception;
-$x->gettraceasstring(1);
-$x->gettraceasstring();
-$x->__tostring(1);
-$x->gettrace(1);
-$x->getline(1);
-$x->getfile(1);
-$x->getmessage(1);
-$x->getcode(1);
-
-?>
---EXPECTF--
-Warning: Exception::getTraceAsString() expects exactly 0 parameters, 1 given in %s on line %d
-
-Warning: Exception::__toString() expects exactly 0 parameters, 1 given in %s on line %d
-
-Warning: Exception::getTrace() expects exactly 0 parameters, 1 given in %s on line %d
-
-Warning: Exception::getLine() expects exactly 0 parameters, 1 given in %s on line %d
-
-Warning: Exception::getFile() expects exactly 0 parameters, 1 given in %s on line %d
-
-Warning: Exception::getMessage() expects exactly 0 parameters, 1 given in %s on line %d
-
-Warning: Exception::getCode() expects exactly 0 parameters, 1 given in %s on line %d
diff --git a/Zend/tests/exception_017.phpt b/Zend/tests/exception_017.phpt
index f980b297fb..8d87ec6ee9 100644
--- a/Zend/tests/exception_017.phpt
+++ b/Zend/tests/exception_017.phpt
@@ -30,8 +30,7 @@ C::foo();
--EXPECTF--
Exception: Cannot call abstract method C::foo() in %sexception_017.php on line %d
-Exception: Argument 1 passed to foo() must be callable, string given, called in %sexception_017.php on line %d
-Exception: Cannot call abstract method C::foo()
+Exception: Argument 1 passed to foo() must be callable, string given, called in %s on line %d
Fatal error: Uncaught Error: Cannot call abstract method C::foo() in %sexception_017.php:%d
Stack trace:
diff --git a/Zend/tests/exception_during_include_stat.phpt b/Zend/tests/exception_during_include_stat.phpt
new file mode 100644
index 0000000000..1927e7e251
--- /dev/null
+++ b/Zend/tests/exception_during_include_stat.phpt
@@ -0,0 +1,41 @@
+--TEST--
+Make sure exceptions during include/require stating are properly propagated
+--FILE--
+<?php
+
+class StreamWrapper {
+ public function url_stat($path, $flags) {
+ throw new Exception('stat failed');
+ }
+}
+
+stream_wrapper_register('test', StreamWrapper::class);
+set_include_path('test://foo:test://bar');
+
+try {
+ require_once 'doesnt_exist.php';
+} catch (Exception $e) {
+ echo $e->getMessage(), "\n";
+}
+try {
+ require 'doesnt_exist.php';
+} catch (Exception $e) {
+ echo $e->getMessage(), "\n";
+}
+try {
+ include_once 'doesnt_exist.php';
+} catch (Exception $e) {
+ echo $e->getMessage(), "\n";
+}
+try {
+ include 'doesnt_exist.php';
+} catch (Exception $e) {
+ echo $e->getMessage(), "\n";
+}
+
+?>
+--EXPECT--
+stat failed
+stat failed
+stat failed
+stat failed
diff --git a/Zend/tests/exception_from_toString.phpt b/Zend/tests/exception_from_toString.phpt
new file mode 100644
index 0000000000..ee6dde9187
--- /dev/null
+++ b/Zend/tests/exception_from_toString.phpt
@@ -0,0 +1,135 @@
+--TEST--
+Test exceptions thrown from __toString() in various contexts
+--FILE--
+<?php
+
+class BadStr {
+ public function __toString() {
+ throw new Exception("Exception");
+ }
+}
+
+$str = "a";
+$num = 42;
+$badStr = new BadStr;
+
+try { $x = $str . $badStr; }
+catch (Exception $e) { echo $e->getMessage(), "\n"; }
+try { $x = $badStr . $str; }
+catch (Exception $e) { echo $e->getMessage(), "\n"; }
+try { $x = $str .= $badStr; }
+catch (Exception $e) { echo $e->getMessage(), "\n"; }
+var_dump($str);
+try { $x = $num . $badStr; }
+catch (Exception $e) { echo $e->getMessage(), "\n"; }
+try { $x = $badStr . $num; }
+catch (Exception $e) { echo $e->getMessage(), "\n"; }
+try { $x = $num .= $badStr; }
+catch (Exception $e) { echo $e->getMessage(), "\n"; }
+var_dump($num);
+
+try { $x = $badStr .= $str; }
+catch (Exception $e) { echo $e->getMessage(), "\n"; }
+var_dump($badStr);
+try { $x = $badStr .= $badStr; }
+catch (Exception $e) { echo $e->getMessage(), "\n"; }
+var_dump($badStr);
+
+try { $x = "x$badStr"; }
+catch (Exception $e) { echo $e->getMessage(), "\n"; }
+try { $x = "{$badStr}x"; }
+catch (Exception $e) { echo $e->getMessage(), "\n"; }
+try { $x = "$str$badStr"; }
+catch (Exception $e) { echo $e->getMessage(), "\n"; }
+try { $x = "$badStr$str"; }
+catch (Exception $e) { echo $e->getMessage(), "\n"; }
+
+try { $x = "x$badStr$str"; }
+catch (Exception $e) { echo $e->getMessage(), "\n"; }
+try { $x = "x$str$badStr"; }
+catch (Exception $e) { echo $e->getMessage(), "\n"; }
+try { $x = "{$str}x$badStr"; }
+catch (Exception $e) { echo $e->getMessage(), "\n"; }
+try { $x = "{$badStr}x$str"; }
+catch (Exception $e) { echo $e->getMessage(), "\n"; }
+
+try { $x = (string) $badStr; }
+catch (Exception $e) { echo $e->getMessage(), "\n"; }
+
+try { $x = include $badStr; }
+catch (Exception $e) { echo $e->getMessage(), "\n"; }
+
+try { echo $badStr; }
+catch (Exception $e) { echo $e->getMessage(), "\n"; }
+
+${""} = 42;
+try { unset(${$badStr}); }
+catch (Exception $e) { echo $e->getMessage(), "\n"; }
+var_dump(${""});
+
+unset(${""});
+try { $x = ${$badStr}; }
+catch (Exception $e) { echo $e->getMessage(), "\n"; }
+
+try { $x = isset(${$badStr}); }
+catch (Exception $e) { echo $e->getMessage(), "\n"; }
+
+$obj = new stdClass;
+try { $x = $obj->{$badStr} = $str; }
+catch (Exception $e) { echo $e->getMessage(), "\n"; }
+var_dump($obj);
+
+try { $str[0] = $badStr; }
+catch (Exception $e) { echo $e->getMessage(), "\n"; }
+var_dump($str);
+
+$obj = new DateInterval('P1D');
+try { $x = $obj->{$badStr} = $str; }
+catch (Exception $e) { echo $e->getMessage(), "\n"; }
+var_dump(!isset($obj->{""}));
+
+try { strlen($badStr); } catch (Exception $e) { echo "Exception\n"; }
+try { substr($badStr, 0); } catch (Exception $e) { echo "Exception\n"; }
+try { new ArrayObject([], 0, $badStr); } catch (Exception $e) { echo "Exception\n"; }
+
+?>
+--EXPECT--
+Exception
+Exception
+Exception
+string(1) "a"
+Exception
+Exception
+Exception
+int(42)
+Exception
+object(BadStr)#1 (0) {
+}
+Exception
+object(BadStr)#1 (0) {
+}
+Exception
+Exception
+Exception
+Exception
+Exception
+Exception
+Exception
+Exception
+Exception
+Exception
+Exception
+Exception
+int(42)
+Exception
+Exception
+Exception
+object(stdClass)#2 (0) {
+}
+Exception
+string(1) "a"
+Exception
+bool(true)
+Exception
+Exception
+Exception
diff --git a/Zend/tests/exception_ignore_args.phpt b/Zend/tests/exception_ignore_args.phpt
new file mode 100644
index 0000000000..6dcb872254
--- /dev/null
+++ b/Zend/tests/exception_ignore_args.phpt
@@ -0,0 +1,18 @@
+--TEST--
+Exceptions ignoring arguments
+--FILE--
+<?php
+$function = function(string $user, string $pass) {
+ throw new Exception();
+};
+
+ini_set("zend.exception_ignore_args", 1);
+
+$function("secrets", "arewrong");
+?>
+--EXPECTF--
+Fatal error: Uncaught Exception in %sexception_ignore_args.php:3
+Stack trace:
+#0 %sexception_ignore_args.php(8): {closure}()
+#1 {main}
+ thrown in %sexception_ignore_args.php on line 3
diff --git a/Zend/tests/fe_fetch_op2_live_range.phpt b/Zend/tests/fe_fetch_op2_live_range.phpt
new file mode 100644
index 0000000000..c601e43120
--- /dev/null
+++ b/Zend/tests/fe_fetch_op2_live_range.phpt
@@ -0,0 +1,12 @@
+--TEST--
+FE_FETCH op2 is a def and needs special live range handling
+--FILE--
+<?php
+try {
+ foreach (["test"] as $k => func()[]) {}
+} catch (Error $e) {
+ echo $e->getMessage(), "\n";
+}
+?>
+--EXPECT--
+Call to undefined function func()
diff --git a/Zend/tests/foreach_shadowed_dyn_property.phpt b/Zend/tests/foreach_shadowed_dyn_property.phpt
new file mode 100644
index 0000000000..8f71cdf240
--- /dev/null
+++ b/Zend/tests/foreach_shadowed_dyn_property.phpt
@@ -0,0 +1,29 @@
+--TEST--
+Dynamic property shadowed by private property
+--FILE--
+<?php
+
+class Test {
+ private $prop = "Test";
+
+ function run() {
+ foreach ($this as $k => $v) {
+ echo "$k => $v\n";
+ }
+ var_dump(get_object_vars($this));
+ }
+}
+class Test2 extends Test {
+}
+
+$test2 = new Test2;
+$test2->prop = "Test2";
+$test2->run();
+
+?>
+--EXPECT--
+prop => Test
+array(1) {
+ ["prop"]=>
+ string(4) "Test"
+}
diff --git a/Zend/tests/foreach_shadowed_property.phpt b/Zend/tests/foreach_shadowed_property.phpt
new file mode 100644
index 0000000000..55d5821e77
--- /dev/null
+++ b/Zend/tests/foreach_shadowed_property.phpt
@@ -0,0 +1,28 @@
+--TEST--
+Foreach over object with shadowed private property
+--FILE--
+<?php
+
+class Test {
+ private $prop = "Test";
+
+ function run() {
+ foreach ($this as $k => $v) {
+ echo "$k => $v\n";
+ }
+ var_dump(get_object_vars($this));
+ }
+}
+class Test2 extends Test {
+ public $prop = "Test2";
+}
+
+(new Test2)->run();
+
+?>
+--EXPECT--
+prop => Test
+array(1) {
+ ["prop"]=>
+ string(4) "Test"
+}
diff --git a/Zend/tests/function_exists_error.phpt b/Zend/tests/function_exists_error.phpt
deleted file mode 100644
index f07ac53148..0000000000
--- a/Zend/tests/function_exists_error.phpt
+++ /dev/null
@@ -1,35 +0,0 @@
---TEST--
-Test function_exists() function : error conditions
---FILE--
-<?php
-/*
- * proto bool function_exists(string function_name)
- * Function is implemented in Zend/zend_builtin_functions.c
-*/
-
-echo "*** Testing function_exists() : error conditions ***\n";
-
-$arg_0 = "ABC";
-$extra_arg = 1;
-
-echo "\nToo many arguments\n";
-var_dump(function_exists($arg_0, $extra_arg));
-
-echo "\nToo few arguments\n";
-var_dump(function_exists());
-
-?>
-===Done===
---EXPECTF--
-*** Testing function_exists() : error conditions ***
-
-Too many arguments
-
-Warning: function_exists() expects exactly 1 parameter, 2 given in %s on line %d
-NULL
-
-Too few arguments
-
-Warning: function_exists() expects exactly 1 parameter, 0 given in %s on line %d
-NULL
-===Done===
diff --git a/Zend/tests/function_exists_variation1.phpt b/Zend/tests/function_exists_variation1.phpt
deleted file mode 100644
index bd74e2f762..0000000000
--- a/Zend/tests/function_exists_variation1.phpt
+++ /dev/null
@@ -1,138 +0,0 @@
---TEST--
-Test function_exists() function : usage variations - test values for $str argument
---FILE--
-<?php
-
-/*
- * proto bool function_exists(string function_name)
- * Function is implemented in Zend/zend_builtin_functions.c
-*/
-
-echo "*** Testing function_exists() function: with unexpected inputs for 'str' argument ***\n";
-
-//get an unset variable
-$unset_var = 'string_val';
-unset($unset_var);
-
-//defining a class
-class sample {
- public function __toString() {
- return "sample object";
- }
-}
-
-//getting the resource
-$file_handle = fopen(__FILE__, "r");
-
-// array with different values for $str
-$inputs = array (
-
- // integer values
- 0,
- 1,
- 255,
- 256,
- PHP_INT_MAX,
- -PHP_INT_MAX,
-
- // float values
- 10.5,
- -20.5,
- 10.1234567e10,
-
- // array values
- array(),
- array(0),
- array(1, 2),
-
- // boolean values
- true,
- false,
- TRUE,
- FALSE,
-
- // null values
- NULL,
- null,
-
- // objects
- new sample(),
-
- // resource
- $file_handle,
-
- // undefined variable
- @$undefined_var,
-
- // unset variable
- @$unset_var
-);
-
-// loop through with each element of the $inputs array to test function_exists() function
-$count = 1;
-foreach($inputs as $input) {
- echo "-- Iteration $count --\n";
- var_dump( function_exists($input) );
- $count ++;
-}
-
-fclose($file_handle); //closing the file handle
-
-?>
-===Done===
---EXPECTF--
-*** Testing function_exists() function: with unexpected inputs for 'str' argument ***
--- Iteration 1 --
-bool(false)
--- Iteration 2 --
-bool(false)
--- Iteration 3 --
-bool(false)
--- Iteration 4 --
-bool(false)
--- Iteration 5 --
-bool(false)
--- Iteration 6 --
-bool(false)
--- Iteration 7 --
-bool(false)
--- Iteration 8 --
-bool(false)
--- Iteration 9 --
-bool(false)
--- Iteration 10 --
-
-Warning: function_exists() expects parameter 1 to be string, array given in %s on line %d
-NULL
--- Iteration 11 --
-
-Warning: function_exists() expects parameter 1 to be string, array given in %s on line %d
-NULL
--- Iteration 12 --
-
-Warning: function_exists() expects parameter 1 to be string, array given in %s on line %d
-NULL
--- Iteration 13 --
-bool(false)
--- Iteration 14 --
-bool(false)
--- Iteration 15 --
-bool(false)
--- Iteration 16 --
-bool(false)
--- Iteration 17 --
-bool(false)
--- Iteration 18 --
-bool(false)
--- Iteration 19 --
-bool(false)
--- Iteration 20 --
-
-Warning: function_exists() expects parameter 1 to be string, resource given in %s on line %d
-NULL
--- Iteration 21 --
-bool(false)
--- Iteration 22 --
-bool(false)
-===Done===
-
diff --git a/Zend/tests/gc_011.phpt b/Zend/tests/gc_011.phpt
index 9c4cc2cc0e..d11d7b6b46 100644
--- a/Zend/tests/gc_011.phpt
+++ b/Zend/tests/gc_011.phpt
@@ -15,6 +15,7 @@ $a->a = $a;
var_dump($a);
unset($a);
var_dump(gc_collect_cycles());
+var_dump(gc_collect_cycles());
echo "ok\n"
?>
--EXPECTF--
@@ -23,5 +24,6 @@ object(Foo)#%d (1) {
*RECURSION*
}
__destruct
+int(0)
int(1)
ok
diff --git a/Zend/tests/gc_016.phpt b/Zend/tests/gc_016.phpt
index f082d60973..211f03a605 100644
--- a/Zend/tests/gc_016.phpt
+++ b/Zend/tests/gc_016.phpt
@@ -23,6 +23,6 @@ echo "ok\n"
?>
--EXPECT--
-> int(0)
-int(1)
-int(1)
+int(0)
+int(2)
ok
diff --git a/Zend/tests/gc_017.phpt b/Zend/tests/gc_017.phpt
index a1a8c3eaf6..55f381992e 100644
--- a/Zend/tests/gc_017.phpt
+++ b/Zend/tests/gc_017.phpt
@@ -31,12 +31,14 @@ $a->insert($c);
unset($a);
unset($b);
unset($c);
-var_dump(gc_collect_cycles() >= 7);
+var_dump(gc_collect_cycles());
+var_dump(gc_collect_cycles());
echo "ok\n"
?>
--EXPECTF--
string(1) "%s"
string(1) "%s"
string(1) "%s"
-bool(true)
+int(0)
+int(1)
ok
diff --git a/Zend/tests/gc_028.phpt b/Zend/tests/gc_028.phpt
index 8dc70fc397..fb2ea92c91 100644
--- a/Zend/tests/gc_028.phpt
+++ b/Zend/tests/gc_028.phpt
@@ -28,6 +28,8 @@ $bar->foo = $foo;
unset($foo);
unset($bar);
var_dump(gc_collect_cycles());
+var_dump(gc_collect_cycles());
?>
--EXPECT--
-int(2)
+int(0)
+int(1)
diff --git a/Zend/tests/gc_029.phpt b/Zend/tests/gc_029.phpt
index 215d0e0e3b..89c55e5ba7 100644
--- a/Zend/tests/gc_029.phpt
+++ b/Zend/tests/gc_029.phpt
@@ -30,6 +30,8 @@ $bar->foo = $foo;
unset($foo);
unset($bar);
var_dump(gc_collect_cycles());
+var_dump(gc_collect_cycles());
?>
---EXPECTREGEX--
-int\([23]\)
+--EXPECT--
+int(0)
+int(1)
diff --git a/Zend/tests/gc_033.phpt b/Zend/tests/gc_033.phpt
index 2db10196ad..1fd36976ad 100644
--- a/Zend/tests/gc_033.phpt
+++ b/Zend/tests/gc_033.phpt
@@ -27,4 +27,4 @@ for ($i=0; $i<9999; $i++) {
var_dump(gc_collect_cycles());
?>
--EXPECT--
-int(20001)
+int(10002)
diff --git a/Zend/tests/gc_035.phpt b/Zend/tests/gc_035.phpt
index 177c3101f9..187af9108b 100644
--- a/Zend/tests/gc_035.phpt
+++ b/Zend/tests/gc_035.phpt
@@ -22,5 +22,5 @@ var_dump(gc_collect_cycles());
var_dump(gc_collect_cycles());
--EXPECT--
int(0)
-int(2)
int(0)
+int(2)
diff --git a/Zend/tests/gc_041.phpt b/Zend/tests/gc_041.phpt
index 7400e23756..fc849991e1 100644
--- a/Zend/tests/gc_041.phpt
+++ b/Zend/tests/gc_041.phpt
@@ -18,10 +18,11 @@ $o->nested[] =& $o->nested;
$o->ryat = $o;
$x =& $o->chtg;
unset($o);
-gc_collect_cycles();
+var_dump(gc_collect_cycles());
var_dump($x);
?>
--EXPECT--
+int(0)
object(ryat)#1 (3) {
["ryat"]=>
*RECURSION*
@@ -32,4 +33,4 @@ object(ryat)#1 (3) {
[0]=>
*RECURSION*
}
-} \ No newline at end of file
+}
diff --git a/Zend/tests/generators/bug65035.phpt b/Zend/tests/generators/bug65035.phpt
index 18276cc23a..cc7f5b68a3 100644
--- a/Zend/tests/generators/bug65035.phpt
+++ b/Zend/tests/generators/bug65035.phpt
@@ -4,11 +4,11 @@ Bug #65035: yield / exit segfault
<?php
function gen() {
- fn();
+ f();
yield;
}
-function fn() {
+function f() {
exit('Done');
}
diff --git a/Zend/tests/generators/bug76427.phpt b/Zend/tests/generators/bug76427.phpt
index 09ec61a340..53851b0f35 100644
--- a/Zend/tests/generators/bug76427.phpt
+++ b/Zend/tests/generators/bug76427.phpt
@@ -21,4 +21,4 @@ var_dump(gc_collect_cycles());
?>
--EXPECT--
-int(4)
+int(2)
diff --git a/Zend/tests/generators/bug78434.phpt b/Zend/tests/generators/bug78434.phpt
new file mode 100644
index 0000000000..dd9351e168
--- /dev/null
+++ b/Zend/tests/generators/bug78434.phpt
@@ -0,0 +1,27 @@
+--TEST--
+Bug #78434: Generator skips first item after valid() call
+--FILE--
+<?php
+
+$function = function () {
+ yield 0;
+};
+
+$wrapper = function () use ($function) {
+ $generator = $function();
+ $generator->valid();
+ yield from $generator;
+
+ $generator = $function();
+ $generator->valid();
+ yield from $generator;
+};
+
+foreach ($wrapper() as $value) {
+ echo $value, "\n";
+}
+
+?>
+--EXPECT--
+0
+0
diff --git a/Zend/tests/generators/bug79600.phpt b/Zend/tests/generators/bug79600.phpt
new file mode 100644
index 0000000000..4abe9784b6
--- /dev/null
+++ b/Zend/tests/generators/bug79600.phpt
@@ -0,0 +1,24 @@
+--TEST--
+Bug #79600: Regression in 7.4.6 when yielding an array based generator
+--FILE--
+<?php
+
+function createArrayGenerator() {
+ yield from [
+ 1,
+ 2,
+ ];
+}
+
+function createGeneratorFromArrayGenerator() {
+ yield from createArrayGenerator();
+}
+
+foreach (createGeneratorFromArrayGenerator() as $value) {
+ echo $value, "\n";
+}
+
+?>
+--EXPECT--
+1
+2
diff --git a/Zend/tests/generators/gc_with_iterator_in_foreach.phpt b/Zend/tests/generators/gc_with_iterator_in_foreach.phpt
new file mode 100644
index 0000000000..ed13c2be96
--- /dev/null
+++ b/Zend/tests/generators/gc_with_iterator_in_foreach.phpt
@@ -0,0 +1,21 @@
+--TEST--
+Generator GC triggered with live iterator in foreach
+--FILE--
+<?php
+
+function gen($iter, &$gen) {
+ foreach ($iter as $v) {
+ yield;
+ }
+}
+
+$iter = new ArrayIterator([1, 2, 3]);
+$gen = gen($iter, $gen);
+$gen->next();
+unset($gen);
+gc_collect_cycles();
+
+?>
+===DONE===
+--EXPECT--
+===DONE===
diff --git a/Zend/tests/generators/yield_from_multi_tree.phpt b/Zend/tests/generators/yield_from_multi_tree.phpt
index 9bec138149..808d693eae 100644
--- a/Zend/tests/generators/yield_from_multi_tree.phpt
+++ b/Zend/tests/generators/yield_from_multi_tree.phpt
@@ -10,9 +10,6 @@ function from($levels) {
}
function gen($gen, $level) {
- if ($level % 2) {
- yield $gen->current();
- }
yield from $gen;
}
diff --git a/Zend/tests/generators/yield_in_finally_cleanup.phpt b/Zend/tests/generators/yield_in_finally_cleanup.phpt
new file mode 100644
index 0000000000..9a76261e0d
--- /dev/null
+++ b/Zend/tests/generators/yield_in_finally_cleanup.phpt
@@ -0,0 +1,51 @@
+--TEST--
+Free pending exceptions / return values on clone on yield in finally
+--FILE--
+<?php
+function gen1() {
+ try {
+ throw new Exception();
+ } finally {
+ yield;
+ }
+}
+function gen2() {
+ try {
+ $bar = "bar";
+ return "foo" . $bar;
+ } finally {
+ yield;
+ }
+}
+function gen3() {
+ try {
+ throw new Exception();
+ } finally {
+ try {
+ $bar = "bar";
+ return "foo" . $bar;
+ } finally {
+ yield;
+ }
+ }
+}
+function gen4() {
+ try {
+ try {
+ $bar = "bar";
+ return "foo" . $bar;
+ } finally {
+ yield;
+ }
+ } finally {
+ }
+}
+gen1()->rewind();
+gen2()->rewind();
+gen3()->rewind();
+gen4()->rewind();
+
+?>
+===DONE===
+--EXPECT--
+===DONE===
diff --git a/Zend/tests/get_class_vars_typed_props.phpt b/Zend/tests/get_class_vars_typed_props.phpt
new file mode 100644
index 0000000000..6e9747265c
--- /dev/null
+++ b/Zend/tests/get_class_vars_typed_props.phpt
@@ -0,0 +1,26 @@
+--TEST--
+get_class_vars() returns uninitialized typed properties with a null value
+--FILE--
+<?php
+
+class Test {
+ public static int $int1;
+ public static int $int2 = 42;
+ public int $int3;
+ public int $int4 = 42;
+}
+
+var_dump(get_class_vars(Test::class));
+
+?>
+--EXPECT--
+array(4) {
+ ["int3"]=>
+ NULL
+ ["int4"]=>
+ int(42)
+ ["int1"]=>
+ NULL
+ ["int2"]=>
+ int(42)
+}
diff --git a/Zend/tests/get_defined_functions_error.phpt b/Zend/tests/get_defined_functions_error.phpt
deleted file mode 100644
index 1735446b2e..0000000000
--- a/Zend/tests/get_defined_functions_error.phpt
+++ /dev/null
@@ -1,29 +0,0 @@
---TEST--
-Test get_defined_functions() function : error conditions
---FILE--
-<?php
-
-/* Prototype : array get_defined_functions ( $exclude_disabled = false )
- * Description: Gets an array of all defined functions.
- * Source code: Zend/zend_builtin_functions.c
-*/
-
-
-echo "*** Testing get_defined_functions() : error conditions ***\n";
-
-
-echo "\n-- Testing get_defined_functions() function with more than expected no. of arguments --\n";
-$extra_arg = 10;
-$extra_arg2 = 20;
-var_dump( get_defined_functions($extra_arg, $extra_arg2) );
-
-?>
-===Done===
---EXPECTF--
-*** Testing get_defined_functions() : error conditions ***
-
--- Testing get_defined_functions() function with more than expected no. of arguments --
-
-Warning: get_defined_functions() expects at most 1 parameter, 2 given in %s on line %d
-NULL
-===Done===
diff --git a/Zend/tests/get_mangled_object_vars.phpt b/Zend/tests/get_mangled_object_vars.phpt
new file mode 100644
index 0000000000..735548579e
--- /dev/null
+++ b/Zend/tests/get_mangled_object_vars.phpt
@@ -0,0 +1,49 @@
+--TEST--
+get_mangled_object_vars() function
+--FILE--
+<?php
+
+class A {
+ public $pub = 1;
+ protected $prot = 2;
+ private $priv = 3;
+}
+class B extends A {
+ private $priv = 4;
+}
+
+$obj = new B;
+$obj->dyn = 5;
+$obj->{"6"} = 6;
+
+var_export(get_mangled_object_vars($obj));
+echo "\n";
+
+class AO extends ArrayObject {
+ private $priv = 1;
+}
+
+$ao = new AO(['x' => 'y']);
+$ao->dyn = 2;
+var_export(get_mangled_object_vars($ao));
+echo "\n";
+var_export((array) $ao);
+echo "\n";
+
+?>
+--EXPECT--
+array (
+ '' . "\0" . 'B' . "\0" . 'priv' => 4,
+ 'pub' => 1,
+ '' . "\0" . '*' . "\0" . 'prot' => 2,
+ '' . "\0" . 'A' . "\0" . 'priv' => 3,
+ 'dyn' => 5,
+ 6 => 6,
+)
+array (
+ '' . "\0" . 'AO' . "\0" . 'priv' => 1,
+ 'dyn' => 2,
+)
+array (
+ 'x' => 'y',
+)
diff --git a/Zend/tests/globals_004.phpt b/Zend/tests/globals_004.phpt
index 6e21b7fbc0..0f2f7f0764 100644
--- a/Zend/tests/globals_004.phpt
+++ b/Zend/tests/globals_004.phpt
@@ -6,7 +6,7 @@ variables_order="egpcs"
<?php
function test() {
- include dirname(__FILE__)."/globals.inc";
+ include __DIR__."/globals.inc";
}
test();
diff --git a/Zend/tests/grammar/semi_reserved_001.phpt b/Zend/tests/grammar/semi_reserved_001.phpt
index 68b35d3f22..bbb8ccdede 100644
--- a/Zend/tests/grammar/semi_reserved_001.phpt
+++ b/Zend/tests/grammar/semi_reserved_001.phpt
@@ -56,6 +56,7 @@ class Obj
function switch(){ echo __METHOD__, PHP_EOL; }
function yield(){ echo __METHOD__, PHP_EOL; }
function function(){ echo __METHOD__, PHP_EOL; }
+ function fn(){ echo __METHOD__, PHP_EOL; }
function if(){ echo __METHOD__, PHP_EOL; }
function endswitch(){ echo __METHOD__, PHP_EOL; }
function finally(){ echo __METHOD__, PHP_EOL; }
@@ -135,6 +136,7 @@ $obj->continue();
$obj->switch();
$obj->yield();
$obj->function();
+$obj->fn();
$obj->if();
$obj->endswitch();
$obj->finally();
@@ -213,6 +215,7 @@ Obj::continue
Obj::switch
Obj::yield
Obj::function
+Obj::fn
Obj::if
Obj::endswitch
Obj::finally
diff --git a/Zend/tests/grammar/semi_reserved_002.phpt b/Zend/tests/grammar/semi_reserved_002.phpt
index 4aa0f27e5e..59cd97479e 100644
--- a/Zend/tests/grammar/semi_reserved_002.phpt
+++ b/Zend/tests/grammar/semi_reserved_002.phpt
@@ -56,6 +56,7 @@ class Obj
static function switch(){ echo __METHOD__, PHP_EOL; }
static function yield(){ echo __METHOD__, PHP_EOL; }
static function function(){ echo __METHOD__, PHP_EOL; }
+ static function fn(){ echo __METHOD__, PHP_EOL; }
static function if(){ echo __METHOD__, PHP_EOL; }
static function endswitch(){ echo __METHOD__, PHP_EOL; }
static function finally(){ echo __METHOD__, PHP_EOL; }
@@ -133,6 +134,7 @@ Obj::continue();
Obj::switch();
Obj::yield();
Obj::function();
+Obj::fn();
Obj::if();
Obj::endswitch();
Obj::finally();
@@ -211,6 +213,7 @@ Obj::continue
Obj::switch
Obj::yield
Obj::function
+Obj::fn
Obj::if
Obj::endswitch
Obj::finally
diff --git a/Zend/tests/grammar/semi_reserved_003.phpt b/Zend/tests/grammar/semi_reserved_003.phpt
index 8e459a636f..360647135b 100644
--- a/Zend/tests/grammar/semi_reserved_003.phpt
+++ b/Zend/tests/grammar/semi_reserved_003.phpt
@@ -56,6 +56,7 @@ class Obj
var $switch = 'switch';
var $yield = 'yield';
var $function = 'function';
+ var $fn = 'fn';
var $if = 'if';
var $endswitch = 'endswitch';
var $finally = 'finally';
@@ -136,6 +137,7 @@ echo $obj->continue, PHP_EOL;
echo $obj->switch, PHP_EOL;
echo $obj->yield, PHP_EOL;
echo $obj->function, PHP_EOL;
+echo $obj->fn, PHP_EOL;
echo $obj->if, PHP_EOL;
echo $obj->endswitch, PHP_EOL;
echo $obj->finally, PHP_EOL;
@@ -217,6 +219,7 @@ continue
switch
yield
function
+fn
if
endswitch
finally
diff --git a/Zend/tests/grammar/semi_reserved_004.phpt b/Zend/tests/grammar/semi_reserved_004.phpt
index 5a625a608b..2ab1f3139e 100644
--- a/Zend/tests/grammar/semi_reserved_004.phpt
+++ b/Zend/tests/grammar/semi_reserved_004.phpt
@@ -56,6 +56,7 @@ class Obj
static $switch = 'switch';
static $yield = 'yield';
static $function = 'function';
+ static $fn = 'fn';
static $if = 'if';
static $endswitch = 'endswitch';
static $finally = 'finally';
@@ -134,6 +135,7 @@ echo Obj::$continue, PHP_EOL;
echo Obj::$switch, PHP_EOL;
echo Obj::$yield, PHP_EOL;
echo Obj::$function, PHP_EOL;
+echo Obj::$fn, PHP_EOL;
echo Obj::$if, PHP_EOL;
echo Obj::$endswitch, PHP_EOL;
echo Obj::$finally, PHP_EOL;
@@ -213,6 +215,7 @@ continue
switch
yield
function
+fn
if
endswitch
finally
diff --git a/Zend/tests/grammar/semi_reserved_005.phpt b/Zend/tests/grammar/semi_reserved_005.phpt
index 2cf7709b15..3e74024ecc 100644
--- a/Zend/tests/grammar/semi_reserved_005.phpt
+++ b/Zend/tests/grammar/semi_reserved_005.phpt
@@ -55,6 +55,7 @@ class Obj
const SWITCH = 'switch';
const YIELD = 'yield';
const FUNCTION = 'function';
+ const FN = 'fn';
const IF = 'if';
const ENDSWITCH = 'endswitch';
const FINALLY = 'finally';
@@ -131,6 +132,7 @@ echo Obj::CONTINUE, PHP_EOL;
echo Obj::SWITCH, PHP_EOL;
echo Obj::YIELD, PHP_EOL;
echo Obj::FUNCTION, PHP_EOL;
+echo Obj::FN, PHP_EOL;
echo Obj::IF, PHP_EOL;
echo Obj::ENDSWITCH, PHP_EOL;
echo Obj::FINALLY, PHP_EOL;
@@ -208,6 +210,7 @@ continue
switch
yield
function
+fn
if
endswitch
finally
diff --git a/Zend/tests/grandparent_prototype.phpt b/Zend/tests/grandparent_prototype.phpt
new file mode 100644
index 0000000000..872969654d
--- /dev/null
+++ b/Zend/tests/grandparent_prototype.phpt
@@ -0,0 +1,26 @@
+--TEST--
+Protected visibility test case with a grandparent prototype
+--FILE--
+<?php
+
+class A {
+ protected function test() {}
+}
+class B extends A {
+ public function test2($x) {
+ $x->test(); // Uncaught Error: Call to protected method D::test() from context 'B'
+ }
+}
+class C extends A {
+ protected function test() {}
+}
+class D extends C {
+ protected function test() {
+ echo "Hello World!\n";
+ }
+}
+(new B)->test2(new D);
+
+?>
+--EXPECT--
+Hello World!
diff --git a/Zend/tests/halt_compiler2.phpt b/Zend/tests/halt_compiler2.phpt
index da8ac6cae9..a89274a804 100644
--- a/Zend/tests/halt_compiler2.phpt
+++ b/Zend/tests/halt_compiler2.phpt
@@ -4,18 +4,18 @@ __HALT_COMPILER(); 2 files
<?php
$text = "<?php echo 'test'; var_dump(__COMPILER_HALT_OFFSET__); __HALT_COMPILER(); ?>
hi there";
-file_put_contents(dirname(__FILE__) . '/test1.php', $text);
+file_put_contents(__DIR__ . '/test1.php', $text);
$text = "<?php echo 'test2'; var_dump(__COMPILER_HALT_OFFSET__); __HALT_COMPILER(); ?>
hi there 2";
-file_put_contents(dirname(__FILE__) . '/test2.php', $text);
-include dirname(__FILE__) . '/test1.php';
-include dirname(__FILE__) . '/test2.php';
+file_put_contents(__DIR__ . '/test2.php', $text);
+include __DIR__ . '/test1.php';
+include __DIR__ . '/test2.php';
?>
==DONE==
--CLEAN--
<?php
-unlink(dirname(__FILE__) . '/test1.php');
-unlink(dirname(__FILE__) . '/test2.php');
+unlink(__DIR__ . '/test1.php');
+unlink(__DIR__ . '/test2.php');
?>
--EXPECT--
testint(73)
diff --git a/Zend/tests/include_fail_during_read.phpt b/Zend/tests/include_fail_during_read.phpt
new file mode 100644
index 0000000000..e2e3e19cc9
--- /dev/null
+++ b/Zend/tests/include_fail_during_read.phpt
@@ -0,0 +1,12 @@
+--TEST--
+Include fails during read
+--FILE--
+<?php
+class SampleFilter extends php_user_filter { }
+stream_filter_register('sample.filter', SampleFilter::class);
+include 'php://filter/read=sample.filter/resource='. __FILE__;
+?>
+--EXPECTF--
+Warning: include(): Unprocessed filter buckets remaining on input brigade in %s on line %d
+
+Warning: include(): Failed opening 'php://filter/read=sample.filter/resource=%s' for inclusion (include_path='%s') in %s on line %d
diff --git a/Zend/tests/include_stat_is_quiet.phpt b/Zend/tests/include_stat_is_quiet.phpt
new file mode 100644
index 0000000000..006fad50bd
--- /dev/null
+++ b/Zend/tests/include_stat_is_quiet.phpt
@@ -0,0 +1,30 @@
+--TEST--
+Stats executed during include path resolution should be silent
+--FILE--
+<?php
+
+class StreamWrapper {
+ public function url_stat($path, $flags) {
+ $path = str_replace('test://', 'file://', $path);
+ if ($flags & STREAM_URL_STAT_QUIET) {
+ return @stat($path);
+ } else {
+ return stat($path);
+ }
+ }
+}
+
+stream_wrapper_register('test', StreamWrapper::class);
+set_include_path('test://foo:test://bar');
+
+try {
+ require_once 'doesnt_exist.php';
+} catch (Exception $e) {
+ echo $e->getMessage(), "\n";
+}
+
+?>
+--EXPECTF--
+Warning: require_once(doesnt_exist.php): failed to open stream: No such file or directory in %s on line %d
+
+Fatal error: require_once(): Failed opening required 'doesnt_exist.php' (include_path='test://foo:test://bar') in %s on line %d
diff --git a/Zend/tests/instanceof_001.phpt b/Zend/tests/instanceof_001.phpt
index 8c13a0478c..6bdcb896af 100644
--- a/Zend/tests/instanceof_001.phpt
+++ b/Zend/tests/instanceof_001.phpt
@@ -16,8 +16,6 @@ var_dump($c[0] instanceof stdClass);
var_dump(@$inexistent instanceof stdClass);
-var_dump("$a" instanceof stdClass);
-
?>
--EXPECTF--
bool(true)
@@ -27,5 +25,3 @@ Deprecated: Function create_function() is deprecated in %s on line %d
bool(true)
bool(true)
bool(false)
-
-Recoverable fatal error: Object of class stdClass could not be converted to string in %s on line %d
diff --git a/Zend/tests/inter_007.phpt b/Zend/tests/inter_007.phpt
index 610210a7da..fa7c368a5e 100644
--- a/Zend/tests/inter_007.phpt
+++ b/Zend/tests/inter_007.phpt
@@ -17,4 +17,4 @@ interface a extends d, w { }
?>
--EXPECTF--
-Fatal error: Cannot make non static method c::B() static in class d in %s on line %d
+Fatal error: Cannot make non static method c::B() static in class d in %s on line 4
diff --git a/Zend/tests/is_callable_trampoline_uaf.phpt b/Zend/tests/is_callable_trampoline_uaf.phpt
new file mode 100644
index 0000000000..2410864410
--- /dev/null
+++ b/Zend/tests/is_callable_trampoline_uaf.phpt
@@ -0,0 +1,27 @@
+--TEST--
+is_callable() with trampoline should not caused UAF
+--FILE--
+<?php
+
+class B {}
+class A extends B {
+ public function bar($func) {
+ var_dump(is_callable(array('parent', 'foo')));
+ }
+
+ public function __call($func, $args) {
+ }
+}
+
+class X {
+ public static function __callStatic($func, $args) {
+ }
+}
+
+$a = new A();
+// Extra X::foo() wrapper to force use of allocated trampoline.
+X::foo($a->bar('foo'));
+
+?>
+--EXPECT--
+bool(false)
diff --git a/Zend/tests/isset_003.phpt b/Zend/tests/isset_003.phpt
index eac72f7e0a..06cbe3d51d 100644
--- a/Zend/tests/isset_003.phpt
+++ b/Zend/tests/isset_003.phpt
@@ -33,6 +33,8 @@ Notice: Undefined variable: c in %s on line %d
Notice: Undefined variable: d in %s on line %d
+Notice: Trying to access array offset on value of type null in %s on line %d
+
Notice: Trying to get property '' of non-object in %s on line %d
bool(false)
bool(true)
diff --git a/Zend/tests/isset_str_offset.phpt b/Zend/tests/isset_str_offset.phpt
index 6be0f227a4..5f7b72771f 100644
--- a/Zend/tests/isset_str_offset.phpt
+++ b/Zend/tests/isset_str_offset.phpt
@@ -60,7 +60,7 @@ var_dump(isset($str[$f]));
print "done\n";
?>
---EXPECTF--
+--EXPECT--
- isset ---
bool(true)
bool(false)
diff --git a/Zend/tests/magic_methods_008.phpt b/Zend/tests/magic_methods_008.phpt
index 61c4fa0a29..25731516e6 100644
--- a/Zend/tests/magic_methods_008.phpt
+++ b/Zend/tests/magic_methods_008.phpt
@@ -16,4 +16,4 @@ class a extends b {
--EXPECTF--
Warning: The magic method __set() must have public visibility and cannot be static in %s on line %d
-Fatal error: Access level to a::__set() must be public (as in class b) in %s on line %d
+Fatal error: Access level to a::__set() must be public (as in class b) in %s on line 8
diff --git a/Zend/tests/method_exists_002.phpt b/Zend/tests/method_exists_002.phpt
index 385506b0b7..89d3f2824d 100644
--- a/Zend/tests/method_exists_002.phpt
+++ b/Zend/tests/method_exists_002.phpt
@@ -62,7 +62,7 @@ bool(true)
bool(true)
----
bool(true)
-bool(true)
+bool(false)
bool(true)
----
bool(true)
diff --git a/Zend/tests/methods-on-non-objects-nested.inc b/Zend/tests/methods-on-non-objects-nested.inc
deleted file mode 100755
index 63d1c0d0da..0000000000
--- a/Zend/tests/methods-on-non-objects-nested.inc
+++ /dev/null
@@ -1,4 +0,0 @@
-<?php
-function nested() {
- throw new LogicException('Should not be called');
-}
diff --git a/Zend/tests/multibyte/bug68665.phpt b/Zend/tests/multibyte/bug68665.phpt
index 74ff01da33..6846776570 100644
--- a/Zend/tests/multibyte/bug68665.phpt
+++ b/Zend/tests/multibyte/bug68665.phpt
@@ -11,7 +11,7 @@ if (!extension_loaded("mbstring")) {
?>
--INI--
zend.multibyte=1
-mbstring.internal_encoding=big5
+internal_encoding=big5
--FILE--
<?php
echo '\'hello';
diff --git a/Zend/tests/multibyte/multibyte_encoding_001.phpt b/Zend/tests/multibyte/multibyte_encoding_001.phpt
index 38aa80a40a..1a094814ec 100644
--- a/Zend/tests/multibyte/multibyte_encoding_001.phpt
+++ b/Zend/tests/multibyte/multibyte_encoding_001.phpt
@@ -11,7 +11,7 @@ if (!extension_loaded("mbstring")) {
?>
--INI--
zend.multibyte=1
-mbstring.internal_encoding=SJIS
+internal_encoding=SJIS
--FILE--
<?php
declare(encoding='Shift_JIS');
diff --git a/Zend/tests/multibyte/multibyte_encoding_002.phpt b/Zend/tests/multibyte/multibyte_encoding_002.phpt
index 6e1ad80c9f..58ea015a6f 100644
--- a/Zend/tests/multibyte/multibyte_encoding_002.phpt
+++ b/Zend/tests/multibyte/multibyte_encoding_002.phpt
@@ -11,7 +11,7 @@ if (!extension_loaded("mbstring")) {
?>
--INI--
zend.multibyte=1
-mbstring.internal_encoding=iso-8859-1
+internal_encoding=iso-8859-1
--FILE--
<?php
print "Hello World\n";
diff --git a/Zend/tests/multibyte/multibyte_encoding_003.phpt b/Zend/tests/multibyte/multibyte_encoding_003.phpt
index 0f873dd07c..ee861dbcc4 100644
--- a/Zend/tests/multibyte/multibyte_encoding_003.phpt
+++ b/Zend/tests/multibyte/multibyte_encoding_003.phpt
Binary files differ
diff --git a/Zend/tests/multibyte/multibyte_encoding_004.phpt b/Zend/tests/multibyte/multibyte_encoding_004.phpt
index 6d121d6680..1b4f4fecef 100644
--- a/Zend/tests/multibyte/multibyte_encoding_004.phpt
+++ b/Zend/tests/multibyte/multibyte_encoding_004.phpt
@@ -12,7 +12,7 @@ if (!extension_loaded("mbstring")) {
--INI--
zend.multibyte=1
zend.script_encoding=Shift_JIS
-mbstring.internal_encoding=Shift_JIS
+internal_encoding=Shift_JIS
--FILE--
<?php
function —\Ž\”\($ˆø”)
diff --git a/Zend/tests/multibyte/multibyte_encoding_005.phpt b/Zend/tests/multibyte/multibyte_encoding_005.phpt
index 6fee687483..305175d0cc 100644
--- a/Zend/tests/multibyte/multibyte_encoding_005.phpt
+++ b/Zend/tests/multibyte/multibyte_encoding_005.phpt
@@ -13,7 +13,7 @@ if (!extension_loaded("mbstring")) {
zend.multibyte=1
mbstring.encoding_translation = On
zend.script_encoding=Shift_JIS
-mbstring.internal_encoding=UTF-8
+internal_encoding=UTF-8
--FILE--
<?php
function —\Ž\”\($ˆø”)
diff --git a/Zend/tests/nested_method_and_function.phpt b/Zend/tests/nested_method_and_function.phpt
index c63c601eaf..3d19a06088 100644
--- a/Zend/tests/nested_method_and_function.phpt
+++ b/Zend/tests/nested_method_and_function.phpt
@@ -30,7 +30,7 @@ $c();
--EXPECT--
string(7) "Baz\foo"
string(7) "Baz\foo"
-string(7) "Baz\Foo"
+string(0) ""
string(3) "bar"
string(12) "Baz\Foo::bar"
string(7) "Baz\Foo"
diff --git a/Zend/tests/no_class_const_propagation_in_closures.phpt b/Zend/tests/no_class_const_propagation_in_closures.phpt
index e446573b9d..89d48e2d83 100644
--- a/Zend/tests/no_class_const_propagation_in_closures.phpt
+++ b/Zend/tests/no_class_const_propagation_in_closures.phpt
@@ -18,7 +18,7 @@ class B {
}
$f = (new A)->f();
-var_dump($f->bindTo(null, 'B')());
+var_dump($f->bindTo(new B, 'B')());
?>
--EXPECT--
diff --git a/Zend/tests/non_well_formed_param_exception.phpt b/Zend/tests/non_well_formed_param_exception.phpt
new file mode 100644
index 0000000000..d688375f9f
--- /dev/null
+++ b/Zend/tests/non_well_formed_param_exception.phpt
@@ -0,0 +1,22 @@
+--TEST--
+A "non well formed" notice converted to exception should result in a ZPP failure
+--FILE--
+<?php
+
+set_error_handler(function($_, $msg) {
+ throw new Exception($msg);
+}, E_NOTICE);
+
+try {
+ wordwrap("foo", "123foo", "");
+} catch (Exception $e) {
+ echo $e, "\n";
+}
+
+?>
+--EXPECTF--
+Exception: A non well formed numeric value encountered in %s:%d
+Stack trace:
+#0 [internal function]: {closure}(%s)
+#1 %s(%d): wordwrap('foo', '123foo', '')
+#2 {main}
diff --git a/Zend/tests/nowdoc_013.phpt b/Zend/tests/nowdoc_013.phpt
index 3e7d41fe07..61543f74e3 100644
--- a/Zend/tests/nowdoc_013.phpt
+++ b/Zend/tests/nowdoc_013.phpt
@@ -6,6 +6,7 @@ highlight.comment = #FF8000
highlight.keyword = #007700
highlight.default = #0000BB
highlight.html = #000000
+--WHITESPACE_SENSITIVE--
--FILE--
<?php
$code = <<<'EOF'
diff --git a/Zend/tests/ns_010.phpt b/Zend/tests/ns_010.phpt
index dfa35371b5..e0ccd349ed 100644
--- a/Zend/tests/ns_010.phpt
+++ b/Zend/tests/ns_010.phpt
@@ -1,5 +1,5 @@
--TEST--
-010: Accesing internal namespace class
+010: Accessing internal namespace class
--FILE--
<?php
namespace X;
diff --git a/Zend/tests/ns_020.phpt b/Zend/tests/ns_020.phpt
index ec4fda0298..5a391771e9 100644
--- a/Zend/tests/ns_020.phpt
+++ b/Zend/tests/ns_020.phpt
@@ -1,5 +1,5 @@
--TEST--
-020: Accesing internal namespace function
+020: Accessing internal namespace function
--FILE--
<?php
namespace X;
diff --git a/Zend/tests/ns_064.phpt b/Zend/tests/ns_064.phpt
index 0df9b6f85e..546d3f6375 100644
--- a/Zend/tests/ns_064.phpt
+++ b/Zend/tests/ns_064.phpt
@@ -1,5 +1,5 @@
--TEST--
-Magic methods in overrided stdClass inside namespace
+Magic methods in overridden stdClass inside namespace
--FILE--
<?php
diff --git a/Zend/tests/numeric_literal_separator_001.phpt b/Zend/tests/numeric_literal_separator_001.phpt
new file mode 100644
index 0000000000..866bd36fa9
--- /dev/null
+++ b/Zend/tests/numeric_literal_separator_001.phpt
@@ -0,0 +1,27 @@
+--TEST--
+Valid use of numeric literal separator
+--FILE--
+<?php
+var_dump(299_792_458 === 299792458);
+var_dump(135_00 === 13500);
+var_dump(96_485.332_12 === 96485.33212);
+var_dump(6.626_070_15e-34 === 6.62607015e-34);
+var_dump(6.674_083e-11 === 6.674083e-11);
+var_dump(0xCAFE_F00D === 0xCAFEF00D);
+var_dump(0x54_4A_42 === 0x544A42);
+var_dump(0b0101_1111 === 0b01011111);
+var_dump(0b01_0000_10 === 0b01000010);
+var_dump(0137_041 === 0137041);
+var_dump(0_124 === 0124);
+--EXPECT--
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
diff --git a/Zend/tests/numeric_literal_separator_002.phpt b/Zend/tests/numeric_literal_separator_002.phpt
new file mode 100644
index 0000000000..984438fc07
--- /dev/null
+++ b/Zend/tests/numeric_literal_separator_002.phpt
@@ -0,0 +1,7 @@
+--TEST--
+Invalid use: trailing underscore
+--FILE--
+<?php
+100_;
+--EXPECTF--
+Parse error: syntax error, unexpected '_' (T_STRING) in %s on line %d
diff --git a/Zend/tests/numeric_literal_separator_003.phpt b/Zend/tests/numeric_literal_separator_003.phpt
new file mode 100644
index 0000000000..e0cd716223
--- /dev/null
+++ b/Zend/tests/numeric_literal_separator_003.phpt
@@ -0,0 +1,7 @@
+--TEST--
+Invalid use: adjacent underscores
+--FILE--
+<?php
+10__0;
+--EXPECTF--
+Parse error: syntax error, unexpected '__0' (T_STRING) in %s on line %d
diff --git a/Zend/tests/numeric_literal_separator_004.phpt b/Zend/tests/numeric_literal_separator_004.phpt
new file mode 100644
index 0000000000..6db8f8eb86
--- /dev/null
+++ b/Zend/tests/numeric_literal_separator_004.phpt
@@ -0,0 +1,7 @@
+--TEST--
+Invalid use: underscore left of period
+--FILE--
+<?php
+100_.0;
+--EXPECTF--
+Parse error: syntax error, unexpected '_' (T_STRING) in %s on line %d
diff --git a/Zend/tests/numeric_literal_separator_005.phpt b/Zend/tests/numeric_literal_separator_005.phpt
new file mode 100644
index 0000000000..4b454e2d17
--- /dev/null
+++ b/Zend/tests/numeric_literal_separator_005.phpt
@@ -0,0 +1,7 @@
+--TEST--
+Invalid use: underscore right of period
+--FILE--
+<?php
+100._0;
+--EXPECTF--
+Parse error: syntax error, unexpected '_0' (T_STRING) in %s on line %d
diff --git a/Zend/tests/numeric_literal_separator_006.phpt b/Zend/tests/numeric_literal_separator_006.phpt
new file mode 100644
index 0000000000..14bd290992
--- /dev/null
+++ b/Zend/tests/numeric_literal_separator_006.phpt
@@ -0,0 +1,7 @@
+--TEST--
+Invalid use: underscore next to 0x
+--FILE--
+<?php
+0x_0123;
+--EXPECTF--
+Parse error: syntax error, unexpected 'x_0123' (T_STRING) in %s on line %d
diff --git a/Zend/tests/numeric_literal_separator_007.phpt b/Zend/tests/numeric_literal_separator_007.phpt
new file mode 100644
index 0000000000..e74c7ed033
--- /dev/null
+++ b/Zend/tests/numeric_literal_separator_007.phpt
@@ -0,0 +1,7 @@
+--TEST--
+Invalid use: underscore next to 0b
+--FILE--
+<?php
+0b_0101;
+--EXPECTF--
+Parse error: syntax error, unexpected 'b_0101' (T_STRING) in %s on line %d
diff --git a/Zend/tests/numeric_literal_separator_008.phpt b/Zend/tests/numeric_literal_separator_008.phpt
new file mode 100644
index 0000000000..66f1d0ff6a
--- /dev/null
+++ b/Zend/tests/numeric_literal_separator_008.phpt
@@ -0,0 +1,7 @@
+--TEST--
+Invalid use: underscore left of e
+--FILE--
+<?php
+1_e2;
+--EXPECTF--
+Parse error: syntax error, unexpected '_e2' (T_STRING) in %s on line %d
diff --git a/Zend/tests/numeric_literal_separator_009.phpt b/Zend/tests/numeric_literal_separator_009.phpt
new file mode 100644
index 0000000000..c690f66b10
--- /dev/null
+++ b/Zend/tests/numeric_literal_separator_009.phpt
@@ -0,0 +1,7 @@
+--TEST--
+Invalid use: underscore right of e
+--FILE--
+<?php
+1e_2;
+--EXPECTF--
+Parse error: syntax error, unexpected 'e_2' (T_STRING) in %s on line %d
diff --git a/Zend/tests/object_types/missing_return_type_inheritance_in_class.phpt b/Zend/tests/object_types/missing_return_type_inheritance_in_class.phpt
index 023ae58634..0938b24d0a 100644
--- a/Zend/tests/object_types/missing_return_type_inheritance_in_class.phpt
+++ b/Zend/tests/object_types/missing_return_type_inheritance_in_class.phpt
@@ -11,4 +11,4 @@ class Two extends One {
public function a() {}
}
--EXPECTF--
-Fatal error: Declaration of Two::a() must be compatible with One::a(): object in %s on line 9
+Fatal error: Declaration of Two::a() must be compatible with One::a(): object in %s on line 8
diff --git a/Zend/tests/object_types/return_type_reflection.phpt b/Zend/tests/object_types/return_type_reflection.phpt
index bcb918287d..ac01d90894 100644
--- a/Zend/tests/object_types/return_type_reflection.phpt
+++ b/Zend/tests/object_types/return_type_reflection.phpt
@@ -14,13 +14,13 @@ class Two implements One {
function a() : object {}
$returnTypeOne = (new ReflectionClass(One::class))->getMethod('a')->getReturnType();
-var_dump($returnTypeOne->isBuiltin(), (string)$returnTypeOne);
+var_dump($returnTypeOne->isBuiltin(), $returnTypeOne->getName());
$returnTypeTwo = (new ReflectionClass(Two::class))->getMethod('a')->getReturnType();
-var_dump($returnTypeTwo->isBuiltin(), (string)$returnTypeTwo);
+var_dump($returnTypeTwo->isBuiltin(), $returnTypeTwo->getName());
$returnTypea = (new ReflectionFunction('a'))->getReturnType();
-var_dump($returnTypea->isBuiltin(), (string)$returnTypea);
+var_dump($returnTypea->isBuiltin(), $returnTypea->getName());
--EXPECT--
bool(true)
string(6) "object"
diff --git a/Zend/tests/object_types/type_hint_reflection.phpt b/Zend/tests/object_types/type_hint_reflection.phpt
index 6a4f27d8c9..b530e6dc04 100644
--- a/Zend/tests/object_types/type_hint_reflection.phpt
+++ b/Zend/tests/object_types/type_hint_reflection.phpt
@@ -14,13 +14,13 @@ class Two implements One {
function a(object $obj) {}
$typeHintOne = (new ReflectionClass(One::class))->getMethod('a')->getParameters()[0]->getType();
-var_dump($typeHintOne->isBuiltin(), (string)$typeHintOne);
+var_dump($typeHintOne->isBuiltin(), $typeHintOne->getName());
$typeHintTwo = (new ReflectionClass(Two::class))->getMethod('a')->getParameters()[0]->getType();
-var_dump($typeHintTwo->isBuiltin(), (string)$typeHintTwo);
+var_dump($typeHintTwo->isBuiltin(), $typeHintTwo->getName());
$typeHinta = (new ReflectionFunction('a'))->getParameters()[0]->getType();
-var_dump($typeHinta->isBuiltin(), (string)$typeHinta);
+var_dump($typeHinta->isBuiltin(), $typeHinta->getName());
--EXPECT--
bool(true)
string(6) "object"
diff --git a/Zend/tests/objects_020.phpt b/Zend/tests/objects_020.phpt
index 14e34b9155..4b0e0d1ec7 100644
--- a/Zend/tests/objects_020.phpt
+++ b/Zend/tests/objects_020.phpt
@@ -14,6 +14,7 @@ var_dump($$test);
?>
--EXPECTF--
+Warning: Creating default object from empty value in %sobjects_020.php on line 7
object(stdClass)#%d (2) {
["a"]=>
*RECURSION*
diff --git a/Zend/tests/offset_bool.phpt b/Zend/tests/offset_bool.phpt
index a08dd5450c..8ed9f28e43 100644
--- a/Zend/tests/offset_bool.phpt
+++ b/Zend/tests/offset_bool.phpt
@@ -24,14 +24,31 @@ var_dump($bool[$arr]);
echo "Done\n";
?>
---EXPECT--
+--EXPECTF--
+Notice: Trying to access array offset on value of type bool in %s on line %d
NULL
+
+Notice: Trying to access array offset on value of type bool in %s on line %d
NULL
+
+Notice: Trying to access array offset on value of type bool in %s on line %d
NULL
+
+Notice: Trying to access array offset on value of type bool in %s on line %d
NULL
+
+Notice: Trying to access array offset on value of type bool in %s on line %d
NULL
+
+Notice: Trying to access array offset on value of type bool in %s on line %d
NULL
+
+Notice: Trying to access array offset on value of type bool in %s on line %d
NULL
+
+Notice: Trying to access array offset on value of type bool in %s on line %d
NULL
+
+Notice: Trying to access array offset on value of type bool in %s on line %d
NULL
Done
diff --git a/Zend/tests/offset_long.phpt b/Zend/tests/offset_long.phpt
index 98b9b0f08b..4c6b3972d2 100644
--- a/Zend/tests/offset_long.phpt
+++ b/Zend/tests/offset_long.phpt
@@ -24,14 +24,31 @@ var_dump($long[$arr]);
echo "Done\n";
?>
---EXPECT--
+--EXPECTF--
+Notice: Trying to access array offset on value of type int in %s on line %d
NULL
+
+Notice: Trying to access array offset on value of type int in %s on line %d
NULL
+
+Notice: Trying to access array offset on value of type int in %s on line %d
NULL
+
+Notice: Trying to access array offset on value of type int in %s on line %d
NULL
+
+Notice: Trying to access array offset on value of type int in %s on line %d
NULL
+
+Notice: Trying to access array offset on value of type int in %s on line %d
NULL
+
+Notice: Trying to access array offset on value of type int in %s on line %d
NULL
+
+Notice: Trying to access array offset on value of type int in %s on line %d
NULL
+
+Notice: Trying to access array offset on value of type int in %s on line %d
NULL
Done
diff --git a/Zend/tests/offset_null.phpt b/Zend/tests/offset_null.phpt
index c6ad6561db..ad0b1f3049 100644
--- a/Zend/tests/offset_null.phpt
+++ b/Zend/tests/offset_null.phpt
@@ -24,14 +24,31 @@ var_dump($null[$arr]);
echo "Done\n";
?>
---EXPECT--
+--EXPECTF--
+Notice: Trying to access array offset on value of type null in %s on line %d
NULL
+
+Notice: Trying to access array offset on value of type null in %s on line %d
NULL
+
+Notice: Trying to access array offset on value of type null in %s on line %d
NULL
+
+Notice: Trying to access array offset on value of type null in %s on line %d
NULL
+
+Notice: Trying to access array offset on value of type null in %s on line %d
NULL
+
+Notice: Trying to access array offset on value of type null in %s on line %d
NULL
+
+Notice: Trying to access array offset on value of type null in %s on line %d
NULL
+
+Notice: Trying to access array offset on value of type null in %s on line %d
NULL
+
+Notice: Trying to access array offset on value of type null in %s on line %d
NULL
Done
diff --git a/Zend/tests/overloaded_assign_prop_return_value.phpt b/Zend/tests/overloaded_assign_prop_return_value.phpt
new file mode 100644
index 0000000000..954505f1e9
--- /dev/null
+++ b/Zend/tests/overloaded_assign_prop_return_value.phpt
@@ -0,0 +1,14 @@
+--TEST--
+Make sure the return value of a property assignment is not freed to early
+--FILE--
+<?php
+class Overloaded {
+ function __set($r, $a) {}
+}
+$obj = new Overloaded;
+$x = $obj->prop = new stdClass;
+var_dump($x);
+?>
+--EXPECT--
+object(stdClass)#2 (0) {
+}
diff --git a/Zend/tests/php_tag_only.inc b/Zend/tests/php_tag_only.inc
new file mode 100644
index 0000000000..a81436628e
--- /dev/null
+++ b/Zend/tests/php_tag_only.inc
@@ -0,0 +1 @@
+<?php \ No newline at end of file
diff --git a/Zend/tests/php_tag_only.phpt b/Zend/tests/php_tag_only.phpt
new file mode 100644
index 0000000000..0d01180c8f
--- /dev/null
+++ b/Zend/tests/php_tag_only.phpt
@@ -0,0 +1,5 @@
+--TEST--
+File with just a <?php tag should be valid
+--FILE_EXTERNAL--
+php_tag_only.inc
+--EXPECT--
diff --git a/Zend/tests/property_access_errors_for_guarded_properties.phpt b/Zend/tests/property_access_errors_for_guarded_properties.phpt
new file mode 100644
index 0000000000..0a360a9447
--- /dev/null
+++ b/Zend/tests/property_access_errors_for_guarded_properties.phpt
@@ -0,0 +1,55 @@
+--TEST--
+Property access errors should be thrown for overloaded properties protected by recursion guards
+--FILE--
+<?php
+
+function setProp($obj) {
+ $obj->prop = 42;
+}
+
+function getProp($obj) {
+ var_dump($obj->prop);
+}
+
+function unsetProp($obj) {
+ unset($obj->prop);
+}
+
+class Test {
+ private $prop;
+
+ public function __get($k) {
+ getProp($this);
+ }
+
+ public function __set($k, $v) {
+ setProp($this);
+ }
+
+ public function __unset($k) {
+ unsetProp($this);
+ }
+}
+
+$test = new Test;
+try {
+ $test->prop = "bar";
+} catch (Error $e) {
+ echo $e->getMessage(), "\n";
+}
+try {
+ var_dump($test->prop);
+} catch (Error $e) {
+ echo $e->getMessage(), "\n";
+}
+try {
+ unset($test->prop);
+} catch (Error $e) {
+ echo $e->getMessage(), "\n";
+}
+
+?>
+--EXPECT--
+Cannot access private property Test::$prop
+Cannot access private property Test::$prop
+Cannot access private property Test::$prop
diff --git a/Zend/tests/real_cast_deprecation.phpt b/Zend/tests/real_cast_deprecation.phpt
new file mode 100644
index 0000000000..a73517c504
--- /dev/null
+++ b/Zend/tests/real_cast_deprecation.phpt
@@ -0,0 +1,11 @@
+--TEST--
+The (real) cast is deprecated
+--FILE--
+<?php
+
+var_dump((real) 42);
+
+?>
+--EXPECTF--
+Deprecated: The (real) cast is deprecated, use (float) instead in %s on line %d
+float(42)
diff --git a/Zend/tests/require_parse_exception.phpt b/Zend/tests/require_parse_exception.phpt
index db6844c2ea..859589231e 100644
--- a/Zend/tests/require_parse_exception.phpt
+++ b/Zend/tests/require_parse_exception.phpt
@@ -42,6 +42,7 @@ var_dump("\u{ffffff}");');
?>
--EXPECT--
+Deprecated: Directive 'allow_url_include' is deprecated in Unknown on line 0
syntax error, unexpected end of file on line 2
syntax error, unexpected end of file on line 3
syntax error, unexpected end of file, expecting '(' on line 2
diff --git a/Zend/tests/return_types/008.phpt b/Zend/tests/return_types/008.phpt
index f2e01299de..d5178ebd9d 100644
--- a/Zend/tests/return_types/008.phpt
+++ b/Zend/tests/return_types/008.phpt
@@ -14,6 +14,8 @@ class qux implements foo {
}
$qux = new qux();
-var_dump($qux->bar());
---EXPECTF--
-Fatal error: Declaration of qux::bar(): qux must be compatible with foo::bar(): foo in %s008.php on line 7
+echo get_class($qux->bar());
+
+?>
+--EXPECT--
+qux
diff --git a/Zend/tests/return_types/031.phpt b/Zend/tests/return_types/031.phpt
index 6d0b71b23b..c41490fd09 100644
--- a/Zend/tests/return_types/031.phpt
+++ b/Zend/tests/return_types/031.phpt
@@ -11,4 +11,4 @@ class B extends A {
?>
DONE
--EXPECTF--
-Fatal error: Declaration of B::foo(): ?int must be compatible with A::foo(): int in %s031.php on line 7
+Fatal error: Declaration of B::foo(): ?int must be compatible with A::foo(): int in %s031.php on line 6
diff --git a/Zend/tests/return_types/generators003.phpt b/Zend/tests/return_types/generators003.phpt
index 5502318e98..3b524eff2b 100644
--- a/Zend/tests/return_types/generators003.phpt
+++ b/Zend/tests/return_types/generators003.phpt
@@ -15,6 +15,8 @@ class SomeCollection implements Collection {
}
$some = new SomeCollection();
-var_dump($some->getIterator());
---EXPECTF--
-Fatal error: Declaration of SomeCollection::getIterator(): Generator must be compatible with Collection::getIterator(): Iterator in %sgenerators003.php on line 6
+echo get_class($some->getIterator());
+
+?>
+--EXPECT--
+Generator
diff --git a/Zend/tests/return_types/inheritance005.phpt b/Zend/tests/return_types/inheritance005.phpt
index 7415a72b9f..9793051da8 100644
--- a/Zend/tests/return_types/inheritance005.phpt
+++ b/Zend/tests/return_types/inheritance005.phpt
@@ -13,5 +13,9 @@ class Bar extends Foo {
return new Bar;
}
}
---EXPECTF--
-Fatal error: Declaration of Bar::test(): Bar must be compatible with Foo::test(): Foo in %sinheritance005.php on line 12
+
+echo get_class(Bar::test());
+
+?>
+--EXPECT--
+Bar
diff --git a/Zend/tests/return_types/inheritance006.phpt b/Zend/tests/return_types/inheritance006.phpt
index 7d4bcbe57b..8b7a37a1f4 100644
--- a/Zend/tests/return_types/inheritance006.phpt
+++ b/Zend/tests/return_types/inheritance006.phpt
@@ -17,5 +17,9 @@ class Bar extends Foo {
return new B;
}
}
---EXPECTF--
-Fatal error: Declaration of Bar::test(): B must be compatible with Foo::test(): A in %sinheritance006.php on line 14
+
+echo get_class(Bar::test());
+
+?>
+--EXPECT--
+B
diff --git a/Zend/tests/return_types/inheritance007.phpt b/Zend/tests/return_types/inheritance007.phpt
index af1738f807..b08aaf9e99 100644
--- a/Zend/tests/return_types/inheritance007.phpt
+++ b/Zend/tests/return_types/inheritance007.phpt
@@ -15,5 +15,9 @@ class Bar extends Foo {
return new ArrayObject([1, 2]);
}
}
---EXPECTF--
-Fatal error: Declaration of Bar::test(): ArrayObject must be compatible with Foo::test(): Traversable in %sinheritance007.php on line 12
+
+echo get_class(Bar::test());
+
+?>
+--EXPECT--
+ArrayObject
diff --git a/Zend/tests/return_types/reflection001.phpt b/Zend/tests/return_types/reflection001.phpt
index c2ff253cdb..dabadf6f06 100644
--- a/Zend/tests/return_types/reflection001.phpt
+++ b/Zend/tests/return_types/reflection001.phpt
@@ -9,7 +9,7 @@ class A {
}
}
-ReflectionClass::export("A");
+echo new ReflectionClass("A");
?>
--EXPECTF--
Class [ <user> class A ] {
diff --git a/Zend/tests/return_types/rfc004.phpt b/Zend/tests/return_types/rfc004.phpt
index ed40e41b09..189d0553c6 100644
--- a/Zend/tests/return_types/rfc004.phpt
+++ b/Zend/tests/return_types/rfc004.phpt
@@ -16,4 +16,4 @@ class UserGateway_MySql implements UserGateway {
}
}
--EXPECTF--
-Fatal error: Declaration of UserGateway_MySql::find($id) must be compatible with UserGateway::find($id): User in %s on line 9
+Fatal error: Declaration of UserGateway_MySql::find($id) must be compatible with UserGateway::find($id): User in %s on line 11
diff --git a/Zend/tests/runtime_compile_time_binary_operands.phpt b/Zend/tests/runtime_compile_time_binary_operands.phpt
new file mode 100644
index 0000000000..afced7af0c
--- /dev/null
+++ b/Zend/tests/runtime_compile_time_binary_operands.phpt
@@ -0,0 +1,159 @@
+--TEST--
+Test binary operands exposing the same behavior at compile as at run time
+--INI--
+memory_limit=256M
+--FILE--
+<?php
+
+$operands = [
+ "==",
+ "!=",
+ "===",
+ "!==",
+ "<",
+ "<=",
+ ">",
+ ">=",
+ "<=>",
+ "+",
+ "-",
+ "*",
+ "/",
+ "%",
+ "**",
+ ".",
+ "|",
+ "&",
+ "^",
+ "or",
+ "and",
+ "xor",
+ "||",
+ "&&",
+];
+
+$input = [
+ 0,
+ 1,
+ 2,
+ -1,
+ 2.0,
+ 2.1,
+ -2.0,
+ -2.1,
+ PHP_INT_MAX,
+ PHP_INT_MIN,
+ PHP_INT_MAX * 2,
+ PHP_INT_MIN * 2,
+ INF,
+ NAN,
+ [],
+ [1, 2],
+ [1, 2, 3],
+ [1 => 2, 0 => 1],
+ [1, 'a' => 2],
+ [1, 4],
+ [1, 'a'],
+ [1, 2 => 2],
+ [1, [ 2 ]],
+ null,
+ false,
+ true,
+ "",
+ " ",
+ "banana",
+ "Banana",
+ "banan",
+ "0",
+ "200",
+ "20",
+ "20a",
+ " \t\n\r\v\f20",
+ "20 ",
+ "2e1",
+ "2e150",
+ "9179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368",
+ "-9179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368",
+ "0.1",
+ "-0.1",
+ "1e-1",
+ "-20",
+ "-20.0",
+ "0x14",
+ (string) PHP_INT_MAX * 2,
+ (string) PHP_INT_MIN * 2,
+];
+
+function makeParam($param) {
+ if ($param === PHP_INT_MIN) {
+ return "PHP_INT_MIN";
+ }
+ if ($param === PHP_INT_MAX) {
+ return "PHP_INT_MAX";
+ }
+ if (is_string($param)) {
+ return '"' . strtr($param, ["\t" => '\t', "\n" => '\n', "\r" => '\r', "\v" => '\v', "\f" => '\f', '$' => '\$', '"' => '\"']) . '"';
+ }
+ return "(" . str_replace("\n", "", var_export($param, true)) . ")";
+}
+
+$c = 0;
+$f = 0;
+
+function prepareLine($op1, $op2, $cmp, $operator) {
+
+ $op1_p = makeParam($op1);
+ $op2_p = makeParam($op2);
+
+ $error = "echo '" . addcslashes("$op1_p $operator $op2_p", "\\'") . '\', "\n"; $f++;';
+
+ $compare = "@($op1_p $operator $op2_p)";
+ $line = "\$c++; ";
+ try {
+ $result = makeParam($cmp());
+ $line .= "if (" . ($result === "(NAN)" ? "!is_nan($compare)" : "$compare !== $result") . ") { $error }";
+ } catch (Error $e) {
+ if (get_class($e) == "Error") {
+ return "// exempt $op1_p $operator $op2_p from checking, it generates a compile time error";
+ }
+ $msg = makeParam($e->getMessage());
+ $line .= "try { $compare; $error } catch (Error \$e) { if (\$e->getMessage() !== $msg) { $error } }";
+ }
+ return $line;
+}
+
+$filename = __DIR__ . DIRECTORY_SEPARATOR . 'compare_binary_operands_temp.php';
+$file = fopen($filename, "w");
+
+fwrite($file, "<?php\n");
+
+foreach ($input as $left) {
+ foreach ($input as $right) {
+ foreach ($operands as $operand) {
+ $line = prepareLine($left, $right, function() use ($left, $right, $operand) {
+ return eval("return @(\$left $operand \$right);");
+ }, $operand);
+ fwrite($file, $line . "\n");
+ }
+ }
+}
+
+fclose($file);
+
+include $filename;
+
+if($c === 0) {
+ echo "Completely failed\n";
+} else {
+ echo "Failed: $f\n";
+}
+?>
+===DONE===
+--CLEAN--
+<?php
+$fl = __DIR__ . DIRECTORY_SEPARATOR . 'compare_binary_operands_temp.php';
+@unlink($fl);
+?>
+--EXPECT--
+Failed: 0
+===DONE===
diff --git a/Zend/tests/self_class_const_in_unknown_scope.phpt b/Zend/tests/self_class_const_in_unknown_scope.phpt
index 240644dea8..2eb3a89d71 100644
--- a/Zend/tests/self_class_const_in_unknown_scope.phpt
+++ b/Zend/tests/self_class_const_in_unknown_scope.phpt
@@ -13,11 +13,14 @@ class Test {
}
(new Test)->foobar();
-// This should error, but doesn't
const BAR = self::class;
var_dump(BAR);
?>
---EXPECT--
+--EXPECTF--
string(4) "Test"
-string(0) ""
+
+Fatal error: Uncaught Error: Cannot use "self" when no class scope is active in %s:%d
+Stack trace:
+#0 {main}
+ thrown in %s on line %d
diff --git a/Zend/tests/static_variable_in_private_method.phpt b/Zend/tests/static_variable_in_private_method.phpt
new file mode 100644
index 0000000000..0aa04a0918
--- /dev/null
+++ b/Zend/tests/static_variable_in_private_method.phpt
@@ -0,0 +1,16 @@
+--TEST--
+Inheritance of private method with static variable
+--FILE--
+<?php
+
+class A {
+ private function m() {
+ static $x;
+ }
+}
+class B extends A {}
+
+?>
+===DONE===
+--EXPECT--
+===DONE===
diff --git a/Zend/tests/static_variable_in_private_trait_method.phpt b/Zend/tests/static_variable_in_private_trait_method.phpt
new file mode 100644
index 0000000000..0d842c857c
--- /dev/null
+++ b/Zend/tests/static_variable_in_private_trait_method.phpt
@@ -0,0 +1,35 @@
+--TEST--
+Behavior of static variable in private trait method
+--FILE--
+<?php
+
+trait T {
+ private static function method() {
+ static $x;
+ if ($x === null) $x = new stdClass;
+ return $x;
+ }
+
+ public static function method2() {
+ return self::method();
+ }
+}
+
+class C {
+ use T;
+}
+
+var_dump(C::method2());
+
+class D extends C {
+ use T;
+}
+
+var_dump(D::method2());
+
+?>
+--EXPECT--
+object(stdClass)#1 (0) {
+}
+object(stdClass)#2 (0) {
+}
diff --git a/Zend/tests/str_offset_004.phpt b/Zend/tests/str_offset_004.phpt
index c8ce607535..435ab235fa 100644
--- a/Zend/tests/str_offset_004.phpt
+++ b/Zend/tests/str_offset_004.phpt
@@ -8,31 +8,31 @@ $str = "abcdefghijklmno";
$i = 3;
$j = -4;
-$str{2} = 'C';
+$str[2] = 'C';
var_dump($str);
-$str{$i} = 'Z';
+$str[$i] = 'Z';
var_dump($str);
-$str{-5} = 'P';
+$str[-5] = 'P';
var_dump($str);
-$str{$j} = 'Q';
+$str[$j] = 'Q';
var_dump($str);
-$str{-20} = 'Y';
+$str[-20] = 'Y';
var_dump($str);
-$str{-strlen($str)} = strtoupper($str{0}); /* An exotic ucfirst() ;) */
+$str[-strlen($str)] = strtoupper($str[0]); /* An exotic ucfirst() ;) */
var_dump($str);
-$str{20} = 'N';
+$str[20] = 'N';
var_dump($str);
-$str{-2} = 'UFO';
+$str[-2] = 'UFO';
var_dump($str);
-$str{-$i} = $str{$j*2};
+$str[-$i] = $str[$j*2];
var_dump($str);
?>
--EXPECTF--
diff --git a/Zend/tests/string_offset_int_min_max.phpt b/Zend/tests/string_offset_int_min_max.phpt
new file mode 100644
index 0000000000..b8bd4bcd6b
--- /dev/null
+++ b/Zend/tests/string_offset_int_min_max.phpt
@@ -0,0 +1,16 @@
+--TEST--
+Accessing PHP_INT_MAX and PHP_INT_MIN as string offsets
+--FILE--
+<?php
+
+$str = "";
+var_dump($str[PHP_INT_MAX]);
+var_dump($str[PHP_INT_MIN]);
+
+?>
+--EXPECTF--
+Notice: Uninitialized string offset: %d in %s on line %d
+string(0) ""
+
+Notice: Uninitialized string offset: -%d in %s on line %d
+string(0) ""
diff --git a/Zend/tests/ternary_associativity.phpt b/Zend/tests/ternary_associativity.phpt
new file mode 100644
index 0000000000..32326513ca
--- /dev/null
+++ b/Zend/tests/ternary_associativity.phpt
@@ -0,0 +1,30 @@
+--TEST--
+Using ternary associativity is deprecated
+--FILE--
+<?php
+
+1 ? 2 : 3 ? 4 : 5; // deprecated
+(1 ? 2 : 3) ? 4 : 5; // ok
+1 ? 2 : (3 ? 4 : 5); // ok
+
+// While the associativity of ?: is also incorrect, it will not cause a
+// functional difference, only some unnecessary checks.
+1 ?: 2 ?: 3; // ok
+(1 ?: 2) ?: 3; // ok
+1 ?: (2 ?: 3); // ok
+
+1 ?: 2 ? 3 : 4; // deprecated
+(1 ?: 2) ? 3 : 4; // ok
+1 ?: (2 ? 3 : 4); // ok
+
+1 ? 2 : 3 ?: 4; // deprecated
+(1 ? 2 : 3) ?: 4; // ok
+1 ? 2 : (3 ?: 4); // ok
+
+?>
+--EXPECTF--
+Deprecated: Unparenthesized `a ? b : c ? d : e` is deprecated. Use either `(a ? b : c) ? d : e` or `a ? b : (c ? d : e)` in %s on line 3
+
+Deprecated: Unparenthesized `a ?: b ? c : d` is deprecated. Use either `(a ?: b) ? c : d` or `a ?: (b ? c : d)` in %s on line 13
+
+Deprecated: Unparenthesized `a ? b : c ?: d` is deprecated. Use either `(a ? b : c) ?: d` or `a ? b : (c ?: d)` in %s on line 17
diff --git a/Zend/tests/this_as_lexical_var_error.phpt b/Zend/tests/this_as_lexical_var_error.phpt
index d0e0106dae..6b75933937 100644
--- a/Zend/tests/this_as_lexical_var_error.phpt
+++ b/Zend/tests/this_as_lexical_var_error.phpt
@@ -4,7 +4,7 @@ Cannot use $this as lexical variable
<?php
class Foo {
- public function fn() {
+ public function f() {
return function() use ($this) {};
}
}
diff --git a/Zend/tests/throwing_overloaded_compound_assign_op.phpt b/Zend/tests/throwing_overloaded_compound_assign_op.phpt
new file mode 100644
index 0000000000..e6e79baf5d
--- /dev/null
+++ b/Zend/tests/throwing_overloaded_compound_assign_op.phpt
@@ -0,0 +1,44 @@
+--TEST--
+Exception in compound assign op should prevent call to overloaded object handlers
+--FILE--
+<?php
+
+class Test {
+ public function __get($k) {
+ $this->$k = 42;
+ return 0;
+ }
+}
+
+$test = new ArrayObject;
+$test[0] = 42;
+try {
+ $test[0] %= 0;
+} catch (Error $e) {
+ echo $e->getMessage(), "\n";
+}
+var_dump($test);
+
+$test2 = new Test;
+try {
+ $test2->prop %= 0;
+} catch (Error $e) {
+ echo $e->getMessage(), "\n";
+}
+var_dump($test2);
+
+?>
+--EXPECT--
+Modulo by zero
+object(ArrayObject)#1 (1) {
+ ["storage":"ArrayObject":private]=>
+ array(1) {
+ [0]=>
+ int(42)
+ }
+}
+Modulo by zero
+object(Test)#3 (1) {
+ ["prop"]=>
+ int(42)
+}
diff --git a/Zend/tests/type_declarations/scalar_none.phpt b/Zend/tests/type_declarations/scalar_none.phpt
index 025276adef..a1029b830f 100644
--- a/Zend/tests/type_declarations/scalar_none.phpt
+++ b/Zend/tests/type_declarations/scalar_none.phpt
@@ -3,16 +3,6 @@ Scalar type missing parameters
--FILE--
<?php
-$errnames = [
- E_NOTICE => 'E_NOTICE',
- E_WARNING => 'E_WARNING',
- E_RECOVERABLE_ERROR => 'E_RECOVERABLE_ERROR'
-];
-set_error_handler(function (int $errno, string $errmsg, string $file, int $line) use ($errnames) {
- echo "$errnames[$errno]: $errmsg on line $line\n";
- return true;
-});
-
$functions = [
'int' => function (int $i) { return $i; },
'float' => function (float $f) { return $f; },
diff --git a/Zend/tests/type_declarations/scalar_null.phpt b/Zend/tests/type_declarations/scalar_null.phpt
index 767e36e914..d149053fd2 100644
--- a/Zend/tests/type_declarations/scalar_null.phpt
+++ b/Zend/tests/type_declarations/scalar_null.phpt
@@ -3,16 +3,6 @@ Scalar type nullability
--FILE--
<?php
-$errnames = [
- E_NOTICE => 'E_NOTICE',
- E_WARNING => 'E_WARNING',
- E_RECOVERABLE_ERROR => 'E_RECOVERABLE_ERROR'
-];
-set_error_handler(function (int $errno, string $errmsg, string $file, int $line) use ($errnames) {
- echo "$errnames[$errno]: $errmsg on line $line\n";
- return true;
-});
-
$functions = [
'int' => function (int $i) { return $i; },
'float' => function (float $f) { return $f; },
diff --git a/Zend/tests/type_declarations/scalar_return_basic.phpt b/Zend/tests/type_declarations/scalar_return_basic.phpt
index dd7a3daf85..c69196269f 100644
--- a/Zend/tests/type_declarations/scalar_return_basic.phpt
+++ b/Zend/tests/type_declarations/scalar_return_basic.phpt
@@ -8,7 +8,6 @@ Return scalar type basics
$errnames = [
E_NOTICE => 'E_NOTICE',
E_WARNING => 'E_WARNING',
- E_RECOVERABLE_ERROR => 'E_RECOVERABLE_ERROR'
];
set_error_handler(function (int $errno, string $errmsg, string $file, int $line) use ($errnames) {
echo "$errnames[$errno]: $errmsg on line $line\n";
diff --git a/Zend/tests/type_declarations/scalar_return_basic_64bit.phpt b/Zend/tests/type_declarations/scalar_return_basic_64bit.phpt
index bec8925676..6f2ff11eb2 100644
--- a/Zend/tests/type_declarations/scalar_return_basic_64bit.phpt
+++ b/Zend/tests/type_declarations/scalar_return_basic_64bit.phpt
@@ -8,7 +8,6 @@ Return scalar type basics
$errnames = [
E_NOTICE => 'E_NOTICE',
E_WARNING => 'E_WARNING',
- E_RECOVERABLE_ERROR => 'E_RECOVERABLE_ERROR'
];
set_error_handler(function (int $errno, string $errmsg, string $file, int $line) use ($errnames) {
echo "$errnames[$errno]: $errmsg on line $line\n";
diff --git a/Zend/tests/type_declarations/scalar_strict.phpt b/Zend/tests/type_declarations/scalar_strict.phpt
index 4230558b01..78b404f9f1 100644
--- a/Zend/tests/type_declarations/scalar_strict.phpt
+++ b/Zend/tests/type_declarations/scalar_strict.phpt
@@ -6,16 +6,6 @@ Scalar type strict mode
<?php
declare(strict_types=1);
-$errnames = [
- E_NOTICE => 'E_NOTICE',
- E_WARNING => 'E_WARNING',
- E_RECOVERABLE_ERROR => 'E_RECOVERABLE_ERROR'
-];
-set_error_handler(function (int $errno, string $errmsg, string $file, int $line) use ($errnames) {
- echo "$errnames[$errno]: $errmsg on line $line\n";
- return true;
-});
-
$functions = [
'int' => function (int $i) { return $i; },
'float' => function (float $f) { return $f; },
@@ -106,11 +96,11 @@ int(2147483647)
}
*** 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) {
+*** Trying object(stdClass)#5 (0) {
}
*** 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) {
+*** Trying object(Stringable)#6 (0) {
}
*** Caught Argument 1 passed to {closure}() must be of the type int, object given, called in %s on line %d
@@ -159,11 +149,11 @@ float(NAN)
}
*** Caught Argument 1 passed to {closure}() must be of the type float, array given, called in %s on line %d
-*** Trying object(stdClass)#6 (0) {
+*** Trying object(stdClass)#5 (0) {
}
*** Caught Argument 1 passed to {closure}() must be of the type float, object given, called in %s on line %d
-*** Trying object(Stringable)#7 (0) {
+*** Trying object(Stringable)#6 (0) {
}
*** Caught Argument 1 passed to {closure}() must be of the type float, object given, called in %s on line %d
@@ -212,11 +202,11 @@ string(0) ""
}
*** Caught Argument 1 passed to {closure}() must be of the type string, array given, called in %s on line %d
-*** Trying object(stdClass)#6 (0) {
+*** Trying object(stdClass)#5 (0) {
}
*** Caught Argument 1 passed to {closure}() must be of the type string, object given, called in %s on line %d
-*** Trying object(Stringable)#7 (0) {
+*** Trying object(Stringable)#6 (0) {
}
*** Caught Argument 1 passed to {closure}() must be of the type string, object given, called in %s on line %d
@@ -265,11 +255,11 @@ bool(false)
}
*** 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) {
+*** Trying object(stdClass)#5 (0) {
}
*** 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) {
+*** Trying object(Stringable)#6 (0) {
}
*** Caught Argument 1 passed to {closure}() must be of the type bool, object given, called in %s on line %d
diff --git a/Zend/tests/type_declarations/scalar_strict_64bit.phpt b/Zend/tests/type_declarations/scalar_strict_64bit.phpt
index b2559afae9..d6d38213a4 100644
--- a/Zend/tests/type_declarations/scalar_strict_64bit.phpt
+++ b/Zend/tests/type_declarations/scalar_strict_64bit.phpt
@@ -6,16 +6,6 @@ Scalar type strict mode
<?php
declare(strict_types=1);
-$errnames = [
- E_NOTICE => 'E_NOTICE',
- E_WARNING => 'E_WARNING',
- E_RECOVERABLE_ERROR => 'E_RECOVERABLE_ERROR'
-];
-set_error_handler(function (int $errno, string $errmsg, string $file, int $line) use ($errnames) {
- echo "$errnames[$errno]: $errmsg on line $line\n";
- return true;
-});
-
$functions = [
'int' => function (int $i) { return $i; },
'float' => function (float $f) { return $f; },
@@ -106,11 +96,11 @@ int(9223372036854775807)
}
*** 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) {
+*** Trying object(stdClass)#5 (0) {
}
*** 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) {
+*** Trying object(Stringable)#6 (0) {
}
*** Caught Argument 1 passed to {closure}() must be of the type int, object given, called in %s on line %d
@@ -159,11 +149,11 @@ float(NAN)
}
*** Caught Argument 1 passed to {closure}() must be of the type float, array given, called in %s on line %d
-*** Trying object(stdClass)#6 (0) {
+*** Trying object(stdClass)#5 (0) {
}
*** Caught Argument 1 passed to {closure}() must be of the type float, object given, called in %s on line %d
-*** Trying object(Stringable)#7 (0) {
+*** Trying object(Stringable)#6 (0) {
}
*** Caught Argument 1 passed to {closure}() must be of the type float, object given, called in %s on line %d
@@ -212,11 +202,11 @@ string(0) ""
}
*** Caught Argument 1 passed to {closure}() must be of the type string, array given, called in %s on line %d
-*** Trying object(stdClass)#6 (0) {
+*** Trying object(stdClass)#5 (0) {
}
*** Caught Argument 1 passed to {closure}() must be of the type string, object given, called in %s on line %d
-*** Trying object(Stringable)#7 (0) {
+*** Trying object(Stringable)#6 (0) {
}
*** Caught Argument 1 passed to {closure}() must be of the type string, object given, called in %s on line %d
@@ -265,11 +255,11 @@ bool(false)
}
*** 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) {
+*** Trying object(stdClass)#5 (0) {
}
*** 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) {
+*** Trying object(Stringable)#6 (0) {
}
*** Caught Argument 1 passed to {closure}() must be of the type bool, object given, called in %s on line %d
diff --git a/Zend/tests/type_declarations/scalar_strict_basic.phpt b/Zend/tests/type_declarations/scalar_strict_basic.phpt
index 87da5f9328..016757e671 100644
--- a/Zend/tests/type_declarations/scalar_strict_basic.phpt
+++ b/Zend/tests/type_declarations/scalar_strict_basic.phpt
@@ -5,17 +5,6 @@ Strict scalar type basics
declare(strict_types=1);
-$errnames = [
- E_NOTICE => 'E_NOTICE',
- E_WARNING => 'E_WARNING',
- E_RECOVERABLE_ERROR => 'E_RECOVERABLE_ERROR'
-];
-
-set_error_handler(function (int $errno, string $errmsg, string $file, int $line) use ($errnames) {
- echo "$errnames[$errno]: $errmsg on line $line\n";
- return true;
-});
-
$functions = [
'int' => function (int $i) { return $i; },
'float' => function (float $f) { return $f; },
diff --git a/Zend/tests/type_declarations/typed_properties_001.phpt b/Zend/tests/type_declarations/typed_properties_001.phpt
new file mode 100644
index 0000000000..6e34cb478f
--- /dev/null
+++ b/Zend/tests/type_declarations/typed_properties_001.phpt
@@ -0,0 +1,44 @@
+--TEST--
+Test typed properties basic operation
+--FILE--
+<?php
+var_dump(new class(1, 2.2, true, ["four"], new stdClass) {
+ public int $int;
+ public float $float;
+ public bool $bool;
+ public array $array;
+ public stdClass $std;
+ public iterable $it;
+
+ public function __construct(int $int, float $float, bool $bool, array $array, stdClass $std) {
+ $this->int = $int;
+ $this->float = $float;
+ $this->bool = $bool;
+ $this->array = $array;
+ $this->std = $std;
+ $this->it = $array;
+ }
+});
+?>
+--EXPECTF--
+object(class@anonymous)#%d (6) {
+ ["int"]=>
+ int(1)
+ ["float"]=>
+ float(2.2)
+ ["bool"]=>
+ bool(true)
+ ["array"]=>
+ array(1) {
+ [0]=>
+ string(4) "four"
+ }
+ ["std"]=>
+ object(stdClass)#%d (0) {
+ }
+ ["it"]=>
+ array(1) {
+ [0]=>
+ string(4) "four"
+ }
+}
diff --git a/Zend/tests/type_declarations/typed_properties_002.phpt b/Zend/tests/type_declarations/typed_properties_002.phpt
new file mode 100644
index 0000000000..3aec7a34ba
--- /dev/null
+++ b/Zend/tests/type_declarations/typed_properties_002.phpt
@@ -0,0 +1,15 @@
+--TEST--
+Test typed properties error condition (read uninitialized)
+--FILE--
+<?php
+$thing = new class() {
+ public int $int;
+};
+
+var_dump($thing->int);
+?>
+--EXPECTF--
+Fatal error: Uncaught Error: Typed property class@anonymous::$int must not be accessed before initialization in %s:6
+Stack trace:
+#0 {main}
+ thrown in %s on line 6
diff --git a/Zend/tests/type_declarations/typed_properties_003.phpt b/Zend/tests/type_declarations/typed_properties_003.phpt
new file mode 100644
index 0000000000..59c289a566
--- /dev/null
+++ b/Zend/tests/type_declarations/typed_properties_003.phpt
@@ -0,0 +1,15 @@
+--TEST--
+Test typed properties error condition (fetch uninitialized by reference)
+--FILE--
+<?php
+$thing = new class() {
+ public int $int;
+};
+
+$var = &$thing->int;
+?>
+--EXPECTF--
+Fatal error: Uncaught Error: Cannot access uninitialized non-nullable property class@anonymous::$int by reference in %s:%d
+Stack trace:
+#0 {main}
+ thrown in %s on line %d
diff --git a/Zend/tests/type_declarations/typed_properties_004.phpt b/Zend/tests/type_declarations/typed_properties_004.phpt
new file mode 100644
index 0000000000..03d9e41aac
--- /dev/null
+++ b/Zend/tests/type_declarations/typed_properties_004.phpt
@@ -0,0 +1,18 @@
+--TEST--
+Test typed properties error condition (type mismatch)
+--FILE--
+<?php
+new class("PHP 7 is better than you, and it knows it ...") {
+ public int $int;
+
+ public function __construct(string $string) {
+ $this->int = $string;
+ }
+};
+?>
+--EXPECTF--
+Fatal error: Uncaught TypeError: Typed property class@anonymous::$int must be int, string used in %s:6
+Stack trace:
+#0 %s(2): class@anonymous->__construct('PHP 7 is better...')
+#1 {main}
+ thrown in %s on line 6
diff --git a/Zend/tests/type_declarations/typed_properties_005.phpt b/Zend/tests/type_declarations/typed_properties_005.phpt
new file mode 100644
index 0000000000..b521963000
--- /dev/null
+++ b/Zend/tests/type_declarations/typed_properties_005.phpt
@@ -0,0 +1,20 @@
+--TEST--
+Test typed properties error condition (type mismatch object)
+--FILE--
+<?php
+class Dummy {}
+
+new class(new Dummy) {
+ public stdClass $std;
+
+ public function __construct(Dummy $dummy) {
+ $this->std = $dummy;
+ }
+};
+?>
+--EXPECTF--
+Fatal error: Uncaught TypeError: Typed property class@anonymous::$std must be an instance of stdClass, Dummy used in %s:8
+Stack trace:
+#0 %s(4): class@anonymous->__construct(Object(Dummy))
+#1 {main}
+ thrown in %s on line 8
diff --git a/Zend/tests/type_declarations/typed_properties_006.phpt b/Zend/tests/type_declarations/typed_properties_006.phpt
new file mode 100644
index 0000000000..c3a8faefd4
--- /dev/null
+++ b/Zend/tests/type_declarations/typed_properties_006.phpt
@@ -0,0 +1,14 @@
+--TEST--
+Test typed properties inheritance (scalar)
+--FILE--
+<?php
+class Foo {
+ public int $qux;
+}
+
+class Bar extends Foo {
+ public string $qux;
+}
+?>
+--EXPECTF--
+Fatal error: Type of Bar::$qux must be int (as in class Foo) in %s on line 8
diff --git a/Zend/tests/type_declarations/typed_properties_007.phpt b/Zend/tests/type_declarations/typed_properties_007.phpt
new file mode 100644
index 0000000000..19e8022a24
--- /dev/null
+++ b/Zend/tests/type_declarations/typed_properties_007.phpt
@@ -0,0 +1,17 @@
+--TEST--
+Test typed properties inheritance
+--FILE--
+<?php
+class Whatever {}
+class Thing extends Whatever {}
+
+class Foo {
+ public Whatever $qux;
+}
+
+class Bar extends Foo {
+ public Thing $qux;
+}
+?>
+--EXPECTF--
+Fatal error: Type of Bar::$qux must be Whatever (as in class Foo) in %s on line 11
diff --git a/Zend/tests/type_declarations/typed_properties_008.phpt b/Zend/tests/type_declarations/typed_properties_008.phpt
new file mode 100644
index 0000000000..70b4282626
--- /dev/null
+++ b/Zend/tests/type_declarations/typed_properties_008.phpt
@@ -0,0 +1,14 @@
+--TEST--
+Test typed properties inheritance (missing info)
+--FILE--
+<?php
+class Foo {
+ public int $qux;
+}
+
+class Bar extends Foo {
+ public $qux;
+}
+?>
+--EXPECTF--
+Fatal error: Type of Bar::$qux must be int (as in class Foo) in %s on line 8
diff --git a/Zend/tests/type_declarations/typed_properties_009.phpt b/Zend/tests/type_declarations/typed_properties_009.phpt
new file mode 100644
index 0000000000..24013b4118
--- /dev/null
+++ b/Zend/tests/type_declarations/typed_properties_009.phpt
@@ -0,0 +1,23 @@
+--TEST--
+Test typed properties unset leaves properties in an uninitialized state
+--FILE--
+<?php
+class Foo {
+ public int $bar;
+
+ public function __get($name) {
+ var_dump($name);
+ /* return value has to be compatible with int */
+ return 0;
+ }
+}
+
+$foo = new Foo();
+
+unset($foo->bar);
+
+var_dump($foo->bar);
+?>
+--EXPECT--
+string(3) "bar"
+int(0)
diff --git a/Zend/tests/type_declarations/typed_properties_010.phpt b/Zend/tests/type_declarations/typed_properties_010.phpt
new file mode 100644
index 0000000000..fd7d367fea
--- /dev/null
+++ b/Zend/tests/type_declarations/typed_properties_010.phpt
@@ -0,0 +1,17 @@
+--TEST--
+Test typed properties allow fetch reference
+--FILE--
+<?php
+class Foo {
+ public int $bar = 1;
+}
+
+$cb = function(int &$bar) {
+ var_dump($bar);
+};
+
+$foo = new Foo();
+$cb($foo->bar);
+?>
+--EXPECT--
+int(1)
diff --git a/Zend/tests/type_declarations/typed_properties_011.phpt b/Zend/tests/type_declarations/typed_properties_011.phpt
new file mode 100644
index 0000000000..706a332750
--- /dev/null
+++ b/Zend/tests/type_declarations/typed_properties_011.phpt
@@ -0,0 +1,18 @@
+--TEST--
+Test typed properties allow fetch reference for init array
+--FILE--
+<?php
+class Foo {
+ public int $bar = 1;
+}
+
+$foo = new Foo();
+
+$array = [&$foo->bar];
+var_dump($array);
+?>
+--EXPECT--
+array(1) {
+ [0]=>
+ &int(1)
+}
diff --git a/Zend/tests/type_declarations/typed_properties_012.phpt b/Zend/tests/type_declarations/typed_properties_012.phpt
new file mode 100644
index 0000000000..79a77cfa40
--- /dev/null
+++ b/Zend/tests/type_declarations/typed_properties_012.phpt
@@ -0,0 +1,19 @@
+--TEST--
+Test typed properties allow fetch reference for foreach
+--FILE--
+<?php
+class Foo {
+ public int $bar = 1;
+}
+
+$foo = new Foo();
+foreach ($foo as &$prop) {
+ $prop++;
+}
+var_dump($foo);
+?>
+--EXPECT--
+object(Foo)#1 (1) {
+ ["bar"]=>
+ &int(2)
+}
diff --git a/Zend/tests/type_declarations/typed_properties_013.phpt b/Zend/tests/type_declarations/typed_properties_013.phpt
new file mode 100644
index 0000000000..01c2f4b6a0
--- /dev/null
+++ b/Zend/tests/type_declarations/typed_properties_013.phpt
@@ -0,0 +1,10 @@
+--TEST--
+Test typed properties disallow incorrect type initial value (scalar)
+--FILE--
+<?php
+class Foo {
+ public int $bar = "string";
+}
+?>
+--EXPECTF--
+Fatal error: Default value for property of type int can only be int in %s on line 3
diff --git a/Zend/tests/type_declarations/typed_properties_014.phpt b/Zend/tests/type_declarations/typed_properties_014.phpt
new file mode 100644
index 0000000000..2a02f0381e
--- /dev/null
+++ b/Zend/tests/type_declarations/typed_properties_014.phpt
@@ -0,0 +1,10 @@
+--TEST--
+Test typed properties disallow incorrect type initial value (array)
+--FILE--
+<?php
+class Foo {
+ public array $bar = 32;
+}
+?>
+--EXPECTF--
+Fatal error: Default value for property of type array can only be an array in %s on line 3
diff --git a/Zend/tests/type_declarations/typed_properties_015.phpt b/Zend/tests/type_declarations/typed_properties_015.phpt
new file mode 100644
index 0000000000..ac11c0fe3e
--- /dev/null
+++ b/Zend/tests/type_declarations/typed_properties_015.phpt
@@ -0,0 +1,10 @@
+--TEST--
+Test typed properties disallow incorrect type initial value (object)
+--FILE--
+<?php
+class Foo {
+ public stdClass $bar = null;
+}
+?>
+--EXPECTF--
+Fatal error: Default value for property of type stdClass may not be null. Use the nullable type ?stdClass to allow null default value in %s on line %d
diff --git a/Zend/tests/type_declarations/typed_properties_016.phpt b/Zend/tests/type_declarations/typed_properties_016.phpt
new file mode 100644
index 0000000000..3be4d02b7f
--- /dev/null
+++ b/Zend/tests/type_declarations/typed_properties_016.phpt
@@ -0,0 +1,31 @@
+--TEST--
+Test typed properties initial values
+--FILE--
+<?php
+class Foo {
+ public int $int = 1;
+ public float $flt = 2.2;
+ public float $flt2 = 2;
+ public array $arr = [];
+ public bool $bool = false;
+ public iterable $iter = [];
+}
+var_dump(new Foo);
+?>
+--EXPECT--
+object(Foo)#1 (6) {
+ ["int"]=>
+ int(1)
+ ["flt"]=>
+ float(2.2)
+ ["flt2"]=>
+ float(2)
+ ["arr"]=>
+ array(0) {
+ }
+ ["bool"]=>
+ bool(false)
+ ["iter"]=>
+ array(0) {
+ }
+}
diff --git a/Zend/tests/type_declarations/typed_properties_017.phpt b/Zend/tests/type_declarations/typed_properties_017.phpt
new file mode 100644
index 0000000000..3e501d3688
--- /dev/null
+++ b/Zend/tests/type_declarations/typed_properties_017.phpt
@@ -0,0 +1,12 @@
+--TEST--
+Test typed properties disallow void
+--FILE--
+<?php
+class Foo {
+ public void $int;
+}
+
+$foo = new Foo();
+?>
+--EXPECTF--
+Fatal error: Property Foo::$int cannot have type void in %s on line 3
diff --git a/Zend/tests/type_declarations/typed_properties_018.phpt b/Zend/tests/type_declarations/typed_properties_018.phpt
new file mode 100644
index 0000000000..f3ac4504b1
--- /dev/null
+++ b/Zend/tests/type_declarations/typed_properties_018.phpt
@@ -0,0 +1,17 @@
+--TEST--
+Test typed properties type applies to all props in group
+--FILE--
+<?php
+class Foo {
+ public int $bar,
+ $qux;
+}
+
+$reflector = new ReflectionClass(Foo::class);
+
+$prop = $reflector->getProperty("qux");
+
+var_dump($prop->getType()->getName());
+?>
+--EXPECT--
+string(3) "int"
diff --git a/Zend/tests/type_declarations/typed_properties_019.phpt b/Zend/tests/type_declarations/typed_properties_019.phpt
new file mode 100644
index 0000000000..d804b9c799
--- /dev/null
+++ b/Zend/tests/type_declarations/typed_properties_019.phpt
@@ -0,0 +1,22 @@
+--TEST--
+Test typed properties int must not be allowed to overflow
+--FILE--
+<?php
+class Foo {
+ public int $bar = PHP_INT_MAX;
+
+ public function inc() {
+ return ++$this->bar;
+ }
+}
+
+$foo = new Foo();
+
+try {
+ $foo->inc();
+} catch (TypeError $e) {
+ echo $e->getMessage(), "\n";
+}
+?>
+--EXPECT--
+Cannot increment property Foo::$bar of type int past its maximal value
diff --git a/Zend/tests/type_declarations/typed_properties_020.phpt b/Zend/tests/type_declarations/typed_properties_020.phpt
new file mode 100644
index 0000000000..d32d17b1c8
--- /dev/null
+++ b/Zend/tests/type_declarations/typed_properties_020.phpt
@@ -0,0 +1,26 @@
+--TEST--
+Test typed properties binary assign op helper test
+--FILE--
+<?php
+declare(strict_types=1);
+
+class Foo {
+ public int $bar = 0;
+
+ public function __construct() {
+ $this->bar += 2;
+ try {
+ $this->bar += 1.5;
+ } catch (TypeError $e) {
+ echo $e->getMessage(), "\n";
+ }
+ }
+}
+
+$foo = new Foo();
+
+var_dump($foo->bar);
+?>
+--EXPECT--
+Typed property Foo::$bar must be int, float used
+int(2)
diff --git a/Zend/tests/type_declarations/typed_properties_021.phpt b/Zend/tests/type_declarations/typed_properties_021.phpt
new file mode 100644
index 0000000000..93a07771fb
--- /dev/null
+++ b/Zend/tests/type_declarations/typed_properties_021.phpt
@@ -0,0 +1,16 @@
+--TEST--
+Test typed properties delay type check on constant
+--FILE--
+<?php
+class Foo {
+ public int $bar = BAR::BAZ;
+}
+
+try {
+ $foo = new Foo();
+} catch (Error $e) {
+ echo $e->getMessage(), "\n";
+}
+?>
+--EXPECT--
+Class 'BAR' not found
diff --git a/Zend/tests/type_declarations/typed_properties_022.phpt b/Zend/tests/type_declarations/typed_properties_022.phpt
new file mode 100644
index 0000000000..7e947825c9
--- /dev/null
+++ b/Zend/tests/type_declarations/typed_properties_022.phpt
@@ -0,0 +1,15 @@
+--TEST--
+Test typed properties delay type check on ast
+--FILE--
+<?php
+class Foo {
+ public int $bar = BAR::BAZ * 2;
+}
+
+$foo = new Foo();
+?>
+--EXPECTF--
+Fatal error: Uncaught Error: Class 'BAR' not found in %s:%d
+Stack trace:
+#0 {main}
+ thrown in %s on line %d
diff --git a/Zend/tests/type_declarations/typed_properties_023.phpt b/Zend/tests/type_declarations/typed_properties_023.phpt
new file mode 100644
index 0000000000..1531b23b95
--- /dev/null
+++ b/Zend/tests/type_declarations/typed_properties_023.phpt
@@ -0,0 +1,52 @@
+--TEST--
+Test typed static property
+--FILE--
+<?php
+function &ref() {
+ static $a = 5;
+ return $a;
+}
+
+class Foo {
+ public static int $i;
+ public static string $s = "x";
+}
+
+var_dump(Foo::$i = 1);
+var_dump(Foo::$i);
+var_dump(Foo::$i = "1");
+var_dump(Foo::$i);
+
+var_dump(Foo::$s);
+var_dump(Foo::$s = Foo::$i++);
+var_dump(Foo::$s, Foo::$i);
+$a = 3;
+var_dump(Foo::$s = $a);
+var_dump(Foo::$s);
+var_dump(Foo::$i = "4");
+var_dump(Foo::$i);
+
+var_dump(Foo::$i = ref());
+var_dump(Foo::$i);
+var_dump(Foo::$s = ref());
+var_dump(Foo::$s);
+var_dump(ref());
+?>
+--EXPECT--
+int(1)
+int(1)
+int(1)
+int(1)
+string(1) "x"
+string(1) "1"
+string(1) "1"
+int(2)
+string(1) "3"
+string(1) "3"
+int(4)
+int(4)
+int(5)
+int(5)
+string(1) "5"
+string(1) "5"
+int(5)
diff --git a/Zend/tests/type_declarations/typed_properties_024.phpt b/Zend/tests/type_declarations/typed_properties_024.phpt
new file mode 100644
index 0000000000..96f7216687
--- /dev/null
+++ b/Zend/tests/type_declarations/typed_properties_024.phpt
@@ -0,0 +1,16 @@
+--TEST--
+Test typed properties ignore private props during inheritance
+--FILE--
+<?php
+class Foo {
+ private int $thing;
+}
+
+class Bar extends Foo {
+ public string $thing; // No conflict
+}
+
+echo "ok";
+?>
+--EXPECT--
+ok
diff --git a/Zend/tests/type_declarations/typed_properties_025.phpt b/Zend/tests/type_declarations/typed_properties_025.phpt
new file mode 100644
index 0000000000..65187c1e17
--- /dev/null
+++ b/Zend/tests/type_declarations/typed_properties_025.phpt
@@ -0,0 +1,11 @@
+--TEST--
+Test typed properties type must preceed first declaration in group
+--FILE--
+<?php
+class Foo {
+ public $bar,
+ int $qux;
+}
+?>
+--EXPECTF--
+Parse error: syntax error, unexpected 'int' (T_STRING), expecting variable (T_VARIABLE) in %s on line 4
diff --git a/Zend/tests/type_declarations/typed_properties_026.phpt b/Zend/tests/type_declarations/typed_properties_026.phpt
new file mode 100644
index 0000000000..a2c4e25e33
--- /dev/null
+++ b/Zend/tests/type_declarations/typed_properties_026.phpt
@@ -0,0 +1,23 @@
+--TEST--
+Test typed properties inherit traits with typed properties
+--FILE--
+<?php
+trait Foo{
+ private int $baz;
+}
+
+class Baz{
+ use Foo;
+
+ function get(){
+ return $this->baz;
+ }
+}
+
+var_dump((new Baz)->get());
+--EXPECTF--
+Fatal error: Uncaught Error: Typed property Baz::$baz must not be accessed before initialization in %s:10
+Stack trace:
+#0 %s(14): Baz->get()
+#1 {main}
+ thrown in %s on line 10
diff --git a/Zend/tests/type_declarations/typed_properties_027.phpt b/Zend/tests/type_declarations/typed_properties_027.phpt
new file mode 100644
index 0000000000..861769932c
--- /dev/null
+++ b/Zend/tests/type_declarations/typed_properties_027.phpt
@@ -0,0 +1,16 @@
+--TEST--
+Test typed properties float widen at runtime
+--FILE--
+<?php
+
+class Foo {
+ public float $bar = 1.1;
+}
+
+$foo = new Foo;
+$foo->bar = 10;
+
+var_dump($foo->bar);
+?>
+--EXPECT--
+float(10)
diff --git a/Zend/tests/type_declarations/typed_properties_028.phpt b/Zend/tests/type_declarations/typed_properties_028.phpt
new file mode 100644
index 0000000000..de1b3f6602
--- /dev/null
+++ b/Zend/tests/type_declarations/typed_properties_028.phpt
@@ -0,0 +1,15 @@
+--TEST--
+Test typed properties respect strict types (off)
+--FILE--
+<?php
+class Foo {
+ public int $bar;
+}
+
+$foo = new Foo;
+$foo->bar = "1";
+
+var_dump($foo->bar);
+?>
+--EXPECT--
+int(1)
diff --git a/Zend/tests/type_declarations/typed_properties_029.phpt b/Zend/tests/type_declarations/typed_properties_029.phpt
new file mode 100644
index 0000000000..a5418c91a8
--- /dev/null
+++ b/Zend/tests/type_declarations/typed_properties_029.phpt
@@ -0,0 +1,18 @@
+--TEST--
+Test typed properties respect strict types (on)
+--FILE--
+<?php
+declare(strict_types=1);
+
+class Foo {
+ public int $bar;
+}
+
+$foo = new Foo;
+$foo->bar = "1";
+?>
+--EXPECTF--
+Fatal error: Uncaught TypeError: Typed property Foo::$bar must be int, string used in %s:9
+Stack trace:
+#0 {main}
+ thrown in %s on line 9
diff --git a/Zend/tests/type_declarations/typed_properties_030.phpt b/Zend/tests/type_declarations/typed_properties_030.phpt
new file mode 100644
index 0000000000..a835ae5fae
--- /dev/null
+++ b/Zend/tests/type_declarations/typed_properties_030.phpt
@@ -0,0 +1,25 @@
+--TEST--
+Test typed properties unset __get magical magic
+--FILE--
+<?php
+class Foo {
+ public int $bar;
+
+ public function __get($name) {
+ return "violate";
+ }
+}
+
+$foo = new Foo;
+
+$foo->bar = "1"; # ok
+
+unset($foo->bar); # ok
+
+var_dump($foo->bar); # not okay, __get is nasty
+?>
+--EXPECTF--
+Fatal error: Uncaught TypeError: Typed property Foo::$bar must be int, string used in %s:16
+Stack trace:
+#0 {main}
+ thrown in %s on line 16
diff --git a/Zend/tests/type_declarations/typed_properties_031.phpt b/Zend/tests/type_declarations/typed_properties_031.phpt
new file mode 100644
index 0000000000..8022d2ef72
--- /dev/null
+++ b/Zend/tests/type_declarations/typed_properties_031.phpt
@@ -0,0 +1,22 @@
+--TEST--
+Test typed properties coerce int to float even in strict mode
+--FILE--
+<?php
+declare(strict_types=1);
+
+class Bar
+{
+ public float $bar;
+
+ public function setBar($value) {
+ $this->bar = $value;
+ }
+}
+
+$bar = new Bar();
+
+$bar->setBar(100);
+
+var_dump($bar->bar);
+--EXPECT--
+float(100)
diff --git a/Zend/tests/type_declarations/typed_properties_032.phpt b/Zend/tests/type_declarations/typed_properties_032.phpt
new file mode 100644
index 0000000000..f3ceeb5cd9
--- /dev/null
+++ b/Zend/tests/type_declarations/typed_properties_032.phpt
@@ -0,0 +1,15 @@
+--TEST--
+Test typed properties return by ref is allowed
+--FILE--
+<?php
+$foo = new class {
+ public int $bar = 15;
+
+ public function &method() {
+ return $this->bar;
+ }
+};
+
+var_dump($foo->method());
+--EXPECT--
+int(15)
diff --git a/Zend/tests/type_declarations/typed_properties_033.phpt b/Zend/tests/type_declarations/typed_properties_033.phpt
new file mode 100644
index 0000000000..87e6aef26b
--- /dev/null
+++ b/Zend/tests/type_declarations/typed_properties_033.phpt
@@ -0,0 +1,38 @@
+--TEST--
+Test typed properties yield reference guard
+--FILE--
+<?php
+$foo = new class {
+ public int $foo = 1;
+ public int $bar = 3;
+ public int $baz = 5;
+ public int $qux = PHP_INT_MAX;
+
+ public function &fetch() {
+ yield $this->foo;
+ yield $this->bar;
+ yield $this->baz;
+ yield $this->qux;
+ }
+};
+
+try {
+ foreach ($foo->fetch() as &$prop) {
+ $prop += 1;
+ }
+} catch (Error $e) { echo $e->getMessage(), "\n"; }
+
+var_dump($foo);
+?>
+--EXPECTF--
+Cannot assign float to reference held by property class@anonymous::$qux of type int
+object(class@anonymous)#1 (4) {
+ ["foo"]=>
+ int(2)
+ ["bar"]=>
+ int(4)
+ ["baz"]=>
+ int(6)
+ ["qux"]=>
+ &int(%d)
+}
diff --git a/Zend/tests/type_declarations/typed_properties_034.phpt b/Zend/tests/type_declarations/typed_properties_034.phpt
new file mode 100644
index 0000000000..c3885af39f
--- /dev/null
+++ b/Zend/tests/type_declarations/typed_properties_034.phpt
@@ -0,0 +1,51 @@
+--TEST--
+Test typed properties passed to typed function
+--FILE--
+<?php
+$foo = new class {
+ public ?int $bar = 42;
+ public int $baz;
+
+ public function &getIterator() {
+ foreach (['1', &$this->bar] as &$item) {
+ yield $item;
+ }
+ }
+};
+
+function foo(?int &$a) {
+ var_dump($a);
+ $a = null;
+}
+
+foo($foo->bar);
+
+try {
+ $foo->baz = &$foo->bar;
+} catch (Error $e) { echo $e->getMessage(), "\n"; }
+$foo->bar = 10;
+
+foreach ($foo->getIterator() as &$item) {
+ $foo->baz = &$item;
+ var_dump($foo->baz);
+}
+
+try {
+ foo($foo->bar);
+} catch (Error $e) { echo $e->getMessage(), "\n"; }
+
+var_dump($foo);
+?>
+--EXPECT--
+int(42)
+Typed property class@anonymous::$baz must be int, null used
+int(1)
+int(10)
+int(10)
+Cannot assign null to reference held by property class@anonymous::$baz of type int
+object(class@anonymous)#1 (2) {
+ ["bar"]=>
+ &int(10)
+ ["baz"]=>
+ &int(10)
+}
diff --git a/Zend/tests/type_declarations/typed_properties_035.phpt b/Zend/tests/type_declarations/typed_properties_035.phpt
new file mode 100644
index 0000000000..923f7a2a85
--- /dev/null
+++ b/Zend/tests/type_declarations/typed_properties_035.phpt
@@ -0,0 +1,13 @@
+--TEST--
+Test typed properties inheritance must not change type
+--FILE--
+<?php
+class Foo{
+ public $bar = 42;
+}
+
+class Baz extends Foo{
+ public int $bar = 33;
+}
+--EXPECTF--
+Fatal error: Type of Baz::$bar must not be defined (as in class Foo) in %s on line 8
diff --git a/Zend/tests/type_declarations/typed_properties_036.phpt b/Zend/tests/type_declarations/typed_properties_036.phpt
new file mode 100644
index 0000000000..edb87a38e0
--- /dev/null
+++ b/Zend/tests/type_declarations/typed_properties_036.phpt
@@ -0,0 +1,15 @@
+--TEST--
+Test unitialized typed properties normal foreach must not be yielded
+--FILE--
+<?php
+$foo = new class {
+ public int $bar = 10, $qux;
+};
+
+foreach ($foo as $key => $bar) {
+ var_dump($key, $bar);
+}
+?>
+--EXPECT--
+string(3) "bar"
+int(10)
diff --git a/Zend/tests/type_declarations/typed_properties_037.phpt b/Zend/tests/type_declarations/typed_properties_037.phpt
new file mode 100644
index 0000000000..c5dde53572
--- /dev/null
+++ b/Zend/tests/type_declarations/typed_properties_037.phpt
@@ -0,0 +1,16 @@
+--TEST--
+Test typed properties var_dump uninitialized
+--FILE--
+<?php
+$foo = new class {
+ public int $bar = 10, $qux;
+};
+
+var_dump($foo);
+--EXPECTF--
+object(class@anonymous)#%d (1) {
+ ["bar"]=>
+ int(10)
+ ["qux"]=>
+ uninitialized(int)
+}
diff --git a/Zend/tests/type_declarations/typed_properties_038.phpt b/Zend/tests/type_declarations/typed_properties_038.phpt
new file mode 100644
index 0000000000..44e5d04c7f
--- /dev/null
+++ b/Zend/tests/type_declarations/typed_properties_038.phpt
@@ -0,0 +1,61 @@
+--TEST--
+Test typed properties overflowing
+--FILE--
+<?php
+
+$foo = new class {
+ public int $bar = PHP_INT_MAX;
+};
+
+try {
+ $foo->bar++;
+} catch(TypeError $t) {
+ var_dump($t->getMessage());
+}
+
+var_dump($foo);
+
+try {
+ $foo->bar += 1;
+} catch(TypeError $t) {
+ var_dump($t->getMessage());
+}
+
+var_dump($foo);
+
+try {
+ ++$foo->bar;
+} catch(TypeError $t) {
+ var_dump($t->getMessage());
+}
+
+var_dump($foo);
+
+try {
+ $foo->bar = $foo->bar + 1;
+} catch(TypeError $t) {
+ var_dump($t->getMessage());
+}
+
+var_dump($foo);
+--EXPECTF--
+string(82) "Cannot increment property class@anonymous::$bar of type int past its maximal value"
+object(class@anonymous)#1 (1) {
+ ["bar"]=>
+ int(%d)
+}
+string(60) "Typed property class@anonymous::$bar must be int, float used"
+object(class@anonymous)#1 (1) {
+ ["bar"]=>
+ int(%d)
+}
+string(82) "Cannot increment property class@anonymous::$bar of type int past its maximal value"
+object(class@anonymous)#1 (1) {
+ ["bar"]=>
+ int(%d)
+}
+string(60) "Typed property class@anonymous::$bar must be int, float used"
+object(class@anonymous)#1 (1) {
+ ["bar"]=>
+ int(%d)
+}
diff --git a/Zend/tests/type_declarations/typed_properties_039.phpt b/Zend/tests/type_declarations/typed_properties_039.phpt
new file mode 100644
index 0000000000..62413d804c
--- /dev/null
+++ b/Zend/tests/type_declarations/typed_properties_039.phpt
@@ -0,0 +1,31 @@
+--TEST--
+Repeated assign of a variable to mismatched property type must not succeed
+--FILE--
+<?php
+
+class A {
+ public int $foo;
+}
+
+class B {
+ public A $foo;
+}
+
+$objs = [new A, new A];
+$v = 1;
+
+foreach ($objs as $obj) {
+ $obj->foo = $v;
+ $v = new A;
+ $obj = new B;
+ $obj->foo = $v;
+}
+
+var_dump($objs);
+
+?>
+--EXPECTF--
+Fatal error: Uncaught TypeError: Typed property A::$foo must be int, A used in %s:%d
+Stack trace:
+#0 {main}
+ thrown in %s on line %d
diff --git a/Zend/tests/type_declarations/typed_properties_040.phpt b/Zend/tests/type_declarations/typed_properties_040.phpt
new file mode 100644
index 0000000000..4da738cb41
--- /dev/null
+++ b/Zend/tests/type_declarations/typed_properties_040.phpt
@@ -0,0 +1,26 @@
+--TEST--
+Test __get on unset typed property must fail properly
+--FILE--
+<?php
+declare(strict_types=1);
+
+class Foo {
+ public int $bar;
+
+ public function __get($name) {
+ var_dump($name);
+ }
+}
+
+$foo = new Foo();
+
+unset($foo->bar);
+var_dump($foo->bar);
+?>
+--EXPECTF--
+string(3) "bar"
+
+Fatal error: Uncaught TypeError: Typed property Foo::$bar must be int, null used in %s:%d
+Stack trace:
+#0 {main}
+ thrown in %s on line %d
diff --git a/Zend/tests/type_declarations/typed_properties_041.phpt b/Zend/tests/type_declarations/typed_properties_041.phpt
new file mode 100644
index 0000000000..76dbfd8f5d
--- /dev/null
+++ b/Zend/tests/type_declarations/typed_properties_041.phpt
@@ -0,0 +1,16 @@
+--TEST--
+Test typed properties weak conversion of strings
+--FILE--
+<?php
+
+class Foo {
+ public int $bar = 1;
+}
+
+$foo = new Foo;
+$foo->bar = "10";
+
+var_dump($foo->bar);
+?>
+--EXPECT--
+int(10)
diff --git a/Zend/tests/type_declarations/typed_properties_042.phpt b/Zend/tests/type_declarations/typed_properties_042.phpt
new file mode 100644
index 0000000000..ecb3df3c11
--- /dev/null
+++ b/Zend/tests/type_declarations/typed_properties_042.phpt
@@ -0,0 +1,21 @@
+--TEST--
+Proper source duplication on assignment to typed property
+--FILE--
+<?php
+class Foo {
+ public int $bar;
+}
+
+$foo = new Foo();
+
+for ($i = 0; $i < 5; $i++) {
+ $foo->bar = "5";
+ var_dump($foo->bar);
+}
+?>
+--EXPECT--
+int(5)
+int(5)
+int(5)
+int(5)
+int(5)
diff --git a/Zend/tests/type_declarations/typed_properties_043.phpt b/Zend/tests/type_declarations/typed_properties_043.phpt
new file mode 100644
index 0000000000..eefe358796
--- /dev/null
+++ b/Zend/tests/type_declarations/typed_properties_043.phpt
@@ -0,0 +1,53 @@
+--TEST--
+Trying to assign to a static 'self' typed property on a trait must not fixate the type to the trait
+--FILE--
+<?php
+
+trait Test {
+ public static self $selfProp;
+ public static ?self $selfNullProp;
+ public static parent $parentProp;
+}
+
+try {
+ Test::$selfProp = new stdClass;
+} catch (Error $e) {
+ echo $e->getMessage(), "\n";
+}
+try {
+ Test::$selfNullProp = new stdClass;
+} catch (Error $e) {
+ echo $e->getMessage(), "\n";
+}
+try {
+ Test::$parentProp = new stdClass;
+} catch (Error $e) {
+ echo $e->getMessage(), "\n";
+}
+
+Test::$selfNullProp = null;
+var_dump(Test::$selfNullProp);
+
+class Foo {}
+class Bar extends Foo {
+ use Test;
+}
+
+Bar::$selfProp = new Bar;
+Bar::$selfNullProp = new Bar;
+Bar::$parentProp = new Foo;
+
+var_dump(Bar::$selfProp, Bar::$selfNullProp, Bar::$parentProp);
+
+?>
+--EXPECT--
+Cannot write a value to a 'self' typed static property of a trait
+Cannot write a non-null value to a 'self' typed static property of a trait
+Cannot access parent:: when current class scope has no parent
+NULL
+object(Bar)#3 (0) {
+}
+object(Bar)#2 (0) {
+}
+object(Foo)#4 (0) {
+}
diff --git a/Zend/tests/type_declarations/typed_properties_044.phpt b/Zend/tests/type_declarations/typed_properties_044.phpt
new file mode 100644
index 0000000000..02a71a7b0b
--- /dev/null
+++ b/Zend/tests/type_declarations/typed_properties_044.phpt
@@ -0,0 +1,58 @@
+--TEST--
+Test increment functions on typed property references
+--SKIPIF--
+<?php if (PHP_INT_SIZE != 8) die("skip this test is for 64 bit platform only"); ?>
+--FILE--
+<?php
+$foo = new class {
+ public ?int $bar;
+};
+
+$bar = &$foo->bar;
+
+$bar *= 1;
+
+var_dump($bar--);
+var_dump(--$bar);
+var_dump(++$bar);
+var_dump($bar++);
+
+$bar = PHP_INT_MAX;
+
+try {
+ var_dump($bar++);
+} catch (Throwable $e) {
+ echo $e->getMessage() . "\n";
+}
+
+try {
+ var_dump(++$bar);
+} catch (Throwable $e) {
+ echo $e->getMessage() . "\n";
+}
+
+$bar = PHP_INT_MIN;
+
+
+try {
+ var_dump($bar--);
+} catch (Throwable $e) {
+ echo $e->getMessage() . "\n";
+}
+
+try {
+ var_dump(--$bar);
+} catch (Throwable $e) {
+ echo $e->getMessage() . "\n";
+}
+
+?>
+--EXPECT--
+int(0)
+int(-2)
+int(-1)
+int(-1)
+Cannot increment a reference held by property class@anonymous::$bar of type ?int past its maximal value
+Cannot increment a reference held by property class@anonymous::$bar of type ?int past its maximal value
+Cannot decrement a reference held by property class@anonymous::$bar of type ?int past its minimal value
+Cannot decrement a reference held by property class@anonymous::$bar of type ?int past its minimal value
diff --git a/Zend/tests/type_declarations/typed_properties_045.phpt b/Zend/tests/type_declarations/typed_properties_045.phpt
new file mode 100644
index 0000000000..7e4dc8e43f
--- /dev/null
+++ b/Zend/tests/type_declarations/typed_properties_045.phpt
@@ -0,0 +1,51 @@
+--TEST--
+foreach() must return properly typed references
+--FILE--
+<?php
+class Foo {
+ public int $bar = 0;
+ public float $baz = 0.5;
+ private float $privateProp = 0.5;
+
+ public function test() {
+ foreach ($this as $k => &$val) {
+ if ($k == 'privateProp') {
+ var_dump($val);
+ $val = 20;
+ var_dump($val);
+ try {
+ $val = [];
+ } catch (Error $e) {
+ echo $e->getMessage(), "\n";
+ }
+ }
+ }
+ }
+}
+
+$foo = new Foo;
+foreach ($foo as $k => &$val) {
+ var_dump($val);
+
+ $val = 20;
+ var_dump($foo->$k);
+
+ try {
+ $val = [];
+ var_dump($foo->$k);
+ } catch (Error $e) {
+ echo $e->getMessage(), "\n";
+ }
+}
+$foo->test();
+?>
+--EXPECT--
+int(0)
+int(20)
+Cannot assign array to reference held by property Foo::$bar of type int
+float(0.5)
+float(20)
+Cannot assign array to reference held by property Foo::$baz of type float
+float(0.5)
+float(20)
+Cannot assign array to reference held by property Foo::$privateProp of type float
diff --git a/Zend/tests/type_declarations/typed_properties_046.phpt b/Zend/tests/type_declarations/typed_properties_046.phpt
new file mode 100644
index 0000000000..050e64a2a4
--- /dev/null
+++ b/Zend/tests/type_declarations/typed_properties_046.phpt
@@ -0,0 +1,29 @@
+--TEST--
+Memory leaks on wrong assignment to typed property
+--FILE--
+<?php
+class Foo {
+ public int $bbb;
+}
+
+function foo() {
+ return new Foo();
+}
+
+function bar() {
+ return str_repeat("b", 3);
+}
+
+for ($i = 0; $i < 5; $i++) {
+ try {
+ foo()->{bar()} = str_repeat("a", 3);
+ } catch (Throwable $e) {
+ echo $e->getMessage() . "\n";
+ }
+}
+--EXPECT--
+Typed property Foo::$bbb must be int, string used
+Typed property Foo::$bbb must be int, string used
+Typed property Foo::$bbb must be int, string used
+Typed property Foo::$bbb must be int, string used
+Typed property Foo::$bbb must be int, string used
diff --git a/Zend/tests/type_declarations/typed_properties_047.phpt b/Zend/tests/type_declarations/typed_properties_047.phpt
new file mode 100644
index 0000000000..0b48cd1cd4
--- /dev/null
+++ b/Zend/tests/type_declarations/typed_properties_047.phpt
@@ -0,0 +1,40 @@
+--TEST--
+Nullable typed property
+--FILE--
+<?php
+class Foo {
+ public ?int $foo = null;
+}
+
+$x = new Foo();
+var_dump($x);
+var_dump($x->foo);
+
+$x->foo = 5;
+var_dump($x->foo);
+
+$x->foo = null;
+var_dump($x->foo);
+
+unset($x->foo);
+try {
+ var_dump($x->foo);
+} catch (Throwable $e) {
+ echo $e->getMessage()."\n";
+}
+try {
+ $x->foo = "ops";
+} catch (Throwable $e) {
+ echo $e->getMessage()."\n";
+}
+?>
+--EXPECT--
+object(Foo)#1 (1) {
+ ["foo"]=>
+ NULL
+}
+NULL
+int(5)
+NULL
+Typed property Foo::$foo must not be accessed before initialization
+Typed property Foo::$foo must be int or null, string used
diff --git a/Zend/tests/type_declarations/typed_properties_048.phpt b/Zend/tests/type_declarations/typed_properties_048.phpt
new file mode 100644
index 0000000000..8a06c55f23
--- /dev/null
+++ b/Zend/tests/type_declarations/typed_properties_048.phpt
@@ -0,0 +1,17 @@
+--TEST--
+Parent private property types must be ignored
+--FILE--
+<?php
+
+class A {
+ private $prop = "1";
+}
+class B extends A {
+ private int $prop = 2;
+}
+
+var_dump((function () { return $this->prop; })->call(new B));
+
+?>
+--EXPECT--
+int(2)
diff --git a/Zend/tests/type_declarations/typed_properties_049.phpt b/Zend/tests/type_declarations/typed_properties_049.phpt
new file mode 100644
index 0000000000..e761590548
--- /dev/null
+++ b/Zend/tests/type_declarations/typed_properties_049.phpt
@@ -0,0 +1,10 @@
+--TEST--
+Nullable typed property
+--FILE--
+<?php
+class Foo {
+ public int $foo = null;
+}
+?>
+--EXPECTF--
+Fatal error: Default value for property of type int may not be null. Use the nullable type ?int to allow null default value in %s on line %d
diff --git a/Zend/tests/type_declarations/typed_properties_050.phpt b/Zend/tests/type_declarations/typed_properties_050.phpt
new file mode 100644
index 0000000000..3fa826083e
--- /dev/null
+++ b/Zend/tests/type_declarations/typed_properties_050.phpt
@@ -0,0 +1,19 @@
+--TEST--
+Weak casts must not overwrite source variables
+--FILE--
+<?php
+
+$b = 1;
+$a = "$b";
+class A { public int $a; }
+$o = new A;
+$o->a = $b;
+var_dump($o, $a);
+
+?>
+--EXPECT--
+object(A)#1 (1) {
+ ["a"]=>
+ int(1)
+}
+string(1) "1"
diff --git a/Zend/tests/type_declarations/typed_properties_051.phpt b/Zend/tests/type_declarations/typed_properties_051.phpt
new file mode 100644
index 0000000000..1c8673d0d3
--- /dev/null
+++ b/Zend/tests/type_declarations/typed_properties_051.phpt
@@ -0,0 +1,27 @@
+--TEST--
+Weak casts must not leak
+--FILE--
+<?php
+
+class A {
+ public string $a;
+}
+class B {
+ function __toString() {
+ return str_repeat("ok", 2);
+ }
+}
+class C {
+}
+$o = new A;
+$o->a = new B;
+var_dump($o->a);
+try {
+ $o->a = new C;
+} catch (Throwable $e) {
+ echo $e->getMessage()."\n";
+}
+?>
+--EXPECT--
+string(4) "okok"
+Typed property A::$a must be string, C used
diff --git a/Zend/tests/type_declarations/typed_properties_052.phpt b/Zend/tests/type_declarations/typed_properties_052.phpt
new file mode 100644
index 0000000000..3a73d7359a
--- /dev/null
+++ b/Zend/tests/type_declarations/typed_properties_052.phpt
@@ -0,0 +1,34 @@
+--TEST--
+Class properties declared in eval() must not leak
+--FILE--
+<?php
+
+eval(<<<'EOF'
+class A {
+ public A $a1;
+ public \B $b1;
+ public Foo\C $c1;
+ public ?A $a2;
+ public ?\B $b2;
+ public ?Foo\C $c2;
+}
+EOF
+);
+$obj = new A;
+var_dump($obj);
+?>
+--EXPECT--
+object(A)#1 (0) {
+ ["a1"]=>
+ uninitialized(A)
+ ["b1"]=>
+ uninitialized(B)
+ ["c1"]=>
+ uninitialized(Foo\C)
+ ["a2"]=>
+ uninitialized(?A)
+ ["b2"]=>
+ uninitialized(?B)
+ ["c2"]=>
+ uninitialized(?Foo\C)
+}
diff --git a/Zend/tests/type_declarations/typed_properties_053.phpt b/Zend/tests/type_declarations/typed_properties_053.phpt
new file mode 100644
index 0000000000..1da42bcbd9
--- /dev/null
+++ b/Zend/tests/type_declarations/typed_properties_053.phpt
@@ -0,0 +1,12 @@
+--TEST--
+Typed properties disallow callable
+--FILE--
+<?php
+class A {
+ public callable $a;
+}
+$obj = new A;
+var_dump($obj);
+?>
+--EXPECTF--
+Fatal error: Property A::$a cannot have type callable in %s on line %d
diff --git a/Zend/tests/type_declarations/typed_properties_054.phpt b/Zend/tests/type_declarations/typed_properties_054.phpt
new file mode 100644
index 0000000000..38de9815ed
--- /dev/null
+++ b/Zend/tests/type_declarations/typed_properties_054.phpt
@@ -0,0 +1,12 @@
+--TEST--
+Typed properties disallow callable (nullable variant)
+--FILE--
+<?php
+class A {
+ public ?callable $a;
+}
+$obj = new A;
+var_dump($obj);
+?>
+--EXPECTF--
+Fatal error: Property A::$a cannot have type callable in %s on line %d
diff --git a/Zend/tests/type_declarations/typed_properties_055.phpt b/Zend/tests/type_declarations/typed_properties_055.phpt
new file mode 100644
index 0000000000..31d687254c
--- /dev/null
+++ b/Zend/tests/type_declarations/typed_properties_055.phpt
@@ -0,0 +1,29 @@
+--TEST--
+Test assign to typed property taken by reference
+--FILE--
+<?php
+class A {
+ public $foo = 1;
+ public int $bar = 2;
+}
+class B {
+ public A $a;
+}
+$f = function (&$n) {
+ var_dump($n);
+ $n = "ops";
+};
+$o = new B;
+$o->a = new A;
+$f($o->a->foo);
+$f($o->a->bar);
+?>
+--EXPECTF--
+int(1)
+int(2)
+
+Fatal error: Uncaught TypeError: Cannot assign string to reference held by property A::$bar of type int in %s:%d
+Stack trace:
+#0 %s(%d): {closure}(2)
+#1 {main}
+ thrown in %s on line %d
diff --git a/Zend/tests/type_declarations/typed_properties_056.phpt b/Zend/tests/type_declarations/typed_properties_056.phpt
new file mode 100644
index 0000000000..54013f44f2
--- /dev/null
+++ b/Zend/tests/type_declarations/typed_properties_056.phpt
@@ -0,0 +1,23 @@
+--TEST--
+Type change in assign_op (use-after-free)
+--FILE--
+<?php
+declare(strict_types=1);
+
+class A {
+ public string $foo;
+}
+
+$o = new A;
+$o->foo = "1" . str_repeat("0", 2);
+try {
+ $o->foo += 5;
+} catch (Throwable $e) {
+ echo $e->getMessage() . "\n";
+}
+var_dump($o->foo);
+unset($o);
+?>
+--EXPECT--
+Typed property A::$foo must be string, int used
+string(3) "100"
diff --git a/Zend/tests/type_declarations/typed_properties_057.phpt b/Zend/tests/type_declarations/typed_properties_057.phpt
new file mode 100644
index 0000000000..6b53a42600
--- /dev/null
+++ b/Zend/tests/type_declarations/typed_properties_057.phpt
@@ -0,0 +1,31 @@
+--TEST--
+Type change in pre/post-increment (use-after-free)
+--FILE--
+<?php
+declare(strict_types=1);
+
+class A {
+ public string $foo;
+}
+
+$o = new A;
+$o->foo = "1" . str_repeat("0", 2);
+try {
+ $x = ++$o->foo;
+} catch (Throwable $e) {
+ echo $e->getMessage() . "\n";
+}
+var_dump($o->foo);
+try {
+ $x = $o->foo++;
+} catch (Throwable $e) {
+ echo $e->getMessage() . "\n";
+}
+var_dump($o->foo);
+unset($o);
+?>
+--EXPECT--
+Typed property A::$foo must be string, int used
+string(3) "100"
+Typed property A::$foo must be string, int used
+string(3) "100"
diff --git a/Zend/tests/type_declarations/typed_properties_058.phpt b/Zend/tests/type_declarations/typed_properties_058.phpt
new file mode 100644
index 0000000000..d9283bdbef
--- /dev/null
+++ b/Zend/tests/type_declarations/typed_properties_058.phpt
@@ -0,0 +1,32 @@
+--TEST--
+Constants in default values of properties
+--FILE--
+<?php
+declare(strict_types=1);
+
+define("FOO", 5);
+
+class A {
+ public int $foo = FOO;
+}
+
+class B {
+ public string $foo = FOO;
+}
+
+$o = new A();
+var_dump($o->foo);
+
+for ($i = 0; $i < 2; $i++) {
+ try {
+ $o = new B();
+ var_dump($o->foo);
+ } catch (Throwable $e) {
+ echo $e->getMessage() . "\n";
+ }
+}
+?>
+--EXPECT--
+int(5)
+Typed property B::$foo must be string, int used
+Typed property B::$foo must be string, int used
diff --git a/Zend/tests/type_declarations/typed_properties_059.phpt b/Zend/tests/type_declarations/typed_properties_059.phpt
new file mode 100644
index 0000000000..caee8501f7
--- /dev/null
+++ b/Zend/tests/type_declarations/typed_properties_059.phpt
@@ -0,0 +1,29 @@
+--TEST--
+Nullable typed properties in traits
+--FILE--
+<?php
+trait T {
+ public int $a1;
+ public ?int $b1;
+}
+
+class A {
+ use T;
+ public int $a2;
+ public ?int $b2;
+}
+
+$x = new A;
+var_dump($x);
+?>
+--EXPECT--
+object(A)#1 (0) {
+ ["a2"]=>
+ uninitialized(int)
+ ["b2"]=>
+ uninitialized(?int)
+ ["a1"]=>
+ uninitialized(int)
+ ["b1"]=>
+ uninitialized(?int)
+}
diff --git a/Zend/tests/type_declarations/typed_properties_060.phpt b/Zend/tests/type_declarations/typed_properties_060.phpt
new file mode 100644
index 0000000000..559349b7a9
--- /dev/null
+++ b/Zend/tests/type_declarations/typed_properties_060.phpt
@@ -0,0 +1,22 @@
+--TEST--
+Test typed properties work fine with simple inheritance
+--FILE--
+<?php
+
+class A {
+ public int $a = 1;
+}
+class B extends A {}
+
+$o = new B;
+var_dump($o->a);
+$o->a = "a";
+
+?>
+--EXPECTF--
+int(1)
+
+Fatal error: Uncaught TypeError: Typed property A::$a must be int, string used in %s:%d
+Stack trace:
+#0 {main}
+ thrown in %s on line %d
diff --git a/Zend/tests/type_declarations/typed_properties_061.phpt b/Zend/tests/type_declarations/typed_properties_061.phpt
new file mode 100644
index 0000000000..647543c6d6
--- /dev/null
+++ b/Zend/tests/type_declarations/typed_properties_061.phpt
@@ -0,0 +1,58 @@
+--TEST--
+Typed property on overloaded by-ref property
+--SKIPIF--
+<?php if (PHP_INT_SIZE == 4) die("SKIP: 64 bit test"); ?>
+--FILE--
+<?php
+
+$a = new class {
+ public int $foo = 1;
+
+ function &__get($x) {
+ return $this->foo;
+ }
+
+ function __set($x, $y) {
+ echo "set($y)\n";
+ }
+};
+
+$a->_ += 1;
+var_dump($a->foo);
+
+$a->_ .= "1";
+var_dump($a->foo);
+
+$a->_ .= "e50";
+var_dump($a->foo);
+
+$a->_--;
+var_dump($a->foo);
+
+--$a->_;
+var_dump($a->foo);
+
+$a->foo = PHP_INT_MAX;
+
+$a->_++;
+var_dump($a->foo);
+
+++$a->_;
+var_dump($a->foo);
+
+?>
+--EXPECT--
+set(2)
+int(1)
+set(11)
+int(1)
+set(1e50)
+int(1)
+set(0)
+int(1)
+set(0)
+int(1)
+set(9.2233720368548E+18)
+int(9223372036854775807)
+set(9.2233720368548E+18)
+int(9223372036854775807)
diff --git a/Zend/tests/type_declarations/typed_properties_062.phpt b/Zend/tests/type_declarations/typed_properties_062.phpt
new file mode 100644
index 0000000000..45f4682806
--- /dev/null
+++ b/Zend/tests/type_declarations/typed_properties_062.phpt
@@ -0,0 +1,81 @@
+--TEST--
+Typed property on by-ref property
+--FILE--
+<?php
+
+$a = new class {
+ public int $foo = 1;
+ public $_;
+};
+
+$a->_ = &$a->foo;
+
+$a->_ += 1;
+var_dump($a->foo);
+
+$a->_ .= "1";
+var_dump($a->foo);
+
+try {
+ $a->_ .= "e50";
+} catch (Error $e) { echo $e->getMessage(), "\n"; }
+var_dump($a->foo);
+
+$a->_--;
+var_dump($a->foo);
+
+--$a->_;
+var_dump($a->foo);
+
+$a->foo = PHP_INT_MIN;
+
+try {
+ $a->_--;
+} catch (Error $e) { echo $e->getMessage(), "\n"; }
+echo gettype($a->foo),"\n";
+
+try {
+ --$a->_;
+} catch (Error $e) { echo $e->getMessage(), "\n"; }
+echo gettype($a->foo),"\n";
+
+$a->foo = PHP_INT_MAX;
+
+try {
+ $a->_++;
+} catch (Error $e) { echo $e->getMessage(), "\n"; }
+echo gettype($a->foo),"\n";
+
+try {
+ ++$a->_;
+} catch (Error $e) { echo $e->getMessage(), "\n"; }
+echo gettype($a->foo),"\n";
+
+$a->_ = 0;
+try {
+ $a->_ = [];
+} catch (Error $e) { echo $e->getMessage(), "\n"; }
+var_dump($a->foo);
+
+$a->_ = 1;
+var_dump($a->foo);
+
+?>
+--EXPECT--
+int(2)
+int(21)
+Cannot assign string to reference held by property class@anonymous::$foo of type int
+int(21)
+int(20)
+int(19)
+Cannot decrement a reference held by property class@anonymous::$foo of type int past its minimal value
+integer
+Cannot decrement a reference held by property class@anonymous::$foo of type int past its minimal value
+integer
+Cannot increment a reference held by property class@anonymous::$foo of type int past its maximal value
+integer
+Cannot increment a reference held by property class@anonymous::$foo of type int past its maximal value
+integer
+Cannot assign array to reference held by property class@anonymous::$foo of type int
+int(0)
+int(1)
diff --git a/Zend/tests/type_declarations/typed_properties_063.phpt b/Zend/tests/type_declarations/typed_properties_063.phpt
new file mode 100644
index 0000000000..bd4cccff22
--- /dev/null
+++ b/Zend/tests/type_declarations/typed_properties_063.phpt
@@ -0,0 +1,80 @@
+--TEST--
+Typed property on by-ref variable
+--FILE--
+<?php
+
+$a = new class {
+ public int $foo = 1;
+};
+
+$_ = &$a->foo;
+
+$_ += 1;
+var_dump($a->foo);
+
+$_ .= "1";
+var_dump($a->foo);
+
+try {
+ $_ .= "e50";
+} catch (Error $e) { echo $e->getMessage(), "\n"; }
+var_dump($a->foo);
+
+$_--;
+var_dump($a->foo);
+
+--$_;
+var_dump($a->foo);
+
+$a->foo = PHP_INT_MIN;
+
+try {
+ $_--;
+} catch (Error $e) { echo $e->getMessage(), "\n"; }
+echo gettype($a->foo),"\n";
+
+try {
+ --$_;
+} catch (Error $e) { echo $e->getMessage(), "\n"; }
+echo gettype($a->foo),"\n";
+
+$a->foo = PHP_INT_MAX;
+
+try {
+ $_++;
+} catch (Error $e) { echo $e->getMessage(), "\n"; }
+echo gettype($a->foo),"\n";
+
+try {
+ ++$_;
+} catch (Error $e) { echo $e->getMessage(), "\n"; }
+echo gettype($a->foo),"\n";
+
+$_ = 0;
+try {
+ $_ = [];
+} catch (Error $e) { echo $e->getMessage(), "\n"; }
+var_dump($a->foo);
+
+$_ = 1;
+var_dump($a->foo);
+
+?>
+--EXPECT--
+int(2)
+int(21)
+Cannot assign string to reference held by property class@anonymous::$foo of type int
+int(21)
+int(20)
+int(19)
+Cannot decrement a reference held by property class@anonymous::$foo of type int past its minimal value
+integer
+Cannot decrement a reference held by property class@anonymous::$foo of type int past its minimal value
+integer
+Cannot increment a reference held by property class@anonymous::$foo of type int past its maximal value
+integer
+Cannot increment a reference held by property class@anonymous::$foo of type int past its maximal value
+integer
+Cannot assign array to reference held by property class@anonymous::$foo of type int
+int(0)
+int(1)
diff --git a/Zend/tests/type_declarations/typed_properties_064.phpt b/Zend/tests/type_declarations/typed_properties_064.phpt
new file mode 100644
index 0000000000..59e0552898
--- /dev/null
+++ b/Zend/tests/type_declarations/typed_properties_064.phpt
@@ -0,0 +1,80 @@
+--TEST--
+Typed property on by-ref array value
+--FILE--
+<?php
+
+$a = new class {
+ public int $foo = 1;
+};
+
+$_ = [&$a->foo];
+
+$_[0] += 1;
+var_dump($a->foo);
+
+$_[0] .= "1";
+var_dump($a->foo);
+
+try {
+ $_[0] .= "e50";
+} catch (Error $e) { echo $e->getMessage(), "\n"; }
+var_dump($a->foo);
+
+$_[0]--;
+var_dump($a->foo);
+
+--$_[0];
+var_dump($a->foo);
+
+$a->foo = PHP_INT_MIN;
+
+try {
+ $_[0]--;
+} catch (Error $e) { echo $e->getMessage(), "\n"; }
+echo gettype($a->foo),"\n";
+
+try {
+ --$_[0];
+} catch (Error $e) { echo $e->getMessage(), "\n"; }
+echo gettype($a->foo),"\n";
+
+$a->foo = PHP_INT_MAX;
+
+try {
+ $_[0]++;
+} catch (Error $e) { echo $e->getMessage(), "\n"; }
+echo gettype($a->foo),"\n";
+
+try {
+ ++$_[0];
+} catch (Error $e) { echo $e->getMessage(), "\n"; }
+echo gettype($a->foo),"\n";
+
+$_[0] = 0;
+try {
+ $_[0] = [];
+} catch (Error $e) { echo $e->getMessage(), "\n"; }
+var_dump($a->foo);
+
+$_[0] = 1;
+var_dump($a->foo);
+
+?>
+--EXPECT--
+int(2)
+int(21)
+Cannot assign string to reference held by property class@anonymous::$foo of type int
+int(21)
+int(20)
+int(19)
+Cannot decrement a reference held by property class@anonymous::$foo of type int past its minimal value
+integer
+Cannot decrement a reference held by property class@anonymous::$foo of type int past its minimal value
+integer
+Cannot increment a reference held by property class@anonymous::$foo of type int past its maximal value
+integer
+Cannot increment a reference held by property class@anonymous::$foo of type int past its maximal value
+integer
+Cannot assign array to reference held by property class@anonymous::$foo of type int
+int(0)
+int(1)
diff --git a/Zend/tests/type_declarations/typed_properties_065.phpt b/Zend/tests/type_declarations/typed_properties_065.phpt
new file mode 100644
index 0000000000..da88cbf2cb
--- /dev/null
+++ b/Zend/tests/type_declarations/typed_properties_065.phpt
@@ -0,0 +1,71 @@
+--TEST--
+Typed property on by-ref array dimension
+--FILE--
+<?php
+
+$a = new class implements ArrayAccess {
+ public int $foo = 1;
+
+ function offsetExists($o) { return 1; }
+ function &offsetGet($o) { return $this->foo; }
+ function offsetSet($o, $v) { print "offsetSet($v)\n"; }
+ function offsetUnset($o) { print "offsetUnset() ?!?"; }
+};
+
+$a[0] += 1;
+var_dump($a->foo);
+
+$a[0] .= "1";
+var_dump($a->foo);
+
+$a[0] .= "e50";
+var_dump($a->foo);
+
+$a[0]--;
+var_dump($a->foo);
+
+--$a[0];
+var_dump($a->foo);
+
+$a->foo = PHP_INT_MIN;
+
+try {
+ $a[0]--;
+} catch (Error $e) { echo $e->getMessage(), "\n"; }
+echo gettype($a->foo),"\n";
+
+try {
+ --$a[0];
+} catch (Error $e) { echo $e->getMessage(), "\n"; }
+echo gettype($a->foo),"\n";
+
+$a->foo = PHP_INT_MAX;
+
+try {
+ $a[0]++;
+} catch (Error $e) { echo $e->getMessage(), "\n"; }
+echo gettype($a->foo),"\n";
+
+try {
+ ++$a[0];
+} catch (Error $e) { echo $e->getMessage(), "\n"; }
+echo gettype($a->foo),"\n";
+
+?>
+--EXPECT--
+offsetSet(2)
+int(1)
+offsetSet(11)
+int(1)
+offsetSet(1e50)
+int(1)
+int(0)
+int(-1)
+Cannot decrement a reference held by property class@anonymous::$foo of type int past its minimal value
+integer
+Cannot decrement a reference held by property class@anonymous::$foo of type int past its minimal value
+integer
+Cannot increment a reference held by property class@anonymous::$foo of type int past its maximal value
+integer
+Cannot increment a reference held by property class@anonymous::$foo of type int past its maximal value
+integer
diff --git a/Zend/tests/type_declarations/typed_properties_066.phpt b/Zend/tests/type_declarations/typed_properties_066.phpt
new file mode 100644
index 0000000000..a91a00df65
--- /dev/null
+++ b/Zend/tests/type_declarations/typed_properties_066.phpt
@@ -0,0 +1,21 @@
+--TEST--
+Typed property assignment must not overwrite constants
+--FILE--
+<?php
+
+class Foo {
+ public float $x = 0.0;
+};
+
+$x = new Foo;
+$y =& $x->x;
+$y = 4;
+var_dump($x, 4); /* Optimizer will merge both "4" constants, making it immediately visible */
+
+?>
+--EXPECT--
+object(Foo)#1 (1) {
+ ["x"]=>
+ &float(4)
+}
+int(4)
diff --git a/Zend/tests/type_declarations/typed_properties_067.phpt b/Zend/tests/type_declarations/typed_properties_067.phpt
new file mode 100644
index 0000000000..da6865e5d4
--- /dev/null
+++ b/Zend/tests/type_declarations/typed_properties_067.phpt
@@ -0,0 +1,36 @@
+--TEST--
+Iterable typed properties must be accepted to by-ref array arguments
+--FILE--
+<?php
+
+$obj = new class {
+ public ?iterable $it = null;
+};
+
+function arr(?array &$arr) {
+ $arr = [1];
+}
+
+arr($obj->it);
+var_dump($obj->it);
+array_shift($obj->it);
+var_dump($obj->it);
+parse_str("foo=bar", $obj->it);
+var_dump($obj->it);
+$obj->it = [];
+var_dump($obj->it);
+
+?>
+--EXPECT--
+array(1) {
+ [0]=>
+ int(1)
+}
+array(0) {
+}
+array(1) {
+ ["foo"]=>
+ string(3) "bar"
+}
+array(0) {
+}
diff --git a/Zend/tests/type_declarations/typed_properties_068.phpt b/Zend/tests/type_declarations/typed_properties_068.phpt
new file mode 100644
index 0000000000..7ed58d2a00
--- /dev/null
+++ b/Zend/tests/type_declarations/typed_properties_068.phpt
@@ -0,0 +1,87 @@
+--TEST--
+Test typed static property by ref
+--FILE--
+<?php
+function &ref($a = null) {
+ static $f;
+ if ($a !== null) $f = function &() use (&$a) { return $a; };
+ return $f();
+}
+
+class Foo {
+ public static int $i;
+ public static string $s = "x";
+}
+
+Foo::$i = &ref(5);
+var_dump(Foo::$i);
+
+$i = &Foo::$i;
+$i = 2;
+var_dump($i, Foo::$i);
+
+$i = "3";
+var_dump($i, Foo::$i);
+
+Foo::$i = "4";
+var_dump($i, Foo::$i);
+
+try {
+ $i = null;
+} catch (TypeError $e) { print $e->getMessage()."\n"; }
+var_dump($i, Foo::$i);
+
+try {
+ Foo::$i = null;
+} catch (TypeError $e) { print $e->getMessage()."\n"; }
+var_dump($i, Foo::$i);
+
+Foo::$s = &ref(5);
+var_dump(Foo::$s, ref());
+
+Foo::$i = &ref("0");
+var_dump(Foo::$i, ref());
+
+try {
+ Foo::$i = &ref("x");
+} catch (TypeError $e) { print $e->getMessage()."\n"; }
+var_dump(Foo::$i, ref());
+
+try {
+ Foo::$i = &Foo::$s;
+} catch (TypeError $e) { print $e->getMessage()."\n"; }
+var_dump(Foo::$i, Foo::$s);
+
+try {
+ Foo::$s = &Foo::$i;
+} catch (TypeError $e) { print $e->getMessage()."\n"; }
+var_dump(Foo::$i, Foo::$s);
+
+?>
+--EXPECT--
+int(5)
+int(2)
+int(2)
+int(3)
+int(3)
+int(4)
+int(4)
+Cannot assign null to reference held by property Foo::$i of type int
+int(4)
+int(4)
+Typed property Foo::$i must be int, null used
+int(4)
+int(4)
+string(1) "5"
+string(1) "5"
+int(0)
+int(0)
+Typed property Foo::$i must be int, string used
+int(0)
+string(1) "x"
+Reference with value of type string held by property Foo::$s of type string is not compatible with property Foo::$i of type int
+int(0)
+string(1) "5"
+Reference with value of type int held by property Foo::$i of type int is not compatible with property Foo::$s of type string
+int(0)
+string(1) "5"
diff --git a/Zend/tests/type_declarations/typed_properties_069.phpt b/Zend/tests/type_declarations/typed_properties_069.phpt
new file mode 100644
index 0000000000..77cfc02487
--- /dev/null
+++ b/Zend/tests/type_declarations/typed_properties_069.phpt
@@ -0,0 +1,27 @@
+--TEST--
+Test assign of invalid string to typed static int property
+--FILE--
+<?php
+
+function &nonNumericStringRef() {
+ static $a = "x";
+ return $a;
+}
+
+class Foo {
+ public static int $i;
+}
+
+try {
+ Foo::$i = &nonNumericStringRef();
+} catch (TypeError $e) { print $e->getMessage()."\n"; }
+try {
+ var_dump(Foo::$i);
+} catch (Error $e) { print $e->getMessage()."\n"; }
+var_dump(nonNumericStringRef());
+
+?>
+--EXPECT--
+Typed property Foo::$i must be int, string used
+Typed static property Foo::$i must not be accessed before initialization
+string(1) "x"
diff --git a/Zend/tests/type_declarations/typed_properties_070.phpt b/Zend/tests/type_declarations/typed_properties_070.phpt
new file mode 100644
index 0000000000..dd77c68355
--- /dev/null
+++ b/Zend/tests/type_declarations/typed_properties_070.phpt
@@ -0,0 +1,49 @@
+--TEST--
+Test typed static property with assign op operators
+--FILE--
+<?php
+function &stringRef() {
+ static $a = "1";
+ $b = $a;
+ $a = &$b;
+ return $a;
+}
+
+class Foo {
+ public static int $i = 0;
+ public static string $s = "1";
+}
+
+Foo::$s .= "1";
+var_dump(Foo::$s);
+
+Foo::$s += 2;
+var_dump(Foo::$s);
+
+Foo::$s = &stringRef();
+Foo::$s .= 2;
+var_dump(Foo::$s);
+
+Foo::$i += stringRef();
+var_dump(Foo::$i);
+
+try {
+ Foo::$i += PHP_INT_MAX;
+} catch (TypeError $e) { print $e->getMessage()."\n"; }
+var_dump(Foo::$i);
+
+try {
+ Foo::$i .= PHP_INT_MAX;
+} catch (TypeError $e) { print $e->getMessage()."\n"; }
+var_dump(Foo::$i);
+
+?>
+--EXPECT--
+string(2) "11"
+string(2) "13"
+string(2) "12"
+int(1)
+Typed property Foo::$i must be int, float used
+int(1)
+Typed property Foo::$i must be int, string used
+int(1)
diff --git a/Zend/tests/type_declarations/typed_properties_071.phpt b/Zend/tests/type_declarations/typed_properties_071.phpt
new file mode 100644
index 0000000000..4d0451cf73
--- /dev/null
+++ b/Zend/tests/type_declarations/typed_properties_071.phpt
@@ -0,0 +1,36 @@
+--TEST--
+Test assignment to typed reference with weak type conversion
+--FILE--
+<?php
+
+class Test {
+ public string $x = "x";
+}
+
+$test = new Test;
+var_dump($test);
+$y = "y";
+$test->x = &$y;
+var_dump($y, $test);
+
+$z = 42;
+$y = $z;
+var_dump($y, $z, $test);
+
+?>
+--EXPECT--
+object(Test)#1 (1) {
+ ["x"]=>
+ string(1) "x"
+}
+string(1) "y"
+object(Test)#1 (1) {
+ ["x"]=>
+ &string(1) "y"
+}
+string(2) "42"
+int(42)
+object(Test)#1 (1) {
+ ["x"]=>
+ &string(2) "42"
+}
diff --git a/Zend/tests/type_declarations/typed_properties_072.phpt b/Zend/tests/type_declarations/typed_properties_072.phpt
new file mode 100644
index 0000000000..13fab7177e
--- /dev/null
+++ b/Zend/tests/type_declarations/typed_properties_072.phpt
@@ -0,0 +1,25 @@
+--TEST--
+Typed property must cast when used with __get()
+--FILE--
+<?php
+
+class Test {
+ public int $val;
+
+ public function __get($name) {
+ return "42";
+ }
+}
+
+$test = new Test;
+unset($test->val);
+var_dump($test);
+var_dump($test->val);
+
+?>
+--EXPECT--
+object(Test)#1 (0) {
+ ["val"]=>
+ uninitialized(int)
+}
+int(42)
diff --git a/Zend/tests/type_declarations/typed_properties_073.phpt b/Zend/tests/type_declarations/typed_properties_073.phpt
new file mode 100644
index 0000000000..43cb0f507b
--- /dev/null
+++ b/Zend/tests/type_declarations/typed_properties_073.phpt
@@ -0,0 +1,45 @@
+--TEST--
+Typed property must cast when used with &__get()
+--FILE--
+<?php
+
+class Test {
+ public $prop = "42";
+ public int $val;
+
+ public function &__get($name) {
+ return $this->prop;
+ }
+}
+
+$test = new Test;
+unset($test->val);
+var_dump($test);
+var_dump($val = &$test->val);
+var_dump($test);
+
+$test->prop = "x";
+var_dump($test, $val);
+
+?>
+--EXPECT--
+object(Test)#1 (1) {
+ ["prop"]=>
+ string(2) "42"
+ ["val"]=>
+ uninitialized(int)
+}
+int(42)
+object(Test)#1 (1) {
+ ["prop"]=>
+ &int(42)
+ ["val"]=>
+ uninitialized(int)
+}
+object(Test)#1 (1) {
+ ["prop"]=>
+ &string(1) "x"
+ ["val"]=>
+ uninitialized(int)
+}
+string(1) "x"
diff --git a/Zend/tests/type_declarations/typed_properties_074.phpt b/Zend/tests/type_declarations/typed_properties_074.phpt
new file mode 100644
index 0000000000..dd2fb5f521
--- /dev/null
+++ b/Zend/tests/type_declarations/typed_properties_074.phpt
@@ -0,0 +1,42 @@
+--TEST--
+Typed property must be compatible when returned via &__get()
+--FILE--
+<?php
+
+class Test {
+ public $prop = "x";
+ public int $val;
+
+ public function &__get($name) {
+ return $this->prop;
+ }
+}
+
+$test = new Test;
+$dummyRef = &$test->prop;
+unset($test->val);
+var_dump($test);
+try {
+ var_dump($test->val);
+} catch (TypeError $e) { print $e->getMessage()."\n"; }
+var_dump($test);
+
+$test->prop = "y";
+var_dump($test->prop);
+
+?>
+--EXPECT--
+object(Test)#1 (1) {
+ ["prop"]=>
+ &string(1) "x"
+ ["val"]=>
+ uninitialized(int)
+}
+Typed property Test::$val must be int, string used
+object(Test)#1 (1) {
+ ["prop"]=>
+ &string(1) "x"
+ ["val"]=>
+ uninitialized(int)
+}
+string(1) "y"
diff --git a/Zend/tests/type_declarations/typed_properties_075.phpt b/Zend/tests/type_declarations/typed_properties_075.phpt
new file mode 100644
index 0000000000..5f3943cbee
--- /dev/null
+++ b/Zend/tests/type_declarations/typed_properties_075.phpt
@@ -0,0 +1,53 @@
+--TEST--
+Test typed properties overflowing
+--SKIPIF--
+<?php if (PHP_INT_SIZE == 4) die("SKIP: 64 bit test"); ?>
+--FILE--
+<?php
+
+class Foo {
+ public static int $bar = PHP_INT_MAX;
+};
+
+try {
+ Foo::$bar++;
+} catch(TypeError $t) {
+ var_dump($t->getMessage());
+}
+
+var_dump(Foo::$bar);
+
+try {
+ Foo::$bar += 1;
+} catch(TypeError $t) {
+ var_dump($t->getMessage());
+}
+
+var_dump(Foo::$bar);
+
+try {
+ ++Foo::$bar;
+} catch(TypeError $t) {
+ var_dump($t->getMessage());
+}
+
+var_dump(Foo::$bar);
+
+try {
+ Foo::$bar = Foo::$bar + 1;
+} catch(TypeError $t) {
+ var_dump($t->getMessage());
+}
+
+var_dump(Foo::$bar);
+
+?>
+--EXPECT--
+string(70) "Cannot increment property Foo::$bar of type int past its maximal value"
+int(9223372036854775807)
+string(48) "Typed property Foo::$bar must be int, float used"
+int(9223372036854775807)
+string(70) "Cannot increment property Foo::$bar of type int past its maximal value"
+int(9223372036854775807)
+string(48) "Typed property Foo::$bar must be int, float used"
+int(9223372036854775807)
diff --git a/Zend/tests/type_declarations/typed_properties_076.phpt b/Zend/tests/type_declarations/typed_properties_076.phpt
new file mode 100644
index 0000000000..b0d0bfedf8
--- /dev/null
+++ b/Zend/tests/type_declarations/typed_properties_076.phpt
@@ -0,0 +1,71 @@
+--TEST--
+Computation of intersection types for typed reference to typed property assignments
+--FILE--
+<?php
+
+class A {}
+class B extends A {}
+
+class Test {
+ public int $int;
+ public float $float;
+ public ?int $nint;
+ public ?string $nstring;
+ public array $array;
+ public object $object;
+ public iterable $iterable;
+ public Iterator $Iterator;
+ public A $A;
+ public B $B;
+}
+
+function invalid(Test $test, string $prop1, string $prop2, $value) {
+ try {
+ $test->$prop2 = $value;
+ $test->$prop1 =& $test->$prop2;
+ echo "Invalid assignment $prop1 =& $prop2 did not error\n";
+ } catch (TypeError $e) {}
+ try {
+ $test->$prop1 = $value;
+ $test->$prop2 =& $test->$prop1;
+ echo "Invalid assignment $prop2 =& $prop1 did not error\n";
+ } catch (TypeError $e) {}
+}
+
+function valid(Test $test, string $prop1, string $prop2, $value) {
+ try {
+ $test->$prop2 = $value;
+ $test->$prop1 =& $test->$prop2;
+ } catch (TypeError $e) {
+ echo "Valid assignment $prop1 =& $prop2 threw {$e->getMessage()}\n";
+ }
+ try {
+ $test->$prop1 = $value;
+ $test->$prop2 =& $test->$prop1;
+ } catch (TypeError $e) {
+ echo "Valid assignment $prop2 =& $prop1 threw {$e->getMessage()}\n";
+ }
+}
+
+$test = new Test;
+invalid($test, 'int', 'float', 42.0);
+valid($test, 'int', 'nint', 42);
+invalid($test, 'int', 'nint', null);
+valid($test, 'nint', 'nstring', null);
+invalid($test, 'nint', 'nstring', '42');
+valid($test, 'A', 'A', new A);
+valid($test, 'A', 'B', new B);
+invalid($test, 'A', 'B', new A);
+valid($test, 'iterable', 'array', [1, 2, 3]);
+valid($test, 'A', 'object', new A);
+invalid($test, 'A', 'object', new Test);
+valid($test, 'iterable', 'Iterator', new ArrayIterator);
+invalid($test, 'Iterator', 'iterable', [1, 2, 3]);
+valid($test, 'object', 'iterable', new ArrayIterator);
+invalid($test, 'iterable', 'object', new stdClass);
+
+echo "Done\n";
+
+?>
+--EXPECT--
+Done
diff --git a/Zend/tests/type_declarations/typed_properties_077.phpt b/Zend/tests/type_declarations/typed_properties_077.phpt
new file mode 100644
index 0000000000..4e2640338f
--- /dev/null
+++ b/Zend/tests/type_declarations/typed_properties_077.phpt
@@ -0,0 +1,18 @@
+--TEST--
+Converted values shall be returned and not the original value upon property assignment
+--FILE--
+<?php
+
+class Test {
+ public int $i;
+ public string $s;
+}
+
+$test = new Test;
+var_dump($test->i = "42");
+var_dump($test->s = 42);
+
+?>
+--EXPECT--
+int(42)
+string(2) "42"
diff --git a/Zend/tests/type_declarations/typed_properties_078.phpt b/Zend/tests/type_declarations/typed_properties_078.phpt
new file mode 100644
index 0000000000..6645970dd4
--- /dev/null
+++ b/Zend/tests/type_declarations/typed_properties_078.phpt
@@ -0,0 +1,59 @@
+--TEST--
+Typed references must be kept track of and always be only the intersection of the types currently holding that reference
+--FILE--
+<?php
+
+$a = new class {
+ public ?iterable $it = [];
+ public ?array $a;
+ public ?Traversable $t;
+};
+
+$ref = &$a->it;
+$a->a = &$ref;
+
+var_dump($ref);
+
+try {
+ $a->t = &$ref;
+} catch (TypeError $e) { var_dump($e->getMessage()); }
+var_dump($ref);
+
+$a->it = [1]; // type is still assignable
+var_dump($ref);
+
+try {
+ $ref = new ArrayIterator();
+} catch (TypeError $e) { var_dump($e->getMessage()); }
+var_dump($ref instanceof ArrayIterator);
+
+unset($a->a);
+
+$ref = null;
+
+$a->t = &$ref;
+
+try {
+ $ref = [];
+} catch (TypeError $e) { var_dump($e->getMessage()); }
+var_dump($ref instanceof ArrayIterator);
+
+$ref = new ArrayIterator();
+var_dump($ref instanceof ArrayIterator);
+
+?>
+--EXPECT--
+array(0) {
+}
+string(89) "Typed property class@anonymous::$t must be an instance of Traversable or null, array used"
+array(0) {
+}
+array(1) {
+ [0]=>
+ int(1)
+}
+string(92) "Cannot assign ArrayIterator to reference held by property class@anonymous::$a of type ?array"
+bool(false)
+string(90) "Cannot assign array to reference held by property class@anonymous::$t of type ?Traversable"
+bool(false)
+bool(true)
diff --git a/Zend/tests/type_declarations/typed_properties_079.phpt b/Zend/tests/type_declarations/typed_properties_079.phpt
new file mode 100644
index 0000000000..85ed6fc75d
--- /dev/null
+++ b/Zend/tests/type_declarations/typed_properties_079.phpt
@@ -0,0 +1,33 @@
+--TEST--
+Test static typed properties with references
+--FILE--
+<?php
+
+class A {
+ static iterable $it = [];
+ static ?array $a;
+}
+
+A::$a = &A::$it;
+
+try {
+ A::$it = new ArrayIterator();
+} catch (TypeError $e) { var_dump($e->getMessage()); }
+var_dump(A::$it);
+
+A::$a = &$a;
+
+A::$it = new ArrayIterator();
+
+try {
+ $a = 1;
+} catch (TypeError $e) { var_dump($e->getMessage()); }
+var_dump($a);
+
+?>
+--EXPECT--
+string(78) "Cannot assign ArrayIterator to reference held by property A::$a of type ?array"
+array(0) {
+}
+string(68) "Cannot assign int to reference held by property A::$a of type ?array"
+NULL
diff --git a/Zend/tests/type_declarations/typed_properties_080.phpt b/Zend/tests/type_declarations/typed_properties_080.phpt
new file mode 100644
index 0000000000..58a17a1a96
--- /dev/null
+++ b/Zend/tests/type_declarations/typed_properties_080.phpt
@@ -0,0 +1,36 @@
+--TEST--
+Access to typed static properties before initialization
+--FILE--
+<?php
+
+class Test {
+ public static int $a;
+ protected static int $b;
+ private static int $c;
+
+ static function run() {
+ try {
+ self::$a;
+ } catch (Error $e) {
+ echo $e->getMessage(), "\n";
+ }
+ try {
+ self::$b;
+ } catch (Error $e) {
+ echo $e->getMessage(), "\n";
+ }
+ try {
+ self::$c;
+ } catch (Error $e) {
+ echo $e->getMessage(), "\n";
+ }
+ }
+}
+
+Test::run();
+
+?>
+--EXPECT--
+Typed static property Test::$a must not be accessed before initialization
+Typed static property Test::$b must not be accessed before initialization
+Typed static property Test::$c must not be accessed before initialization
diff --git a/Zend/tests/type_declarations/typed_properties_081.phpt b/Zend/tests/type_declarations/typed_properties_081.phpt
new file mode 100644
index 0000000000..4f49eae4e7
--- /dev/null
+++ b/Zend/tests/type_declarations/typed_properties_081.phpt
@@ -0,0 +1,22 @@
+--TEST--
+Clone must inherit typed references
+--FILE--
+<?php
+
+class Test {
+ public int $x = 42;
+}
+
+$test = new Test;
+$x =& $test->x;
+$test2 = clone $test;
+unset($test);
+try {
+ $x = "foo";
+} catch (TypeError $e) { echo $e->getMessage(), "\n"; }
+var_dump($test2->x);
+
+?>
+--EXPECT--
+Cannot assign string to reference held by property Test::$x of type int
+int(42)
diff --git a/Zend/tests/type_declarations/typed_properties_082.phpt b/Zend/tests/type_declarations/typed_properties_082.phpt
new file mode 100644
index 0000000000..1e4e62e89b
--- /dev/null
+++ b/Zend/tests/type_declarations/typed_properties_082.phpt
@@ -0,0 +1,30 @@
+--TEST--
+Test typed references to static properties
+--FILE--
+<?php
+
+class Test {
+ public static int $x = 0;
+}
+
+class Test2 extends Test {
+ public static $y = 1;
+}
+
+$x =& Test::$x;
+try {
+ $x = "foo";
+} catch (TypeError $e) { echo $e->getMessage(), "\n"; }
+var_dump($x, Test::$x);
+
+Test::$x =& Test2::$y; // remove the typed ref from $x
+$x = "foo";
+var_dump($x, Test::$x);
+
+?>
+--EXPECT--
+Cannot assign string to reference held by property Test::$x of type int
+int(0)
+int(0)
+string(3) "foo"
+int(1)
diff --git a/Zend/tests/type_declarations/typed_properties_083.phpt b/Zend/tests/type_declarations/typed_properties_083.phpt
new file mode 100644
index 0000000000..f67eec302a
--- /dev/null
+++ b/Zend/tests/type_declarations/typed_properties_083.phpt
@@ -0,0 +1,80 @@
+--TEST--
+Test array promotion does not violate type restrictions
+--FILE--
+<?php
+
+class Foo {
+ public ?string $p;
+ public ?iterable $i;
+ public static ?string $s;
+ public static ?array $a;
+}
+
+$a = new Foo;
+
+$a->i[] = 1;
+var_dump($a->i);
+
+try {
+ $a->p[] = "test";
+} catch (TypeError $e) { var_dump($e->getMessage()); }
+try { // must be uninit
+ var_dump($a->p); // WRONG!
+} catch (Error $e) { var_dump($e->getMessage()); }
+
+$a->p = null;
+try {
+ $a->p[] = "test";
+} catch (TypeError $e) { var_dump($e->getMessage()); }
+var_dump($a->p);
+
+Foo::$a["bar"] = 2;
+var_dump(Foo::$a);
+
+try {
+ Foo::$s["baz"][] = "baz";
+} catch (TypeError $e) { var_dump($e->getMessage()); }
+try { // must be uninit
+ var_dump(Foo::$s);
+} catch (Error $e) { var_dump($e->getMessage()); }
+
+Foo::$a = null;
+$ref = &Foo::$a;
+$ref[] = 3;
+var_dump($ref);
+
+$ref = &$a->p;
+try {
+ $ref[] = "bar";
+} catch (TypeError $e) { var_dump($e->getMessage()); }
+var_dump($ref);
+
+try {
+ $ref["baz"][] = "bar"; // indirect assign
+} catch (TypeError $e) { var_dump($e->getMessage()); }
+var_dump($ref);
+
+?>
+--EXPECT--
+array(1) {
+ [0]=>
+ int(1)
+}
+string(71) "Cannot auto-initialize an array inside property Foo::$p of type ?string"
+string(65) "Typed property Foo::$p must not be accessed before initialization"
+string(71) "Cannot auto-initialize an array inside property Foo::$p of type ?string"
+NULL
+array(1) {
+ ["bar"]=>
+ int(2)
+}
+string(71) "Cannot auto-initialize an array inside property Foo::$s of type ?string"
+string(72) "Typed static property Foo::$s must not be accessed before initialization"
+array(1) {
+ [0]=>
+ int(3)
+}
+string(91) "Cannot auto-initialize an array inside a reference held by property Foo::$p of type ?string"
+NULL
+string(91) "Cannot auto-initialize an array inside a reference held by property Foo::$p of type ?string"
+NULL
diff --git a/Zend/tests/type_declarations/typed_properties_084.phpt b/Zend/tests/type_declarations/typed_properties_084.phpt
new file mode 100644
index 0000000000..fb3c86115e
--- /dev/null
+++ b/Zend/tests/type_declarations/typed_properties_084.phpt
@@ -0,0 +1,25 @@
+--TEST--
+Typed properties and class aliases
+--FILE--
+<?php
+eval(<<<'PHP'
+class Foo {}
+class_alias('Foo', 'Bar');
+PHP);
+
+eval(<<<'PHP'
+class A {
+ public Foo $prop;
+}
+PHP);
+
+eval(<<<'PHP'
+class B extends A {
+ public Bar $prop;
+}
+PHP);
+
+?>
+===DONE===
+--EXPECT--
+===DONE===
diff --git a/Zend/tests/type_declarations/typed_properties_085.phpt b/Zend/tests/type_declarations/typed_properties_085.phpt
new file mode 100644
index 0000000000..ccac3768cb
--- /dev/null
+++ b/Zend/tests/type_declarations/typed_properties_085.phpt
@@ -0,0 +1,17 @@
+--TEST--
+Important properties with different types from traits
+--FILE--
+<?php
+
+trait T1 {
+ public int $prop;
+}
+trait T2 {
+ public string $prop;
+}
+class C {
+ use T1, T2;
+}
+?>
+--EXPECTF--
+Fatal error: T1 and T2 define the same property ($prop) in the composition of C. However, the definition differs and is considered incompatible. Class was composed in %s on line %d
diff --git a/Zend/tests/type_declarations/typed_properties_086.phpt b/Zend/tests/type_declarations/typed_properties_086.phpt
new file mode 100644
index 0000000000..c58eb7898e
--- /dev/null
+++ b/Zend/tests/type_declarations/typed_properties_086.phpt
@@ -0,0 +1,27 @@
+--TEST--
+Test typed properties with integer keys
+--FILE--
+<?php
+
+class T {
+ // Class must have at least one property. Property must have a type.
+ // Empty class or untyped property removes segfault
+ public int $i;
+}
+
+$t = new T;
+// $x must be undefined or a non-string type
+$x = 1;
+$t->$x = 2;
+$t->$x--;
+
+var_dump($t);
+
+?>
+--EXPECT--
+object(T)#1 (1) {
+ ["i"]=>
+ uninitialized(int)
+ ["1"]=>
+ int(1)
+}
diff --git a/Zend/tests/type_declarations/typed_properties_087.phpt b/Zend/tests/type_declarations/typed_properties_087.phpt
new file mode 100644
index 0000000000..b981dfc166
--- /dev/null
+++ b/Zend/tests/type_declarations/typed_properties_087.phpt
@@ -0,0 +1,15 @@
+--TEST--
+Ensure null-initialization of nullable typed static property taken by reference
+--FILE--
+<?php
+
+class A {
+ public static ?int $a;
+}
+
+$x =& A::$a;
+var_dump($x);
+
+?>
+--EXPECT--
+NULL
diff --git a/Zend/tests/type_declarations/typed_properties_088.phpt b/Zend/tests/type_declarations/typed_properties_088.phpt
new file mode 100644
index 0000000000..b2f626d3da
--- /dev/null
+++ b/Zend/tests/type_declarations/typed_properties_088.phpt
@@ -0,0 +1,30 @@
+--TEST--
+Check for correct invalidation of prop_info cache slots
+--FILE--
+<?php
+
+class A {
+ public int $prop;
+}
+class B {
+ public $prop;
+}
+
+function test($obj) {
+ $obj->prop = "42";
+ var_dump($obj);
+}
+
+test(new A);
+test(new B);
+
+?>
+--EXPECT--
+object(A)#1 (1) {
+ ["prop"]=>
+ int(42)
+}
+object(B)#1 (1) {
+ ["prop"]=>
+ string(2) "42"
+}
diff --git a/Zend/tests/type_declarations/typed_properties_089.phpt b/Zend/tests/type_declarations/typed_properties_089.phpt
new file mode 100644
index 0000000000..1d59b8d945
--- /dev/null
+++ b/Zend/tests/type_declarations/typed_properties_089.phpt
@@ -0,0 +1,38 @@
+--TEST--
+Modification of typed property during assignment must not leak
+--FILE--
+<?php
+
+class A {
+ public string $prop = "";
+}
+
+class B {
+ public function __toString() {
+ global $a;
+ $a->prop = "dont ";
+ $a->prop .= "leak ";
+ $a->prop .= "me!";
+ return "test";
+ }
+}
+
+$a = new A;
+$a->prop = new B;
+var_dump($a);
+
+$a = new A;
+$prop = &$a->prop;
+$a->prop = new B;
+var_dump($a);
+
+?>
+--EXPECTF--
+object(A)#1 (1) {
+ ["prop"]=>
+ string(4) "test"
+}
+object(A)#%d (1) {
+ ["prop"]=>
+ &string(4) "test"
+}
diff --git a/Zend/tests/type_declarations/typed_properties_090.phpt b/Zend/tests/type_declarations/typed_properties_090.phpt
new file mode 100644
index 0000000000..3b75aaa843
--- /dev/null
+++ b/Zend/tests/type_declarations/typed_properties_090.phpt
@@ -0,0 +1,25 @@
+--TEST--
+Unsetting typed properties containing a reference must respect shadowing
+--FILE--
+<?php
+
+class A {
+ private int $prop = 42;
+
+ public function test() {
+ $x =& $this->prop;
+ unset($this->prop);
+ $x = "foo";
+ var_dump($x);
+ }
+}
+class B extends A {
+ private $prop;
+}
+
+$b = new B;
+$b->test();
+
+?>
+--EXPECT--
+string(3) "foo"
diff --git a/Zend/tests/type_declarations/typed_properties_091.phpt b/Zend/tests/type_declarations/typed_properties_091.phpt
new file mode 100644
index 0000000000..2083086086
--- /dev/null
+++ b/Zend/tests/type_declarations/typed_properties_091.phpt
@@ -0,0 +1,203 @@
+--TEST--
+Automatic promotion of falsy to object
+--FILE--
+<?php
+
+class Test {
+ public ?Test $prop;
+ public ?stdClass $stdProp;
+ public ?object $objectProp;
+
+ public static ?Test $staticProp = null;
+ public static ?stdClass $staticStdProp = null;
+ public static ?object $staticObjectProp = null;
+}
+
+// Object properties
+$test = new Test;
+try {
+ $test->prop->wat = 123;
+} catch (TypeError $e) {
+ echo $e->getMessage(), "\n";
+}
+$test->stdProp->wat = 123;
+$test->objectProp->wat = 123;
+var_dump($test);
+
+// Object properties via reference
+$test = new Test;
+$prop =& $test->prop;
+$stdProp =& $test->stdProp;
+$objectProp =& $test->objectProp;
+try {
+ $prop->wat = 123;
+} catch (TypeError $e) {
+ echo $e->getMessage(), "\n";
+}
+$stdProp->wat = 123;
+$objectProp->wat = 123;
+var_dump($test);
+
+// Object properties via reference rw
+$test = new Test;
+$prop =& $test->prop;
+$stdProp =& $test->stdProp;
+$objectProp =& $test->objectProp;
+try {
+ $prop->wat->wat = 123;
+} catch (TypeError $e) {
+ echo $e->getMessage(), "\n";
+}
+$stdProp->wat->wat = 123;
+$objectProp->wat->wat = 123;
+var_dump($test);
+
+// Static properties
+try {
+ Test::$staticProp->wat = 123;
+} catch (TypeError $e) {
+ echo $e->getMessage(), "\n";
+}
+Test::$staticStdProp->wat = 123;
+Test::$staticObjectProp->wat = 123;
+var_dump(Test::$staticProp, Test::$staticStdProp, Test::$staticObjectProp);
+
+// Non-string property name
+$test = new Test;
+$propName = new class {
+ public function __toString() {
+ return 'prop';
+ }
+};
+try {
+ $test->$propName->wat = 123;
+} catch (TypeError $e) {
+ echo $e->getMessage(), "\n";
+}
+var_dump($test);
+
+// Initially null
+$test = new Test;
+$test->prop = NULL;
+$test->stdProp = NULL;
+$test->objectProp = NULL;
+try {
+ $test->prop->wat = 123;
+} catch (TypeError $e) {
+ echo $e->getMessage(), "\n";
+}
+$test->stdProp->wat = 123;
+$test->objectProp->wat = 123;
+var_dump($test);
+
+?>
+--EXPECTF--
+Cannot auto-initialize an stdClass inside property Test::$prop of type ?Test
+
+Warning: Creating default object from empty value in %s on line %d
+
+Warning: Creating default object from empty value in %s on line %d
+object(Test)#1 (2) {
+ ["prop"]=>
+ uninitialized(?Test)
+ ["stdProp"]=>
+ object(stdClass)#3 (1) {
+ ["wat"]=>
+ int(123)
+ }
+ ["objectProp"]=>
+ object(stdClass)#4 (1) {
+ ["wat"]=>
+ int(123)
+ }
+}
+Cannot auto-initialize an stdClass inside a reference held by property Test::$prop of type ?Test
+
+Warning: Creating default object from empty value in %s on line %d
+
+Warning: Creating default object from empty value in %s on line %d
+object(Test)#5 (3) {
+ ["prop"]=>
+ &NULL
+ ["stdProp"]=>
+ &object(stdClass)#2 (1) {
+ ["wat"]=>
+ int(123)
+ }
+ ["objectProp"]=>
+ &object(stdClass)#4 (1) {
+ ["wat"]=>
+ int(123)
+ }
+}
+Cannot auto-initialize an stdClass inside a reference held by property Test::$prop of type ?Test
+
+Warning: Creating default object from empty value in %s on line %d
+
+Warning: Creating default object from empty value in %s on line %d
+
+Warning: Creating default object from empty value in %s on line %d
+
+Warning: Creating default object from empty value in %s on line %d
+object(Test)#3 (3) {
+ ["prop"]=>
+ &NULL
+ ["stdProp"]=>
+ &object(stdClass)#1 (1) {
+ ["wat"]=>
+ object(stdClass)#2 (1) {
+ ["wat"]=>
+ int(123)
+ }
+ }
+ ["objectProp"]=>
+ &object(stdClass)#5 (1) {
+ ["wat"]=>
+ object(stdClass)#6 (1) {
+ ["wat"]=>
+ int(123)
+ }
+ }
+}
+Cannot auto-initialize an stdClass inside property Test::$staticProp of type ?Test
+
+Warning: Creating default object from empty value in %s on line %d
+
+Warning: Creating default object from empty value in %s on line %d
+NULL
+object(stdClass)#4 (1) {
+ ["wat"]=>
+ int(123)
+}
+object(stdClass)#8 (1) {
+ ["wat"]=>
+ int(123)
+}
+Cannot auto-initialize an stdClass inside property Test::$prop of type ?Test
+object(Test)#9 (0) {
+ ["prop"]=>
+ uninitialized(?Test)
+ ["stdProp"]=>
+ uninitialized(?stdClass)
+ ["objectProp"]=>
+ uninitialized(?object)
+}
+Cannot auto-initialize an stdClass inside property Test::$prop of type ?Test
+
+Warning: Creating default object from empty value in %s on line %d
+
+Warning: Creating default object from empty value in %s on line %d
+object(Test)#7 (3) {
+ ["prop"]=>
+ NULL
+ ["stdProp"]=>
+ object(stdClass)#10 (1) {
+ ["wat"]=>
+ int(123)
+ }
+ ["objectProp"]=>
+ object(stdClass)#11 (1) {
+ ["wat"]=>
+ int(123)
+ }
+}
diff --git a/Zend/tests/type_declarations/typed_properties_092.phpt b/Zend/tests/type_declarations/typed_properties_092.phpt
new file mode 100644
index 0000000000..8509fa7446
--- /dev/null
+++ b/Zend/tests/type_declarations/typed_properties_092.phpt
@@ -0,0 +1,41 @@
+--TEST--
+Refs on ASSIGN_OBJ fast-path
+--FILE--
+<?php
+
+function &ref(&$foo) {
+ return $foo;
+}
+
+class Test {
+ public array $prop;
+ public int $prop2;
+
+ public function foo() {
+ $array = [];
+ $ref =& $array;
+ $this->prop = $array;
+ }
+
+ public function bar() {
+ $str = "123";
+ $this->prop2 = ref($str);
+ }
+}
+
+$test = new Test;
+$test->foo();
+$test->foo();
+$test->bar();
+$test->bar();
+var_dump($test);
+
+?>
+--EXPECT--
+object(Test)#1 (2) {
+ ["prop"]=>
+ array(0) {
+ }
+ ["prop2"]=>
+ int(123)
+}
diff --git a/Zend/tests/type_declarations/typed_properties_093.phpt b/Zend/tests/type_declarations/typed_properties_093.phpt
new file mode 100644
index 0000000000..f0c7ef51a9
--- /dev/null
+++ b/Zend/tests/type_declarations/typed_properties_093.phpt
@@ -0,0 +1,31 @@
+--TEST--
+Typed property assignment by ref with variable name
+--FILE--
+<?php
+
+class Test {
+ public int $prop;
+}
+
+$name = new class {
+ public function __toString() {
+ return 'prop';
+ }
+};
+
+$test = new Test;
+$ref = "foobar";
+try {
+ $test->$name =& $ref;
+} catch (TypeError $e) {
+ echo $e->getMessage(), "\n";
+}
+var_dump($test);
+
+?>
+--EXPECT--
+Typed property Test::$prop must be int, string used
+object(Test)#2 (0) {
+ ["prop"]=>
+ uninitialized(int)
+}
diff --git a/Zend/tests/type_declarations/typed_properties_094.phpt b/Zend/tests/type_declarations/typed_properties_094.phpt
new file mode 100644
index 0000000000..0fbcb7ef55
--- /dev/null
+++ b/Zend/tests/type_declarations/typed_properties_094.phpt
@@ -0,0 +1,36 @@
+--TEST--
+Edge cases relating to reference source tracking
+--FILE--
+<?php
+
+class A {
+ public int $prop = 42;
+}
+class B extends A {
+}
+
+$b = new B;
+$r =& $b->prop;
+unset($b);
+$r = "foo"; // ok
+
+class A2 {
+ private int $prop = 42;
+
+ public function &getRef() {
+ return $this->prop;
+ }
+}
+class B2 extends A2 {
+ public $prop;
+}
+
+$b2 = new B2;
+$r2 =& $b2->getRef();
+unset($b2);
+$r2 = "foo"; // ok
+
+?>
+===DONE===
+--EXPECT--
+===DONE===
diff --git a/Zend/tests/type_declarations/typed_properties_095.phpt b/Zend/tests/type_declarations/typed_properties_095.phpt
new file mode 100644
index 0000000000..edbef8dfc7
--- /dev/null
+++ b/Zend/tests/type_declarations/typed_properties_095.phpt
@@ -0,0 +1,84 @@
+--TEST--
+Typed properties in internal classes
+--SKIPIF--
+<?php if (!extension_loaded('zend-test')) die('skip requires zend-test'); ?>
+--FILE--
+<?php
+
+// Internal typed properties
+
+$obj = new _ZendTestClass;
+var_dump($obj->intProp);
+try {
+ $obj->intProp = "foobar";
+} catch (TypeError $e) {
+ echo $e->getMessage(), "\n";
+}
+$obj->intProp = 456;
+
+try {
+ $obj->classProp = $obj;
+} catch (TypeError $e) {
+ echo $e->getMessage(), "\n";
+}
+$obj->classProp = new stdClass;
+var_dump($obj);
+
+// Inherit from internal class
+
+class Test extends _ZendTestClass {
+}
+
+$obj = new Test;
+var_dump($obj->intProp);
+try {
+ $obj->intProp = "foobar";
+} catch (TypeError $e) {
+ echo $e->getMessage(), "\n";
+}
+$obj->intProp = 456;
+
+try {
+ $obj->classProp = $obj;
+} catch (TypeError $e) {
+ echo $e->getMessage(), "\n";
+}
+$obj->classProp = new stdClass;
+var_dump($obj);
+
+// Static internal typed properties
+
+var_dump(_ZendTestClass::$staticIntProp);
+try {
+ _ZendTestClass::$staticIntProp = "foobar";
+} catch (TypeError $e) {
+ echo $e->getMessage(), "\n";
+}
+_ZendTestClass::$staticIntProp = 456;
+var_dump(_ZendTestClass::$staticIntProp);
+
+?>
+--EXPECT--
+int(123)
+Typed property _ZendTestClass::$intProp must be int, string used
+Typed property _ZendTestClass::$classProp must be an instance of stdClass or null, _ZendTestClass used
+object(_ZendTestClass)#1 (2) {
+ ["intProp"]=>
+ int(456)
+ ["classProp"]=>
+ object(stdClass)#2 (0) {
+ }
+}
+int(123)
+Typed property _ZendTestClass::$intProp must be int, string used
+Typed property _ZendTestClass::$classProp must be an instance of stdClass or null, Test used
+object(Test)#4 (2) {
+ ["intProp"]=>
+ int(456)
+ ["classProp"]=>
+ object(stdClass)#1 (0) {
+ }
+}
+int(123)
+Typed property _ZendTestClass::$staticIntProp must be int, string used
+int(456)
diff --git a/Zend/tests/type_declarations/typed_properties_096.phpt b/Zend/tests/type_declarations/typed_properties_096.phpt
new file mode 100644
index 0000000000..32191b241e
--- /dev/null
+++ b/Zend/tests/type_declarations/typed_properties_096.phpt
@@ -0,0 +1,46 @@
+--TEST--
+References to typed properties with undefined classes
+--FILE--
+<?php
+
+class Test1 {
+ public Foobar $prop;
+ public int $prop2;
+}
+
+$test = new Test1;
+$test->prop2 = 123;
+$ref =& $test->prop2;
+try {
+ $test->prop =& $ref;
+} catch (Error $e) {
+ echo $e->getMessage(), "\n";
+}
+var_dump($test);
+
+class Test2 {
+ public ?Foobar $prop;
+ public ?int $prop2;
+}
+
+$test = new Test2;
+$test->prop2 = null;
+$ref =& $test->prop2;
+$test->prop =& $ref;
+var_dump($test);
+
+?>
+--EXPECT--
+Typed property Test1::$prop must be an instance of Foobar, int used
+object(Test1)#1 (1) {
+ ["prop"]=>
+ uninitialized(Foobar)
+ ["prop2"]=>
+ &int(123)
+}
+object(Test2)#3 (2) {
+ ["prop"]=>
+ &NULL
+ ["prop2"]=>
+ &NULL
+}
diff --git a/Zend/tests/type_declarations/typed_properties_097.phpt b/Zend/tests/type_declarations/typed_properties_097.phpt
new file mode 100644
index 0000000000..6697f2ad27
--- /dev/null
+++ b/Zend/tests/type_declarations/typed_properties_097.phpt
@@ -0,0 +1,90 @@
+--TEST--
+Incrementing/decrementing past max/min value (additional cases)
+--SKIPIF--
+<?php if (PHP_INT_SIZE != 8) die('skip 64 bit test'); ?>
+--FILE--
+<?php
+
+class Test {
+ public int $foo;
+}
+
+$test = new Test;
+
+$test->foo = PHP_INT_MIN;
+try {
+ --$test->foo;
+} catch (TypeError $e) {
+ echo $e->getMessage(), "\n";
+}
+var_dump($test->foo);
+try {
+ $test->foo--;
+} catch (TypeError $e) {
+ echo $e->getMessage(), "\n";
+}
+var_dump($test->foo);
+
+$test->foo = PHP_INT_MAX;
+try {
+ ++$test->foo;
+} catch (TypeError $e) {
+ echo $e->getMessage(), "\n";
+}
+var_dump($test->foo);
+try {
+ $test->foo++;
+} catch (TypeError $e) {
+ echo $e->getMessage(), "\n";
+}
+var_dump($test->foo);
+
+// Do the same things again, but with the property being a reference.
+$ref =& $test->foo;
+
+$test->foo = PHP_INT_MIN;
+try {
+ --$test->foo;
+} catch (TypeError $e) {
+ echo $e->getMessage(), "\n";
+}
+var_dump($test->foo);
+try {
+ $test->foo--;
+} catch (TypeError $e) {
+ echo $e->getMessage(), "\n";
+}
+var_dump($test->foo);
+
+$test->foo = PHP_INT_MAX;
+try {
+ ++$test->foo;
+} catch (TypeError $e) {
+ echo $e->getMessage(), "\n";
+}
+var_dump($test->foo);
+try {
+ $test->foo++;
+} catch (TypeError $e) {
+ echo $e->getMessage(), "\n";
+}
+var_dump($test->foo);
+
+?>
+--EXPECT--
+Cannot decrement property Test::$foo of type int past its minimal value
+int(-9223372036854775808)
+Cannot decrement property Test::$foo of type int past its minimal value
+int(-9223372036854775808)
+Cannot increment property Test::$foo of type int past its maximal value
+int(9223372036854775807)
+Cannot increment property Test::$foo of type int past its maximal value
+int(9223372036854775807)
+Cannot decrement a reference held by property Test::$foo of type int past its minimal value
+int(-9223372036854775808)
+Cannot decrement a reference held by property Test::$foo of type int past its minimal value
+int(-9223372036854775808)
+Cannot increment a reference held by property Test::$foo of type int past its maximal value
+int(9223372036854775807)
+Cannot increment a reference held by property Test::$foo of type int past its maximal value
+int(9223372036854775807) \ No newline at end of file
diff --git a/Zend/tests/type_declarations/typed_properties_098.phpt b/Zend/tests/type_declarations/typed_properties_098.phpt
new file mode 100644
index 0000000000..48e443c458
--- /dev/null
+++ b/Zend/tests/type_declarations/typed_properties_098.phpt
@@ -0,0 +1,17 @@
+--TEST--
+Make sure uninitialized property is initialized to null when taken by reference
+--FILE--
+<?php
+
+class Test {
+ public $prop;
+}
+
+$test = new Test;
+unset($test->prop);
+$ref =& $test->prop;
+var_dump($ref);
+
+?>
+--EXPECT--
+NULL
diff --git a/Zend/tests/type_declarations/typed_properties_099.phpt b/Zend/tests/type_declarations/typed_properties_099.phpt
new file mode 100644
index 0000000000..1e450ce818
--- /dev/null
+++ b/Zend/tests/type_declarations/typed_properties_099.phpt
@@ -0,0 +1,20 @@
+--TEST--
+Check that iterating a typed property by reference adds a type source
+--FILE--
+<?php
+
+class Test {
+ public array $ary = [];
+}
+
+$test = new Test;
+foreach ($test->ary as &$value) {}
+var_dump($test);
+
+?>
+--EXPECT--
+object(Test)#1 (1) {
+ ["ary"]=>
+ array(0) {
+ }
+}
diff --git a/Zend/tests/type_declarations/typed_properties_100.phpt b/Zend/tests/type_declarations/typed_properties_100.phpt
new file mode 100644
index 0000000000..8ee3deb0f7
--- /dev/null
+++ b/Zend/tests/type_declarations/typed_properties_100.phpt
@@ -0,0 +1,19 @@
+--TEST--
+Property type not enforced for __get if the property is not visible
+--FILE--
+<?php
+
+class Test {
+ private int $prop;
+
+ public function __get($name) {
+ return "foobar";
+ }
+}
+
+$test = new Test;
+var_dump($test->prop);
+
+?>
+--EXPECT--
+string(6) "foobar"
diff --git a/Zend/tests/type_declarations/typed_properties_101.phpt b/Zend/tests/type_declarations/typed_properties_101.phpt
new file mode 100644
index 0000000000..3c5a15fe40
--- /dev/null
+++ b/Zend/tests/type_declarations/typed_properties_101.phpt
@@ -0,0 +1,37 @@
+--TEST--
+Dumping of uninitialized typed properties (including private ones)
+--FILE--
+<?php
+
+class Test {
+ public bool $public;
+ protected float $protected;
+ private string $private;
+
+ public function dump() {
+ var_dump($this);
+ debug_zval_dump($this);
+ }
+}
+
+$test = new Test;
+$test->dump();
+
+?>
+--EXPECTF--
+object(Test)#1 (0) {
+ ["public"]=>
+ uninitialized(bool)
+ ["protected":protected]=>
+ uninitialized(float)
+ ["private":"Test":private]=>
+ uninitialized(string)
+}
+object(Test)#1 (0) refcount(%d){
+ ["public"]=>
+ uninitialized(bool)
+ ["protected":protected]=>
+ uninitialized(float)
+ ["private":"Test":private]=>
+ uninitialized(string)
+}
diff --git a/Zend/tests/type_declarations/typed_properties_102.phpt b/Zend/tests/type_declarations/typed_properties_102.phpt
new file mode 100644
index 0000000000..83f3c26186
--- /dev/null
+++ b/Zend/tests/type_declarations/typed_properties_102.phpt
@@ -0,0 +1,22 @@
+--TEST--
+Compound assignment operator on static property holding ref
+--FILE--
+<?php declare(strict_types=1);
+
+class Test {
+ public static int $intProp = 123;
+ public static $prop;
+}
+
+Test::$prop =& Test::$intProp;
+try {
+ Test::$prop .= "foobar";
+} catch (TypeError $e) {
+ echo $e->getMessage(), "\n";
+}
+var_dump(Test::$prop, Test::$intProp);
+?>
+--EXPECT--
+Cannot assign string to reference held by property Test::$intProp of type int
+int(123)
+int(123)
diff --git a/Zend/tests/type_declarations/typed_properties_103.phpt b/Zend/tests/type_declarations/typed_properties_103.phpt
new file mode 100644
index 0000000000..5c0fc85a99
--- /dev/null
+++ b/Zend/tests/type_declarations/typed_properties_103.phpt
@@ -0,0 +1,22 @@
+--TEST--
+Handling of UNDEF property in compound assign
+--FILE--
+<?php
+class C {
+ public $a = 0;
+}
+function foo() {
+ $x = new C;
+ $x->a = 1;
+ unset($x->a);
+ $x->a += 2;
+ var_dump($x);
+}
+foo();
+?>
+--EXPECTF--
+Notice: Undefined property: C::$a in %s on line %d
+object(C)#1 (1) {
+ ["a"]=>
+ int(2)
+}
diff --git a/Zend/tests/type_declarations/typed_properties_104.phpt b/Zend/tests/type_declarations/typed_properties_104.phpt
new file mode 100644
index 0000000000..e7d69e3d7d
--- /dev/null
+++ b/Zend/tests/type_declarations/typed_properties_104.phpt
@@ -0,0 +1,17 @@
+--TEST--
+Uninitialized result of PRE_INC/PRE_DEC in case of exception
+--FILE--
+<?php
+declare(strict_types=1);
+$o = new class {
+ public string $a = "123";
+};
+$x = & $o->a;
+try {
+ $ret = ++$x + 5;
+} catch (TypeError $e) {
+}
+?>
+OK
+--EXPECT--
+OK
diff --git a/Zend/tests/type_declarations/typed_properties_105.phpt b/Zend/tests/type_declarations/typed_properties_105.phpt
new file mode 100644
index 0000000000..747ff9f190
--- /dev/null
+++ b/Zend/tests/type_declarations/typed_properties_105.phpt
@@ -0,0 +1,20 @@
+--TEST--
+Bug #77673 ReflectionClass::getDefaultProperties returns spooky array
+--FILE--
+<?php
+class A {
+ public B $c;
+}
+
+$class = new ReflectionClass(A::class);
+
+$defaults = $class->getDefaultProperties();
+
+var_dump($defaults);
+var_dump(array_key_exists('c', $defaults));
+?>
+--EXPECT--
+array(0) {
+}
+bool(false)
+
diff --git a/Zend/tests/type_declarations/typed_properties_106.phpt b/Zend/tests/type_declarations/typed_properties_106.phpt
new file mode 100644
index 0000000000..344cfa5349
--- /dev/null
+++ b/Zend/tests/type_declarations/typed_properties_106.phpt
@@ -0,0 +1,26 @@
+--TEST--
+CONST/CV should not be freed on failed reference assignment
+--FILE--
+<?php
+class Test {
+ public ?Type $prop;
+}
+$obj = new Test;
+$ref =& $obj->prop;
+try {
+ $ref = [1];
+} catch (TypeError $e) {
+ echo $e->getMessage(), "\n";
+}
+try {
+ $ary = [1];
+ $ref = $ary;
+} catch (TypeError $e) {
+ echo $e->getMessage(), "\n";
+}
+var_dump($ref);
+?>
+--EXPECT--
+Cannot assign array to reference held by property Test::$prop of type ?Type
+Cannot assign array to reference held by property Test::$prop of type ?Type
+NULL
diff --git a/Zend/tests/type_declarations/typed_properties_107.phpt b/Zend/tests/type_declarations/typed_properties_107.phpt
new file mode 100644
index 0000000000..776ad4fc9f
--- /dev/null
+++ b/Zend/tests/type_declarations/typed_properties_107.phpt
@@ -0,0 +1,26 @@
+--TEST--
+Assigning stringable object to static string property
+--FILE--
+<?php
+
+class Test1 {
+ public static $ref;
+}
+class Test2 {
+ public string $str = "str";
+}
+class Test3 {
+ public function __toString() {
+ $x = "foo";
+ return $x . "bar";
+ }
+}
+
+$test2 = new Test2;
+Test1::$ref =& $test2->str;
+Test1::$ref = new Test3;
+var_dump(Test1::$ref);
+
+?>
+--EXPECT--
+string(6) "foobar"
diff --git a/Zend/tests/type_declarations/typed_properties_108.phpt b/Zend/tests/type_declarations/typed_properties_108.phpt
new file mode 100644
index 0000000000..a2bd479888
--- /dev/null
+++ b/Zend/tests/type_declarations/typed_properties_108.phpt
@@ -0,0 +1,47 @@
+--TEST--
+Variable assignment in catch must respect typed references
+--FILE--
+<?php
+
+class Test {
+ public int $i = 42;
+ public string $s = "str";
+}
+
+$test = new Test;
+
+$ref =& $test->i;
+try {
+ try {
+ throw new Exception("ex");
+ } catch (Exception $ref) {
+ echo "Unreachable\n";
+ }
+} catch (TypeError $e) {
+ var_dump($test->i);
+ echo $e . "\n\n";
+}
+
+$ref =& $test->s;
+try {
+ try {
+ throw new Exception("ex");
+ } catch (Exception $ref) {
+ echo "Unreachable\n";
+ }
+} catch (TypeError $e) {
+ var_dump($test->s);
+ echo $e . "\n\n";
+}
+
+?>
+--EXPECTF--
+int(42)
+TypeError: Cannot assign Exception to reference held by property Test::$i of type int in %s:%d
+Stack trace:
+#0 {main}
+
+string(3) "str"
+TypeError: Cannot assign Exception to reference held by property Test::$s of type string in %s:%d
+Stack trace:
+#0 {main}
diff --git a/Zend/tests/type_declarations/typed_properties_class_loading.phpt b/Zend/tests/type_declarations/typed_properties_class_loading.phpt
new file mode 100644
index 0000000000..0612624454
--- /dev/null
+++ b/Zend/tests/type_declarations/typed_properties_class_loading.phpt
@@ -0,0 +1,51 @@
+--TEST--
+Typed properties do not invoke the autoloader
+--FILE--
+<?php
+
+class Test {
+ public X $propX;
+ public ?Y $propY;
+}
+
+spl_autoload_register(function($class) {
+ echo "Loading $class\n";
+});
+
+$test = new Test;
+try {
+ $test->propX = new stdClass;
+} catch (TypeError $e) {
+ echo $e->getMessage(), "\n";
+}
+
+if (true) {
+ class X {}
+}
+
+$test->propX = new X;
+var_dump($test->propX);
+
+$test->propY = null;
+$r =& $test->propY;
+try {
+ $test->propY = new stdClass;
+} catch (TypeError $e) {
+ echo $e->getMessage(), "\n";
+}
+
+if (true) {
+ class Y {}
+}
+
+$r = new Y;
+var_dump($test->propY);
+
+?>
+--EXPECT--
+Typed property Test::$propX must be an instance of X, stdClass used
+object(X)#3 (0) {
+}
+Typed property Test::$propY must be an instance of Y or null, stdClass used
+object(Y)#4 (0) {
+}
diff --git a/Zend/tests/type_declarations/typed_properties_magic_set.phpt b/Zend/tests/type_declarations/typed_properties_magic_set.phpt
new file mode 100644
index 0000000000..70a7d4fe6f
--- /dev/null
+++ b/Zend/tests/type_declarations/typed_properties_magic_set.phpt
@@ -0,0 +1,73 @@
+--TEST--
+__set() should not be invoked when setting an uninitialized typed property
+--FILE--
+<?php
+
+class Test {
+ public int $foo;
+ public function __get($name) {
+ echo "__get ", $name, "\n";
+ return null;
+ }
+ public function __set($name, $value) {
+ echo "__set ", $name, " = ", $value, "\n";
+ }
+ public function __isset($name) {
+ echo "__isset ", $name, "\n";
+ return true;
+ }
+ public function __unset($name) {
+ echo "__unset ", $name, "\n";
+ }
+}
+
+$test = new Test;
+try {
+ var_dump($test->foo);
+} catch (Error $e) {
+ echo $e->getMessage(), "\n";
+}
+var_dump(isset($test->foo));
+$test->foo = 42;
+var_dump($test->foo);
+
+// __set will be called after unset()
+unset($test->foo);
+$test->foo = 42;
+
+// __set will be called after unset() without prior initialization
+$test = new Test;
+unset($test->foo);
+$test->foo = 42;
+
+class Test2 extends Test {
+}
+
+// Check that inherited properties work correctly
+$test = new Test;
+$test->foo = 42;
+var_dump($test->foo);
+unset($test->foo);
+$test->foo = 42;
+
+// Test that cloning works correctly
+$test = clone $test;
+$test->foo = 42;
+$test = clone new Test;
+$test->foo = 42;
+var_dump($test->foo);
+unset($test->foo);
+$test->foo = 42;
+
+?>
+--EXPECT--
+Typed property Test::$foo must not be accessed before initialization
+bool(false)
+int(42)
+__set foo = 42
+__set foo = 42
+int(42)
+__set foo = 42
+__set foo = 42
+int(42)
+__set foo = 42
diff --git a/Zend/tests/type_declarations/typed_properties_protected_inheritance_mismatch.phpt b/Zend/tests/type_declarations/typed_properties_protected_inheritance_mismatch.phpt
new file mode 100644
index 0000000000..1f03b5580f
--- /dev/null
+++ b/Zend/tests/type_declarations/typed_properties_protected_inheritance_mismatch.phpt
@@ -0,0 +1,11 @@
+--TEST--
+Typed property invariance violation for protected properties
+--FILE--
+<?php
+
+class A { protected int $x; }
+class B extends A { protected $x; }
+
+?>
+--EXPECTF--
+Fatal error: Type of B::$x must be int (as in class A) in %s on line %d
diff --git a/Zend/tests/type_declarations/types_in_ast.phpt b/Zend/tests/type_declarations/types_in_ast.phpt
new file mode 100644
index 0000000000..54619c23b7
--- /dev/null
+++ b/Zend/tests/type_declarations/types_in_ast.phpt
@@ -0,0 +1,23 @@
+--TEST--
+AST pretty-printer
+--INI--
+zend.assertions=1
+assert.exception=0
+--FILE--
+<?php
+assert(0 && ($a = function (int $a, ?int $b, int $c = null): ?int {
+ $x = new class {
+ public $a;
+ public int $b;
+ public ?int $c;
+ };
+}));
+?>
+--EXPECTF--
+Warning: assert(): assert(0 && ($a = function (int $a, ?int $b, int $c = null): ?int {
+ $x = new class {
+ public $a;
+ public int $b;
+ public ?int $c;
+ };
+})) failed in %stypes_in_ast.php on line 2
diff --git a/Zend/tests/type_declarations/variance/abstract_constructor.phpt b/Zend/tests/type_declarations/variance/abstract_constructor.phpt
new file mode 100644
index 0000000000..f061517bcf
--- /dev/null
+++ b/Zend/tests/type_declarations/variance/abstract_constructor.phpt
@@ -0,0 +1,18 @@
+--TEST--
+Variance check for abstract constructor
+--FILE--
+<?php
+class X {
+}
+abstract class A {
+ abstract function __construct(X $x);
+}
+class B extends A {
+ function __construct(object $x) {}
+}
+class C extends B {
+ function __construct(Y $x) {}
+}
+?>
+--EXPECTF--
+Fatal error: Could not check compatibility between C::__construct(Y $x) and A::__construct(X $x), because class Y is not available in %s on line %d
diff --git a/Zend/tests/type_declarations/variance/class_order_autoload1.phpt b/Zend/tests/type_declarations/variance/class_order_autoload1.phpt
new file mode 100644
index 0000000000..d68d2e8afa
--- /dev/null
+++ b/Zend/tests/type_declarations/variance/class_order_autoload1.phpt
@@ -0,0 +1,37 @@
+--TEST--
+Class order allowed with autoloading (1)
+--FILE--
+<?php
+
+spl_autoload_register(function($class) {
+ if ($class === 'A') {
+ class A {
+ public function method() : B {}
+ }
+ var_dump(new A);
+ } else if ($class == 'B') {
+ class B extends A {
+ public function method() : C {}
+ }
+ var_dump(new B);
+ } else {
+ class C extends B {
+ }
+ var_dump(new C);
+ }
+});
+
+var_dump(new C);
+
+?>
+===DONE===
+--EXPECT--
+object(A)#2 (0) {
+}
+object(B)#2 (0) {
+}
+object(C)#2 (0) {
+}
+object(C)#2 (0) {
+}
+===DONE===
diff --git a/Zend/tests/type_declarations/variance/class_order_autoload2.phpt b/Zend/tests/type_declarations/variance/class_order_autoload2.phpt
new file mode 100644
index 0000000000..f6229d3995
--- /dev/null
+++ b/Zend/tests/type_declarations/variance/class_order_autoload2.phpt
@@ -0,0 +1,38 @@
+--TEST--
+Class order allowed with autoloading (2)
+--FILE--
+<?php
+
+spl_autoload_register(function($class) {
+ if ($class === 'A') {
+ class A {
+ public function method() : B {}
+ }
+ var_dump(new A);
+ } else if ($class == 'B') {
+ class B extends A {
+ public function method() : C {}
+ }
+ var_dump(new B);
+ } else {
+ class C extends B {
+ }
+ var_dump(new C);
+ }
+});
+
+// Same as autoload1 test case, but with a different autoloading root
+var_dump(new B);
+
+?>
+===DONE===
+--EXPECT--
+object(A)#2 (0) {
+}
+object(C)#2 (0) {
+}
+object(B)#2 (0) {
+}
+object(B)#2 (0) {
+}
+===DONE===
diff --git a/Zend/tests/type_declarations/variance/class_order_autoload3.phpt b/Zend/tests/type_declarations/variance/class_order_autoload3.phpt
new file mode 100644
index 0000000000..d09f2a9c45
--- /dev/null
+++ b/Zend/tests/type_declarations/variance/class_order_autoload3.phpt
@@ -0,0 +1,45 @@
+--TEST--
+Class order allowed with autoloading (3)
+--FILE--
+<?php
+
+spl_autoload_register(function($class) {
+ if ($class == 'A') {
+ class A {
+ public function method(): X {}
+ }
+ var_dump(new A);
+ } else if ($class == 'B') {
+ class B extends A {
+ public function method(): Y {}
+ }
+ var_dump(new B);
+ } else if ($class == 'X') {
+ class X {
+ public function method(): A {}
+ }
+ var_dump(new X);
+ } else if ($class == 'Y') {
+ class Y extends X {
+ public function method(): B {}
+ }
+ var_dump(new Y);
+ }
+});
+
+var_dump(new B);
+
+?>
+===DONE===
+--EXPECT--
+object(A)#2 (0) {
+}
+object(X)#2 (0) {
+}
+object(Y)#2 (0) {
+}
+object(B)#2 (0) {
+}
+object(B)#2 (0) {
+}
+===DONE===
diff --git a/Zend/tests/type_declarations/variance/class_order_autoload4.phpt b/Zend/tests/type_declarations/variance/class_order_autoload4.phpt
new file mode 100644
index 0000000000..37070b444c
--- /dev/null
+++ b/Zend/tests/type_declarations/variance/class_order_autoload4.phpt
@@ -0,0 +1,44 @@
+--TEST--
+Class order allowed with autoloading (4)
+--FILE--
+<?php
+
+// Same as autoload3 test case, but with X, Y being interfaces.
+spl_autoload_register(function($class) {
+ if ($class == 'A') {
+ class A {
+ public function method(): X {}
+ }
+ var_dump(new A);
+ } else if ($class == 'B') {
+ class B extends A {
+ public function method(): Y {}
+ }
+ var_dump(new B);
+ } else if ($class == 'X') {
+ interface X {
+ public function method(): A;
+ }
+ var_dump(interface_exists('X'));
+ } else if ($class == 'Y') {
+ interface Y extends X {
+ public function method(): B;
+ }
+ var_dump(interface_exists('Y'));
+ }
+});
+
+var_dump(new B);
+
+?>
+===DONE===
+--EXPECT--
+object(A)#2 (0) {
+}
+bool(true)
+bool(true)
+object(B)#2 (0) {
+}
+object(B)#2 (0) {
+}
+===DONE===
diff --git a/Zend/tests/type_declarations/variance/class_order_autoload5.phpt b/Zend/tests/type_declarations/variance/class_order_autoload5.phpt
new file mode 100644
index 0000000000..77e9a0a9ec
--- /dev/null
+++ b/Zend/tests/type_declarations/variance/class_order_autoload5.phpt
@@ -0,0 +1,60 @@
+--TEST--
+Class order allowed with autoloading (5)
+--FILE--
+<?php
+
+// Similar to variance3, but one more class hierarchy in the cycle
+spl_autoload_register(function($class) {
+ if ($class == 'A') {
+ class A {
+ public function method(): X {}
+ }
+ var_dump(new A);
+ } else if ($class == 'B') {
+ class B extends A {
+ public function method(): Y {}
+ }
+ var_dump(new B);
+ } else if ($class == 'X') {
+ class X {
+ public function method(): Q {}
+ }
+ var_dump(new X);
+ } else if ($class == 'Y') {
+ class Y extends X {
+ public function method(): R {}
+ }
+ var_dump(new Y);
+ } else if ($class == 'Q') {
+ class Q {
+ public function method(): A {}
+ }
+ var_dump(new Q);
+ } else if ($class == 'R') {
+ class R extends Q {
+ public function method(): B {}
+ }
+ var_dump(new R);
+ }
+});
+
+var_dump(new B);
+
+?>
+===DONE===
+--EXPECT--
+object(A)#2 (0) {
+}
+object(X)#2 (0) {
+}
+object(Q)#2 (0) {
+}
+object(R)#2 (0) {
+}
+object(Y)#2 (0) {
+}
+object(B)#2 (0) {
+}
+object(B)#2 (0) {
+}
+===DONE===
diff --git a/Zend/tests/type_declarations/variance/class_order_autoload_error1.phpt b/Zend/tests/type_declarations/variance/class_order_autoload_error1.phpt
new file mode 100644
index 0000000000..9af4041604
--- /dev/null
+++ b/Zend/tests/type_declarations/variance/class_order_autoload_error1.phpt
@@ -0,0 +1,25 @@
+--TEST--
+Variance error in the presence of autoloading (1)
+--FILE--
+<?php
+
+spl_autoload_register(function($class) {
+ if ($class === 'A') {
+ class A {
+ public function method() : C {}
+ }
+ } else if ($class == 'B') {
+ class B extends A {
+ public function method() : B {}
+ }
+ } else {
+ class C extends B {
+ }
+ }
+});
+
+$b = new B;
+
+?>
+--EXPECTF--
+Fatal error: Declaration of B::method(): B must be compatible with A::method(): C in %s on line %d
diff --git a/Zend/tests/type_declarations/variance/class_order_autoload_error2.phpt b/Zend/tests/type_declarations/variance/class_order_autoload_error2.phpt
new file mode 100644
index 0000000000..48d2e0b956
--- /dev/null
+++ b/Zend/tests/type_declarations/variance/class_order_autoload_error2.phpt
@@ -0,0 +1,27 @@
+--TEST--
+Variance error in the presence of autoloading (2)
+--FILE--
+<?php
+
+// Same as autoload_error1, but for argument types.
+spl_autoload_register(function($class) {
+ if ($class === 'A') {
+ class A {
+ public function method(B $x) {}
+ }
+ } else if ($class == 'B') {
+ class B extends A {
+ public function method(C $x) {}
+ }
+ } else {
+ class C extends B {
+ }
+ }
+});
+
+$b = new B;
+$c = new C;
+
+?>
+--EXPECTF--
+Warning: Declaration of B::method(C $x) should be compatible with A::method(B $x) in %s on line %d
diff --git a/Zend/tests/type_declarations/variance/class_order_autoload_error3.phpt b/Zend/tests/type_declarations/variance/class_order_autoload_error3.phpt
new file mode 100644
index 0000000000..23b60b4584
--- /dev/null
+++ b/Zend/tests/type_declarations/variance/class_order_autoload_error3.phpt
@@ -0,0 +1,38 @@
+--TEST--
+Variance error in the presence of autoloading (3)
+--FILE--
+<?php
+
+spl_autoload_register(function($class) {
+ if ($class == 'A') {
+ class A {
+ public function method(): X {}
+ }
+ } else if ($class == 'B') {
+ class B extends A {
+ public function method(): Y {}
+ }
+ } else if ($class == 'X') {
+ class X {
+ public function method(): Q {}
+ }
+ } else if ($class == 'Y') {
+ class Y extends X {
+ public function method(): R {}
+ }
+ } else if ($class == 'Q') {
+ class Q {
+ public function method(): B {}
+ }
+ } else if ($class == 'R') {
+ class R extends Q {
+ public function method(): A {}
+ }
+ }
+});
+
+$b = new B;
+
+?>
+--EXPECTF--
+Fatal error: Declaration of R::method(): A must be compatible with Q::method(): B in %s on line %d
diff --git a/Zend/tests/type_declarations/variance/class_order_autoload_error4.phpt b/Zend/tests/type_declarations/variance/class_order_autoload_error4.phpt
new file mode 100644
index 0000000000..6acf9313f4
--- /dev/null
+++ b/Zend/tests/type_declarations/variance/class_order_autoload_error4.phpt
@@ -0,0 +1,39 @@
+--TEST--
+Variance error in the presence of autoloading (4)
+--FILE--
+<?php
+
+spl_autoload_register(function($class) {
+ if ($class == 'A') {
+ class A {
+ public function method(): X {}
+ }
+ var_dump(new A);
+ } else if ($class == 'B') {
+ class B extends A {
+ public function method(): Y {}
+ }
+ var_dump(new B);
+ } else if ($class == 'X') {
+ class X {
+ public function method(): B {}
+ }
+ var_dump(new X);
+ } else if ($class == 'Y') {
+ class Y extends X {
+ public function method(): A {}
+ }
+ var_dump(new Y);
+ }
+});
+
+var_dump(new B);
+
+?>
+--EXPECTF--
+object(A)#2 (0) {
+}
+object(X)#2 (0) {
+}
+
+Fatal error: Declaration of Y::method(): A must be compatible with X::method(): B in %s on line %d
diff --git a/Zend/tests/type_declarations/variance/class_order_autoload_error5.phpt b/Zend/tests/type_declarations/variance/class_order_autoload_error5.phpt
new file mode 100644
index 0000000000..a6a46f84a2
--- /dev/null
+++ b/Zend/tests/type_declarations/variance/class_order_autoload_error5.phpt
@@ -0,0 +1,52 @@
+--TEST--
+Variance error in the presence of autoloading (5)
+--FILE--
+<?php
+
+spl_autoload_register(function($class) {
+ if ($class == 'A') {
+ class A {
+ public function method(): X {}
+ }
+ var_dump(new A);
+ } else if ($class == 'B') {
+ class B extends A {
+ public function method(): Y {}
+ }
+ var_dump(new B);
+ } else if ($class == 'X') {
+ class X {
+ public function method(Y $a) {}
+ }
+ var_dump(new X);
+ } else if ($class == 'Y') {
+ class Y extends X {
+ public function method(Z $a) {}
+ }
+ var_dump(new Y);
+ } else if ($class == 'Z') {
+ class Z extends Y {
+ public function method($a) {}
+ }
+ var_dump(new Z);
+ }
+});
+
+var_dump(new B);
+
+?>
+--EXPECTF--
+object(A)#2 (0) {
+}
+object(X)#2 (0) {
+}
+
+Warning: Declaration of Y::method(Z $a) should be compatible with X::method(Y $a) in %s on line %d
+object(Z)#2 (0) {
+}
+object(Y)#2 (0) {
+}
+object(B)#2 (0) {
+}
+object(B)#2 (0) {
+}
diff --git a/Zend/tests/type_declarations/variance/class_order_autoload_error6.phpt b/Zend/tests/type_declarations/variance/class_order_autoload_error6.phpt
new file mode 100644
index 0000000000..4b54c9554d
--- /dev/null
+++ b/Zend/tests/type_declarations/variance/class_order_autoload_error6.phpt
@@ -0,0 +1,39 @@
+--TEST--
+Variance error in the presence of autoloading (6)
+--FILE--
+<?php
+
+spl_autoload_register(function($class) {
+ if ($class == 'A') {
+ class A {
+ public function method(): X {}
+ }
+ var_dump(new A);
+ } else if ($class == 'B') {
+ class B extends A {
+ public function method(): Y {}
+ }
+ var_dump(new B);
+ } else if ($class == 'X') {
+ class X {
+ public function method(): X {}
+ }
+ var_dump(new X);
+ } else if ($class == 'Y') {
+ class Y extends X {
+ public function method(): Unknown {}
+ }
+ var_dump(new Y);
+ }
+});
+
+var_dump(new B);
+
+?>
+--EXPECTF--
+object(A)#2 (0) {
+}
+object(X)#2 (0) {
+}
+
+Fatal error: Could not check compatibility between Y::method(): Unknown and X::method(): X, because class Unknown is not available in %s on line %d
diff --git a/Zend/tests/type_declarations/variance/class_order_error.phpt b/Zend/tests/type_declarations/variance/class_order_error.phpt
new file mode 100644
index 0000000000..df66e78b78
--- /dev/null
+++ b/Zend/tests/type_declarations/variance/class_order_error.phpt
@@ -0,0 +1,19 @@
+--TEST--
+Returns are covariant, but we don't allow the code due to class ordering
+--FILE--
+<?php
+
+class A {
+ public function method() : B {}
+}
+class B extends A {
+ public function method() : C {}
+}
+class C extends B {
+}
+
+new C;
+
+?>
+--EXPECTF--
+Fatal error: Could not check compatibility between B::method(): C and A::method(): B, because class C is not available in %s on line %d
diff --git a/Zend/tests/type_declarations/variance/enum_forward_compat.phpt b/Zend/tests/type_declarations/variance/enum_forward_compat.phpt
new file mode 100644
index 0000000000..3213aaaf76
--- /dev/null
+++ b/Zend/tests/type_declarations/variance/enum_forward_compat.phpt
@@ -0,0 +1,26 @@
+--TEST--
+Forward compatibility with types that look like classes but aren't
+--FILE--
+<?php
+
+spl_autoload_register(function($class) {
+ var_dump($class);
+ if ($class === 'X') {
+ class X {}
+ } else {
+ class Y {}
+ }
+});
+
+class A {
+ public function method(X $param) : object {}
+}
+
+class B extends A {
+ public function method(object $param) : Y {}
+}
+
+?>
+--EXPECT--
+string(1) "X"
+string(1) "Y"
diff --git a/Zend/tests/type_declarations/variance/internal_parent.phpt b/Zend/tests/type_declarations/variance/internal_parent.phpt
new file mode 100644
index 0000000000..eaef902b66
--- /dev/null
+++ b/Zend/tests/type_declarations/variance/internal_parent.phpt
@@ -0,0 +1,12 @@
+--TEST--
+Internal class as parent
+--FILE--
+<?php
+
+class Test extends DateTime {
+ public static function createFromFormat($format, $time, Wrong $timezone = null) { }
+}
+
+?>
+--EXPECTF--
+Warning: Could not check compatibility between Test::createFromFormat($format, $time, ?Wrong $timezone = NULL) and DateTime::createFromFormat($format, $time, ?DateTimeZone $object = NULL), because class Wrong is not available in %s on line %d
diff --git a/Zend/tests/type_declarations/variance/loading_exception1.phpt b/Zend/tests/type_declarations/variance/loading_exception1.phpt
new file mode 100644
index 0000000000..89aeaf3c12
--- /dev/null
+++ b/Zend/tests/type_declarations/variance/loading_exception1.phpt
@@ -0,0 +1,49 @@
+--TEST--
+Exception while loading class -- parent case
+--FILE--
+<?php
+
+spl_autoload_register(function($class) {
+ throw new Exception("Class $class does not exist");
+});
+
+// Graceful failure allowed
+for ($i = 0; $i < 2; $i++) {
+ try {
+ class B extends A {
+ }
+ } catch (Exception $e) {
+ echo $e->getMessage(), "\n";
+ }
+}
+
+interface I {}
+
+spl_autoload_register(function($class) {
+ // Tie up B in a variance obligation.
+ class X {
+ public function test(): I {}
+ }
+ class Y extends X {
+ public function test(): B {}
+ }
+}, true, true);
+
+// Fallback to fatal error, as we can't unlink class B anymore.
+try {
+ class B extends A implements I {
+ }
+} catch (Exception $e) {
+ echo $e->getMessage(), "\n";
+}
+
+?>
+--EXPECTF--
+Class A does not exist
+Class A does not exist
+
+Fatal error: During inheritance of B with variance dependencies: Uncaught Exception: Class A does not exist in %s:%d
+Stack trace:
+#0 [internal function]: {closure}('A')
+#1 %s(%d): spl_autoload_call('A')
+#2 {main} in %s on line %d
diff --git a/Zend/tests/type_declarations/variance/loading_exception2.phpt b/Zend/tests/type_declarations/variance/loading_exception2.phpt
new file mode 100644
index 0000000000..2b46c183c2
--- /dev/null
+++ b/Zend/tests/type_declarations/variance/loading_exception2.phpt
@@ -0,0 +1,51 @@
+--TEST--
+Exception while loading class -- interface case
+--FILE--
+<?php
+
+spl_autoload_register(function($class) {
+ throw new Exception("Class $class does not exist");
+});
+
+class A {}
+
+// Graceful failure allowed
+for ($i = 0; $i < 2; $i++) {
+ try {
+ class B extends A implements I {
+ }
+ } catch (Exception $e) {
+ echo $e->getMessage(), "\n";
+ }
+}
+
+interface J {}
+
+spl_autoload_register(function($class) {
+ // Tie up B in a variance obligation.
+ class X {
+ public function test(): J {}
+ }
+ class Y extends X {
+ public function test(): B {}
+ }
+}, true, true);
+
+// Fallback to fatal error, as we can't unlink class B anymore.
+try {
+ class B extends A implements I, J {
+ }
+} catch (Exception $e) {
+ echo $e->getMessage(), "\n";
+}
+
+?>
+--EXPECTF--
+Class I does not exist
+Class I does not exist
+
+Fatal error: During inheritance of B with variance dependencies: Uncaught Exception: Class I does not exist in %s:%d
+Stack trace:
+#0 [internal function]: {closure}('I')
+#1 %s(%d): spl_autoload_call('I')
+#2 {main} in %s on line %d
diff --git a/Zend/tests/type_declarations/variance/object_variance.phpt b/Zend/tests/type_declarations/variance/object_variance.phpt
new file mode 100644
index 0000000000..3ab0a311bf
--- /dev/null
+++ b/Zend/tests/type_declarations/variance/object_variance.phpt
@@ -0,0 +1,22 @@
+--TEST--
+Testing object's variance in inheritance
+--FILE--
+<?php
+
+interface I1 {
+ function method1(I1 $o): object;
+}
+interface I2 extends I1 {
+ function method1(object $o): I1;
+}
+final class C1 implements I2 {
+ function method1($o = null): self {
+ return $this;
+ }
+}
+
+$o = new C1();
+echo get_class($o->method1());
+?>
+--EXPECT--
+C1
diff --git a/Zend/tests/type_declarations/variance/parent_in_class.phpt b/Zend/tests/type_declarations/variance/parent_in_class.phpt
new file mode 100644
index 0000000000..c65146676d
--- /dev/null
+++ b/Zend/tests/type_declarations/variance/parent_in_class.phpt
@@ -0,0 +1,47 @@
+--TEST--
+Use of parent inside a class that has / has no parent
+--FILE--
+<?php
+
+// Illegal: A::parent is ill-defined
+class A {
+ public function method(parent $x) {}
+}
+class B extends A {
+ public function method(parent $x) {}
+}
+
+// Legal: A2::parent == P2
+class P2 {}
+class A2 extends P2 {
+ public function method(parent $x) {}
+}
+class B2 extends A2 {
+ public function method(P2 $x) {}
+}
+
+// Legal: B3::parent == A3 is subclass of A3::parent == P3 in covariant position
+class P3 {}
+class A3 extends P3 {
+ public function method($x): parent {}
+}
+class B3 extends A3 {
+ public function method($x): parent {}
+}
+
+// Illegal: B4::parent == A4 is subclass of A4::parent == P4 in contravariant position
+class P4 {}
+class A4 extends P4 {
+ public function method(parent $x) {}
+}
+class B4 extends A4 {
+ public function method(parent $x) {}
+}
+
+?>
+--EXPECTF--
+Deprecated: Cannot use "parent" when current class scope has no parent in %s on line %d
+
+Warning: Declaration of B4::method(A4 $x) should be compatible with A4::method(P4 $x) in %s on line %d
+
+Warning: Could not check compatibility between B::method(A $x) and A::method(parent $x), because class parent is not available in %s on line %d
diff --git a/Zend/tests/type_declarations/variance/parent_in_class_success.phpt b/Zend/tests/type_declarations/variance/parent_in_class_success.phpt
new file mode 100644
index 0000000000..c3edceaf3b
--- /dev/null
+++ b/Zend/tests/type_declarations/variance/parent_in_class_success.phpt
@@ -0,0 +1,27 @@
+--TEST--
+Use of parent inside a class that has / has no parent (success cases)
+--FILE--
+<?php
+
+// Legal: A2::parent == P2
+class P2 {}
+class A2 extends P2 {
+ public function method(parent $x) {}
+}
+class B2 extends A2 {
+ public function method(P2 $x) {}
+}
+
+// Legal: B3::parent == A3 is subclass of A3::parent == P3 in covariant position
+class P3 {}
+class A3 extends P3 {
+ public function method($x): parent {}
+}
+class B3 extends A3 {
+ public function method($x): parent {}
+}
+
+?>
+===DONE===
+--EXPECT--
+===DONE===
diff --git a/Zend/tests/type_declarations/variance/property_types_early_bind.phpt b/Zend/tests/type_declarations/variance/property_types_early_bind.phpt
new file mode 100644
index 0000000000..ca3fe1d3ca
--- /dev/null
+++ b/Zend/tests/type_declarations/variance/property_types_early_bind.phpt
@@ -0,0 +1,19 @@
+--TEST--
+Early binding should be prevented if property types cannot be checked
+--FILE--
+<?php
+
+class X {}
+class_alias('X', 'Y');
+
+class A {
+ public X $prop;
+}
+class B extends A {
+ public Y $prop;
+}
+
+?>
+===DONE===
+--EXPECT--
+===DONE===
diff --git a/Zend/tests/type_declarations/variance/trait_error.phpt b/Zend/tests/type_declarations/variance/trait_error.phpt
new file mode 100644
index 0000000000..667b177a5b
--- /dev/null
+++ b/Zend/tests/type_declarations/variance/trait_error.phpt
@@ -0,0 +1,20 @@
+--TEST--
+Trait delayed variance check fails
+--FILE--
+<?php
+
+// Taken from bug #78989.
+
+class X {
+ function method($a): A {}
+}
+trait T {
+ function method($r): B {}
+}
+class U extends X {
+ use T;
+}
+
+?>
+--EXPECTF--
+Fatal error: Could not check compatibility between T::method($r): B and X::method($a): A, because class B is not available in %s on line %d
diff --git a/Zend/tests/type_declarations/variance/trait_success.phpt b/Zend/tests/type_declarations/variance/trait_success.phpt
new file mode 100644
index 0000000000..1efadc00b4
--- /dev/null
+++ b/Zend/tests/type_declarations/variance/trait_success.phpt
@@ -0,0 +1,29 @@
+--TEST--
+Trait delayed variance check succeeds
+--FILE--
+<?php
+
+// Taken from bug #79179.
+
+spl_autoload_register(function() {
+ interface InterfaceB extends InterfaceA {}
+});
+
+interface InterfaceA {}
+
+trait SomeTrait {
+ abstract public function func(): ?InterfaceA;
+}
+
+class Foo {
+ public function func(): ?InterfaceB {}
+}
+
+class Bar extends Foo {
+ use SomeTrait;
+}
+
+?>
+===DONE===
+--EXPECT--
+===DONE===
diff --git a/Zend/tests/type_declarations/variance/unlinked_parent_1.phpt b/Zend/tests/type_declarations/variance/unlinked_parent_1.phpt
new file mode 100644
index 0000000000..fcce42424d
--- /dev/null
+++ b/Zend/tests/type_declarations/variance/unlinked_parent_1.phpt
@@ -0,0 +1,19 @@
+--TEST--
+Using an unlinked parent class
+--FILE--
+<?php
+
+spl_autoload_register(function($class) {
+ class X extends B {}
+});
+
+try {
+ class B extends A {
+ }
+} catch (Error $e) {
+ echo $e->getMessage(), "\n";
+}
+
+?>
+--EXPECT--
+Class 'B' not found
diff --git a/Zend/tests/type_declarations/variance/unlinked_parent_2.phpt b/Zend/tests/type_declarations/variance/unlinked_parent_2.phpt
new file mode 100644
index 0000000000..b947c6f4b6
--- /dev/null
+++ b/Zend/tests/type_declarations/variance/unlinked_parent_2.phpt
@@ -0,0 +1,19 @@
+--TEST--
+Using an unlinked parent interface
+--FILE--
+<?php
+
+spl_autoload_register(function($class) {
+ class X implements B {}
+});
+
+try {
+ interface B extends A {
+ }
+} catch (Error $e) {
+ echo $e->getMessage(), "\n";
+}
+
+?>
+--EXPECT--
+Interface 'B' not found
diff --git a/Zend/tests/uncaught_exception_error_supression.phpt b/Zend/tests/uncaught_exception_error_supression.phpt
new file mode 100644
index 0000000000..1130a9d99b
--- /dev/null
+++ b/Zend/tests/uncaught_exception_error_supression.phpt
@@ -0,0 +1,18 @@
+--TEST--
+Error suppression should have no impact on uncaught exceptions
+--FILE--
+<?php
+
+function abc() {
+ throw new Error('Example Exception');
+}
+
+@abc();
+
+?>
+--EXPECTF--
+Fatal error: Uncaught Error: Example Exception in %s:%d
+Stack trace:
+#0 %s(%d): abc()
+#1 {main}
+ thrown in %s on line %d
diff --git a/Zend/tests/undef_index_to_exception.phpt b/Zend/tests/undef_index_to_exception.phpt
new file mode 100644
index 0000000000..d113608a5e
--- /dev/null
+++ b/Zend/tests/undef_index_to_exception.phpt
@@ -0,0 +1,46 @@
+--TEST--
+Converting undefined index/offset notice to exception
+--FILE--
+<?php
+
+set_error_handler(function($_, $msg) {
+ throw new Exception($msg);
+});
+
+$test = [];
+try {
+ $test[0] .= "xyz";
+} catch (Exception $e) {
+ echo $e->getMessage(), "\n";
+}
+var_dump($test);
+
+try {
+ $test["key"] .= "xyz";
+} catch (Exception $e) {
+ echo $e->getMessage(), "\n";
+}
+var_dump($test);
+
+unset($test);
+try {
+ $GLOBALS["test"] .= "xyz";
+} catch (Exception $e) {
+ echo $e->getMessage(), "\n";
+}
+try {
+ var_dump($test);
+} catch (Exception $e) {
+ echo $e->getMessage(), "\n";
+}
+
+?>
+--EXPECT--
+Undefined offset: 0
+array(0) {
+}
+Undefined index: key
+array(0) {
+}
+Undefined index: test
+Undefined variable: test
diff --git a/Zend/tests/unexpected_ref_bug.phpt b/Zend/tests/unexpected_ref_bug.phpt
index ba61ee582a..a4e74e7a67 100644
--- a/Zend/tests/unexpected_ref_bug.phpt
+++ b/Zend/tests/unexpected_ref_bug.phpt
@@ -2,17 +2,19 @@
Crash when function parameter modified via unexpected reference
--FILE--
<?php
-function my_errorhandler($errno,$errormsg) {
- global $my_var;
- $my_var = 0;
- return true;
+class Test {
+ public function __toString() {
+ global $my_var;
+ $my_var = 0;
+ return ",";
+ }
}
-set_error_handler("my_errorhandler");
$my_var = str_repeat("A",64);
-$data = call_user_func_array("explode",array(new StdClass(), &$my_var));
+$data = call_user_func_array("explode",array(new Test(), &$my_var));
$my_var=array(1,2,3);
-$data = call_user_func_array("implode",array(&$my_var, new StdClass()));
+$data = call_user_func_array("implode",array(&$my_var, new Test()));
echo "Done.\n";
?>
---EXPECT--
+--EXPECTF--
+Deprecated: implode(): Passing glue string after array is deprecated. Swap the parameters in %s on line %d
Done.
diff --git a/Zend/tests/unset_cv05.phpt b/Zend/tests/unset_cv05.phpt
index f7a2736bc6..073ee4bee4 100644
--- a/Zend/tests/unset_cv05.phpt
+++ b/Zend/tests/unset_cv05.phpt
@@ -6,7 +6,7 @@ session.save_handler=files
--SKIPIF--
<?php
-include(dirname(__FILE__).'/../../ext/session/tests/skipif.inc');
+include(__DIR__.'/../../ext/session/tests/skipif.inc');
?>
--FILE--
diff --git a/Zend/tests/unset_cv06.phpt b/Zend/tests/unset_cv06.phpt
index dd788158e4..073a3007f9 100644
--- a/Zend/tests/unset_cv06.phpt
+++ b/Zend/tests/unset_cv06.phpt
@@ -1,7 +1,7 @@
--TEST--
unset() CV 6 (indirect unset() of global variable in session_unset())
--SKIPIF--
-<?php include(dirname(__FILE__).'/../../ext/session/tests/skipif.inc'); ?>
+<?php include(__DIR__.'/../../ext/session/tests/skipif.inc'); ?>
--INI--
session.auto_start=0
session.save_handler=files
diff --git a/Zend/tests/use_const/includes/foo_bar.php b/Zend/tests/use_const/includes/foo_bar.inc
index 90ed451f36..90ed451f36 100644
--- a/Zend/tests/use_const/includes/foo_bar.php
+++ b/Zend/tests/use_const/includes/foo_bar.inc
diff --git a/Zend/tests/use_const/includes/foo_php_version.php b/Zend/tests/use_const/includes/foo_php_version.inc
index 08f9fd150e..08f9fd150e 100644
--- a/Zend/tests/use_const/includes/foo_php_version.php
+++ b/Zend/tests/use_const/includes/foo_php_version.inc
diff --git a/Zend/tests/use_const/includes/global_bar.php b/Zend/tests/use_const/includes/global_bar.inc
index 609d17b7b5..609d17b7b5 100644
--- a/Zend/tests/use_const/includes/global_bar.php
+++ b/Zend/tests/use_const/includes/global_bar.inc
diff --git a/Zend/tests/use_const/includes/global_baz.php b/Zend/tests/use_const/includes/global_baz.inc
index 8b6fba97b3..8b6fba97b3 100644
--- a/Zend/tests/use_const/includes/global_baz.php
+++ b/Zend/tests/use_const/includes/global_baz.inc
diff --git a/Zend/tests/use_const/no_global_fallback.phpt b/Zend/tests/use_const/no_global_fallback.phpt
index 3adebd68f5..f9ee605515 100644
--- a/Zend/tests/use_const/no_global_fallback.phpt
+++ b/Zend/tests/use_const/no_global_fallback.phpt
@@ -3,7 +3,7 @@ non-existent imported constants should not be looked up in the global table
--FILE--
<?php
-require 'includes/global_baz.php';
+require 'includes/global_baz.inc';
use const foo\bar\baz;
var_dump(baz);
diff --git a/Zend/tests/use_const/shadow_core.phpt b/Zend/tests/use_const/shadow_core.phpt
index 5dbf396e63..55dc03df40 100644
--- a/Zend/tests/use_const/shadow_core.phpt
+++ b/Zend/tests/use_const/shadow_core.phpt
@@ -3,7 +3,7 @@ shadowing a global core constant with a local version
--FILE--
<?php
-require 'includes/foo_php_version.php';
+require 'includes/foo_php_version.inc';
use const foo\PHP_VERSION;
diff --git a/Zend/tests/use_const/shadow_global.phpt b/Zend/tests/use_const/shadow_global.phpt
index 930cc9f0b8..522f972506 100644
--- a/Zend/tests/use_const/shadow_global.phpt
+++ b/Zend/tests/use_const/shadow_global.phpt
@@ -4,8 +4,8 @@ shadowing a global constant with a local version
<?php
namespace {
- require 'includes/global_bar.php';
- require 'includes/foo_bar.php';
+ require 'includes/global_bar.inc';
+ require 'includes/foo_bar.inc';
}
namespace {
diff --git a/Zend/tests/use_function/includes/foo_bar.php b/Zend/tests/use_function/includes/foo_bar.inc
index 6d2f8cab45..6d2f8cab45 100644
--- a/Zend/tests/use_function/includes/foo_bar.php
+++ b/Zend/tests/use_function/includes/foo_bar.inc
diff --git a/Zend/tests/use_function/includes/foo_strlen.php b/Zend/tests/use_function/includes/foo_strlen.inc
index d2df2aa2b4..d2df2aa2b4 100644
--- a/Zend/tests/use_function/includes/foo_strlen.php
+++ b/Zend/tests/use_function/includes/foo_strlen.inc
diff --git a/Zend/tests/use_function/includes/global_bar.php b/Zend/tests/use_function/includes/global_bar.inc
index 6d7d91f805..6d7d91f805 100644
--- a/Zend/tests/use_function/includes/global_bar.php
+++ b/Zend/tests/use_function/includes/global_bar.inc
diff --git a/Zend/tests/use_function/includes/global_baz.php b/Zend/tests/use_function/includes/global_baz.inc
index 6383b9dd38..6383b9dd38 100644
--- a/Zend/tests/use_function/includes/global_baz.php
+++ b/Zend/tests/use_function/includes/global_baz.inc
diff --git a/Zend/tests/use_function/no_global_fallback.phpt b/Zend/tests/use_function/no_global_fallback.phpt
index 1277d4e2c2..106fe4b2f8 100644
--- a/Zend/tests/use_function/no_global_fallback.phpt
+++ b/Zend/tests/use_function/no_global_fallback.phpt
@@ -3,7 +3,7 @@ non-existent imported functions should not be looked up in the global table
--FILE--
<?php
-require 'includes/global_baz.php';
+require 'includes/global_baz.inc';
use function foo\bar\baz;
var_dump(baz());
diff --git a/Zend/tests/use_function/shadow_core.phpt b/Zend/tests/use_function/shadow_core.phpt
index 8f92ff1e1b..8442d77b8c 100644
--- a/Zend/tests/use_function/shadow_core.phpt
+++ b/Zend/tests/use_function/shadow_core.phpt
@@ -3,7 +3,7 @@ shadowing a global core function with a local version
--FILE--
<?php
-require 'includes/foo_strlen.php';
+require 'includes/foo_strlen.inc';
use function foo\strlen;
diff --git a/Zend/tests/use_function/shadow_global.phpt b/Zend/tests/use_function/shadow_global.phpt
index 791bcdf4d5..7c222d3afa 100644
--- a/Zend/tests/use_function/shadow_global.phpt
+++ b/Zend/tests/use_function/shadow_global.phpt
@@ -4,8 +4,8 @@ shadowing a global function with a local version
<?php
namespace {
- require 'includes/global_bar.php';
- require 'includes/foo_bar.php';
+ require 'includes/global_bar.inc';
+ require 'includes/foo_bar.inc';
}
namespace {
diff --git a/Zend/tests/use_unlinked_class.phpt b/Zend/tests/use_unlinked_class.phpt
new file mode 100644
index 0000000000..e85f97821f
--- /dev/null
+++ b/Zend/tests/use_unlinked_class.phpt
@@ -0,0 +1,21 @@
+--TEST--
+Classes can only be used once they are fully linked
+--FILE--
+<?php
+
+spl_autoload_register(function($class) {
+ echo new ReflectionClass(A::class), "\n";
+});
+
+class A implements I {
+}
+
+?>
+--EXPECTF--
+Fatal error: Uncaught ReflectionException: Class A does not exist in %s:%d
+Stack trace:
+#0 %s(%d): ReflectionClass->__construct('A')
+#1 [internal function]: {closure}('I')
+#2 %s(%d): spl_autoload_call('I')
+#3 {main}
+ thrown in %s on line %d
diff --git a/Zend/tests/varSyntax/globalNonSimpleVariableError.phpt b/Zend/tests/varSyntax/globalNonSimpleVariableError.phpt
index ed04921f89..6847c6f2ea 100644
--- a/Zend/tests/varSyntax/globalNonSimpleVariableError.phpt
+++ b/Zend/tests/varSyntax/globalNonSimpleVariableError.phpt
@@ -7,4 +7,4 @@ global $$foo->bar;
?>
--EXPECTF--
-Parse error: syntax error, unexpected '->' (T_OBJECT_OPERATOR), expecting ',' or ';' in %s on line %d
+Parse error: syntax error, unexpected '->' (T_OBJECT_OPERATOR), expecting ';' or ',' in %s on line %d
diff --git a/Zend/tests/varSyntax/newVariable.phpt b/Zend/tests/varSyntax/newVariable.phpt
index 360f99ac36..5505ffc0f1 100644
--- a/Zend/tests/varSyntax/newVariable.phpt
+++ b/Zend/tests/varSyntax/newVariable.phpt
@@ -23,6 +23,7 @@ var_dump(new $weird[0]->foo::$className);
?>
--EXPECTF--
+Deprecated: Array and string offset access syntax with curly braces is deprecated in %s on line %d
object(stdClass)#%d (0) {
}
object(stdClass)#%d (0) {
diff --git a/Zend/tests/variadic/optional_params.phpt b/Zend/tests/variadic/optional_params.phpt
index 6cb516fa0c..ba800032d7 100644
--- a/Zend/tests/variadic/optional_params.phpt
+++ b/Zend/tests/variadic/optional_params.phpt
@@ -3,15 +3,15 @@ Optional parameter before variadic parameter
--FILE--
<?php
-function fn($reqParam, $optParam = null, ...$params) {
+function f($reqParam, $optParam = null, ...$params) {
var_dump($reqParam, $optParam, $params);
}
-
-fn(1);
-fn(1, 2);
-fn(1, 2, 3);
-fn(1, 2, 3, 4);
-fn(1, 2, 3, 4, 5);
+
+f(1);
+f(1, 2);
+f(1, 2, 3);
+f(1, 2, 3, 4);
+f(1, 2, 3, 4, 5);
?>
--EXPECT--
diff --git a/Zend/tests/weakrefs/weakrefs_001.phpt b/Zend/tests/weakrefs/weakrefs_001.phpt
new file mode 100644
index 0000000000..8db0fb2d80
--- /dev/null
+++ b/Zend/tests/weakrefs/weakrefs_001.phpt
@@ -0,0 +1,39 @@
+--TEST--
+WeakReference
+--FILE--
+<?php
+$std = new stdClass;
+
+debug_zval_dump($std);
+
+$wr = WeakReference::create($std);
+$wr2 = WeakReference::create($std);
+
+debug_zval_dump($std);
+
+var_dump($wr, $wr2);
+
+debug_zval_dump($wr->get());
+debug_zval_dump($wr2->get());
+
+unset($std);
+
+debug_zval_dump($wr->get());
+debug_zval_dump($wr2->get());
+?>
+--EXPECT--
+object(stdClass)#1 (0) refcount(2){
+}
+object(stdClass)#1 (0) refcount(2){
+}
+object(WeakReference)#2 (0) {
+}
+object(WeakReference)#2 (0) {
+}
+object(stdClass)#1 (0) refcount(2){
+}
+object(stdClass)#1 (0) refcount(2){
+}
+NULL
+NULL
+
diff --git a/Zend/tests/weakrefs/weakrefs_002.phpt b/Zend/tests/weakrefs/weakrefs_002.phpt
new file mode 100644
index 0000000000..a2e277f98d
--- /dev/null
+++ b/Zend/tests/weakrefs/weakrefs_002.phpt
@@ -0,0 +1,19 @@
+--TEST--
+WeakReference serials
+--FILE--
+<?php
+$wr = WeakReference::create(new stdClass);
+
+try {
+ serialize($wr);
+} catch (Exception $ex) {
+ var_dump($ex->getMessage());
+}
+
+$wrs = 'O:13:"WeakReference":0:{}';
+
+var_dump(@unserialize($wrs));
+?>
+--EXPECT--
+string(47) "Serialization of 'WeakReference' is not allowed"
+bool(false)
diff --git a/Zend/tests/weakrefs/weakrefs_003.phpt b/Zend/tests/weakrefs/weakrefs_003.phpt
new file mode 100644
index 0000000000..e7d8e281c5
--- /dev/null
+++ b/Zend/tests/weakrefs/weakrefs_003.phpt
@@ -0,0 +1,43 @@
+--TEST--
+WeakReference object handlers
+--FILE--
+<?php
+$wr = WeakReference::create(new stdClass);
+
+try {
+ $wr->disallow;
+} catch (Error $ex) {
+ var_dump($ex->getMessage());
+}
+
+try {
+ $wr->disallow = "writes";
+} catch (Error $ex) {
+ var_dump($ex->getMessage());
+}
+
+try {
+ isset($wr->disallow);
+} catch (Error $ex) {
+ var_dump($ex->getMessage());
+}
+
+try {
+ unset($wr->disallow);
+} catch (Error $ex) {
+ var_dump($ex->getMessage());
+}
+
+try {
+ $disallow = &$wr->disallowed;
+} catch (Error $ex) {
+ var_dump($ex->getMessage());
+}
+?>
+--EXPECT--
+string(47) "WeakReference objects do not support properties"
+string(47) "WeakReference objects do not support properties"
+string(47) "WeakReference objects do not support properties"
+string(47) "WeakReference objects do not support properties"
+string(56) "WeakReference objects do not support property references"
+
diff --git a/Zend/tests/weakrefs/weakrefs_004.phpt b/Zend/tests/weakrefs/weakrefs_004.phpt
new file mode 100644
index 0000000000..35fb3c5b3a
--- /dev/null
+++ b/Zend/tests/weakrefs/weakrefs_004.phpt
@@ -0,0 +1,8 @@
+--TEST--
+WeakReference no inheritance
+--FILE--
+<?php
+class Test extends WeakReference {}
+?>
+--EXPECTF--
+Fatal error: Class Test may not inherit from final class (WeakReference) in %s on line %d
diff --git a/Zend/tests/weakrefs/weakrefs_005.phpt b/Zend/tests/weakrefs/weakrefs_005.phpt
new file mode 100644
index 0000000000..a9ba45b760
--- /dev/null
+++ b/Zend/tests/weakrefs/weakrefs_005.phpt
@@ -0,0 +1,12 @@
+--TEST--
+WeakReference no __construct
+--FILE--
+<?php
+new WeakReference();
+?>
+--EXPECTF--
+Fatal error: Uncaught Error: Direct instantiation of 'WeakReference' is not allowed, use WeakReference::create instead in %s:2
+Stack trace:
+#0 %s(2): WeakReference->__construct()
+#1 {main}
+ thrown in %s on line 2
diff --git a/Zend/tests/zend2.php.txt b/Zend/tests/zend2.php.txt
deleted file mode 100644
index afe422eaae..0000000000
--- a/Zend/tests/zend2.php.txt
+++ /dev/null
@@ -1,275 +0,0 @@
-Example 1: A singleton (static members)
-=======================================
-
-<?php
-
- class Counter {
- var $counter = 0;
-
- function increment_and_print()
- {
- print ++$this->counter;
- print "\n";
- }
- }
-
-
- class SingletonCounter {
- static $m_instance = NULL;
-
- function Instance()
- {
- if (self::$m_instance == NULL) {
- self::$m_instance = new Counter();
- }
- return self::$m_instance;
- }
- }
-
- SingletonCounter::Instance()->increment_and_print();
- SingletonCounter::Instance()->increment_and_print();
- SingletonCounter::Instance()->increment_and_print();
-
-?>
-
-Example 2: Factory method (derefencing objects returned from functions)
-=======================================================================
-
-<?php
-
- class Circle {
- function draw()
- {
- print "Circle\n";
- }
- }
-
- class Square {
- function draw()
- {
- print "Square\n";
- }
- }
-
- function ShapeFactoryMethod($shape)
- {
- switch ($shape) {
- case "Circle":
- return new Circle();
- case "Square":
- return new Square();
- }
- }
-
- ShapeFactoryMethod("Circle")->draw();
- ShapeFactoryMethod("Square")->draw();
-
-
-?>
-
-Example 3: Class constants and class scope
-==========================================
-
-<?php
-
- class ErrorCodes {
- const FATAL = "Fatal error\n";
- const WARNING = "Warning\n";
- const INFO = "Informational message\n";
-
- function print_fatal_error_codes()
- {
- print "FATAL = " . FATAL;
- print "self::FATAL = " . self::FATAL;
- }
- }
-
- /* Call the static function and move into the ErrorCodes scope */
- ErrorCodes::print_fatal_error_codes();
-
-?>
-
-Example 4: Regular object method using both local and global functions
-======================================================================
-
-<?php
-
- class HelloWorld {
- const HELLO_WORLD = "Hello, World!\n";
-
- function get_hello_world()
- {
- return HELLO_WORLD;
- }
-
- function length_of_hello_world()
- {
- $str = $this->get_hello_world();
- return strlen($str);
- }
- }
-
- $obj = new HelloWorld();
- print "length_of_hello_world() = " . $obj->length_of_hello_world();
- print "\n";
-?>
-
-Example 5: Multiple derefencing of objects returned from methods
-================================================================
-
-<?php
-
-
- class Name {
- function Name($_name)
- {
- $this->name = $_name;
- }
-
- function display()
- {
- print $this->name;
- print "\n";
- }
- }
-
- class Person {
- function Person($_name, $_address)
- {
- $this->name = new Name($_name);
- }
-
- function getName()
- {
- return $this->name;
- }
- }
-
- $person = new Person("John", "New York");
- $person->getName()->display();
-
-?>
-
-Example 6: Exception handling
-=============================
-
-<?
- class MyException {
- function MyException($_error) {
- $this->error = $_error;
- }
-
- function getException()
- {
- return $this->error;
- }
- }
-
- function ThrowException()
- {
- throw new MyException("'This is an exception!'");
- }
-
-
- try {
- } catch (MyException $exception) {
- print "There was an exception: " . $exception->getException();
- print "\n";
- }
-
- try {
- ThrowException();
- } catch (MyException $exception) {
- print "There was an exception: " . $exception->getException();
- print "\n";
- }
-
-?>
-
-Example 7: __clone()
-===================
-
-<?
- class MyCloneable {
- static $id = 0;
-
- function MyCloneable()
- {
- $this->id = self::$id++;
- }
-
- function __clone()
- {
- $this->name = $that->name;
- $this->address = "New York";
- $this->id = self::$id++;
- }
- }
-
-
-
- $obj = new MyCloneable();
-
- $obj->name = "Hello";
- $obj->address = "Tel-Aviv";
-
- print $obj->id;
- print "\n";
-
- $obj = $obj->__clone();
-
- print $obj->id;
- print "\n";
- print $obj->name;
- print "\n";
- print $obj->address;
- print "\n";
-?>
-
-Example 8: Unified constructors
-===============================
-
-<?
-
- class BaseClass {
- function __construct()
- {
- print "In BaseClass constructor\n";
- }
- }
-
- class SubClass extends BaseClass {
- function __construct()
- {
- parent::__construct();
- print "In SubClass constructor\n";
- }
- }
-
- $obj = new BaseClass();
-
- $obj = new SubClass();
-
-?>
-
-Example 9: Destructors
-=======================
-
-<?php
-
-class MyDestructableClass {
- function __construct()
- {
- print "In constructor\n";
- $this->name = "MyDestructableClass";
- }
-
- function __destruct()
- {
- print "Destroying " . $this->name . "\n";
- }
-}
-
-$obj = new MyDestructableClass();
-
-?>
diff --git a/Zend/zend.c b/Zend/zend.c
index 18ec232262..dc1445bf32 100644
--- a/Zend/zend.c
+++ b/Zend/zend.c
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| Zend Engine |
+----------------------------------------------------------------------+
- | Copyright (c) 1998-2018 Zend Technologies Ltd. (http://www.zend.com) |
+ | Copyright (c) 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 |
@@ -33,9 +33,13 @@
#include "zend_smart_string.h"
#include "zend_cpuinfo.h"
+static size_t global_map_ptr_last = 0;
+
#ifdef ZTS
ZEND_API int compiler_globals_id;
ZEND_API int executor_globals_id;
+ZEND_API size_t compiler_globals_offset;
+ZEND_API size_t executor_globals_offset;
static HashTable *global_function_table = NULL;
static HashTable *global_class_table = NULL;
static HashTable *global_constants_table = NULL;
@@ -59,7 +63,7 @@ ZEND_API zend_bool zend_dtrace_enabled;
/* version information */
static char *zend_version_info;
static uint32_t zend_version_info_length;
-#define ZEND_CORE_VERSION_INFO "Zend Engine v" ZEND_VERSION ", Copyright (c) 1998-2018 Zend Technologies\n"
+#define ZEND_CORE_VERSION_INFO "Zend Engine v" ZEND_VERSION ", Copyright (c) Zend Technologies\n"
#define PRINT_ZVAL_INDENT 4
/* true multithread-shared globals */
@@ -76,6 +80,8 @@ 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, size_t filename_len);
ZEND_API int (*zend_post_startup_cb)(void) = NULL;
+ZEND_API void (*zend_post_shutdown_cb)(void) = NULL;
+ZEND_API int (*zend_preload_autoload)(zend_string *filename) = NULL;
void (*zend_on_timeout)(int seconds);
@@ -159,6 +165,12 @@ static ZEND_INI_MH(OnUpdateAssertions) /* {{{ */
}
/* }}} */
+#if ZEND_DEBUG
+# define SIGNAL_CHECK_DEFAULT "1"
+#else
+# define SIGNAL_CHECK_DEFAULT "0"
+#endif
+
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)
@@ -167,8 +179,9 @@ ZEND_INI_BEGIN()
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)
#ifdef ZEND_SIGNALS
- STD_ZEND_INI_BOOLEAN("zend.signal_check", "0", ZEND_INI_SYSTEM, OnUpdateBool, check, zend_signal_globals_t, zend_signal_globals)
+ STD_ZEND_INI_BOOLEAN("zend.signal_check", SIGNAL_CHECK_DEFAULT, ZEND_INI_SYSTEM, OnUpdateBool, check, zend_signal_globals_t, zend_signal_globals)
#endif
+ STD_ZEND_INI_BOOLEAN("zend.exception_ignore_args", "0", ZEND_INI_ALL, OnUpdateBool, exception_ignore_args, zend_executor_globals, executor_globals)
ZEND_INI_END()
ZEND_API size_t zend_vspprintf(char **pbuf, size_t max_len, const char *format, va_list ap) /* {{{ */
@@ -388,19 +401,17 @@ ZEND_API void zend_print_flat_zval_r(zval *expr) /* {{{ */
break;
case IS_OBJECT:
{
- HashTable *properties = NULL;
+ HashTable *properties;
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_ex(class_name, 0);
- if (GC_IS_RECURSIVE(Z_OBJ_P(expr))) {
+ if (GC_IS_RECURSIVE(Z_COUNTED_P(expr))) {
ZEND_PUTS(" *RECURSION*");
return;
}
- if (Z_OBJ_HANDLER_P(expr, get_properties)) {
- properties = Z_OBJPROP_P(expr);
- }
+ properties = Z_OBJPROP_P(expr);
if (properties) {
GC_PROTECT_RECURSION(Z_OBJ_P(expr));
print_flat_hash(properties);
@@ -439,7 +450,6 @@ static void zend_print_zval_r_to_buf(smart_str *buf, zval *expr, int indent) /*
case IS_OBJECT:
{
HashTable *properties;
- int is_temp;
zend_string *class_name = Z_OBJ_HANDLER_P(expr, get_class_name)(Z_OBJ_P(expr));
smart_str_appends(buf, ZSTR_VAL(class_name));
@@ -450,7 +460,8 @@ static void zend_print_zval_r_to_buf(smart_str *buf, zval *expr, int indent) /*
smart_str_appends(buf, " *RECURSION*");
return;
}
- if ((properties = Z_OBJDEBUG_P(expr, is_temp)) == NULL) {
+
+ if ((properties = zend_get_properties_for(expr, ZEND_PROP_PURPOSE_DEBUG)) == NULL) {
break;
}
@@ -458,10 +469,7 @@ static void zend_print_zval_r_to_buf(smart_str *buf, zval *expr, int indent) /*
print_hash(buf, properties, indent, 1);
GC_UNPROTECT_RECURSION(Z_OBJ_P(expr));
- if (is_temp) {
- zend_hash_destroy(properties);
- FREE_HASHTABLE(properties);
- }
+ zend_release_properties(properties);
break;
}
case IS_LONG:
@@ -523,6 +531,8 @@ static void zend_set_default_compile_time_values(void) /* {{{ */
/* default compile-time values */
CG(short_tags) = short_tags_default;
CG(compiler_options) = compiler_options_default;
+
+ CG(rtd_key_counter) = 0;
}
/* }}} */
@@ -568,8 +578,13 @@ static void auto_global_dtor(zval *zv) /* {{{ */
static void function_copy_ctor(zval *zv) /* {{{ */
{
zend_function *old_func = Z_FUNC_P(zv);
- zend_function *func = pemalloc(sizeof(zend_internal_function), 1);
+ zend_function *func;
+ if (old_func->type == ZEND_USER_FUNCTION) {
+ ZEND_ASSERT(old_func->op_array.fn_flags & ZEND_ACC_IMMUTABLE);
+ return;
+ }
+ func = pemalloc(sizeof(zend_internal_function), 1);
Z_FUNC_P(zv) = func;
memcpy(func, old_func, sizeof(zend_internal_function));
function_add_ref(func);
@@ -630,13 +645,22 @@ static void compiler_globals_ctor(zend_compiler_globals *compiler_globals) /* {{
zend_hash_init_ex(compiler_globals->auto_globals, 8, NULL, auto_global_dtor, 1, 0);
zend_hash_copy(compiler_globals->auto_globals, global_auto_globals_table, auto_global_copy_ctor);
- compiler_globals->last_static_member = zend_hash_num_elements(compiler_globals->class_table);
- if (compiler_globals->last_static_member) {
- compiler_globals->static_members_table = calloc(compiler_globals->last_static_member, sizeof(zval*));
- } else {
- compiler_globals->static_members_table = NULL;
- }
compiler_globals->script_encoding_list = NULL;
+
+#if ZEND_MAP_PTR_KIND == ZEND_MAP_PTR_KIND_PTR_OR_OFFSET
+ /* Map region is going to be created and resized at run-time. */
+ compiler_globals->map_ptr_base = NULL;
+ compiler_globals->map_ptr_size = 0;
+ compiler_globals->map_ptr_last = global_map_ptr_last;
+ if (compiler_globals->map_ptr_last) {
+ /* Allocate map_ptr table */
+ compiler_globals->map_ptr_size = ZEND_MM_ALIGNED_SIZE_EX(compiler_globals->map_ptr_last, 4096);
+ compiler_globals->map_ptr_base = pemalloc(compiler_globals->map_ptr_size * sizeof(void*), 1);
+ memset(compiler_globals->map_ptr_base, 0, compiler_globals->map_ptr_last * sizeof(void*));
+ }
+#else
+# error "Unknown ZEND_MAP_PTR_KIND"
+#endif
}
/* }}} */
@@ -654,20 +678,19 @@ static void compiler_globals_dtor(zend_compiler_globals *compiler_globals) /* {{
zend_hash_destroy(compiler_globals->auto_globals);
free(compiler_globals->auto_globals);
}
- if (compiler_globals->static_members_table) {
- free(compiler_globals->static_members_table);
- }
if (compiler_globals->script_encoding_list) {
pefree((char*)compiler_globals->script_encoding_list, 1);
}
- compiler_globals->last_static_member = 0;
+ if (compiler_globals->map_ptr_base) {
+ free(compiler_globals->map_ptr_base);
+ compiler_globals->map_ptr_base = NULL;
+ compiler_globals->map_ptr_size = 0;
+ }
}
/* }}} */
static void executor_globals_ctor(zend_executor_globals *executor_globals) /* {{{ */
{
- ZEND_TSRMLS_CACHE_UPDATE();
-
zend_startup_constants();
zend_copy_constants(executor_globals->zend_constants, GLOBAL_CONSTANTS_TABLE);
zend_init_rsrc_plist();
@@ -760,14 +783,13 @@ static zend_bool php_auto_globals_create_globals(zend_string *name) /* {{{ */
}
/* }}} */
-int zend_startup(zend_utility_functions *utility_functions, char **extensions) /* {{{ */
+int zend_startup(zend_utility_functions *utility_functions) /* {{{ */
{
#ifdef ZTS
zend_compiler_globals *compiler_globals;
zend_executor_globals *executor_globals;
extern ZEND_API ts_rsrc_id ini_scanner_globals_id;
extern ZEND_API ts_rsrc_id language_scanner_globals_id;
- ZEND_TSRMLS_CACHE_UPDATE();
#else
extern zend_ini_scanner_globals ini_scanner_globals;
extern zend_php_scanner_globals language_scanner_globals;
@@ -858,10 +880,10 @@ int zend_startup(zend_utility_functions *utility_functions, char **extensions) /
zend_init_rsrc_list_dtors();
#ifdef ZTS
- ts_allocate_id(&compiler_globals_id, sizeof(zend_compiler_globals), (ts_allocate_ctor) compiler_globals_ctor, (ts_allocate_dtor) compiler_globals_dtor);
- ts_allocate_id(&executor_globals_id, sizeof(zend_executor_globals), (ts_allocate_ctor) executor_globals_ctor, (ts_allocate_dtor) executor_globals_dtor);
- ts_allocate_id(&language_scanner_globals_id, sizeof(zend_php_scanner_globals), (ts_allocate_ctor) php_scanner_globals_ctor, NULL);
- ts_allocate_id(&ini_scanner_globals_id, sizeof(zend_ini_scanner_globals), (ts_allocate_ctor) ini_scanner_globals_ctor, NULL);
+ ts_allocate_fast_id(&compiler_globals_id, &compiler_globals_offset, sizeof(zend_compiler_globals), (ts_allocate_ctor) compiler_globals_ctor, (ts_allocate_dtor) compiler_globals_dtor);
+ ts_allocate_fast_id(&executor_globals_id, &executor_globals_offset, sizeof(zend_executor_globals), (ts_allocate_ctor) executor_globals_ctor, (ts_allocate_dtor) executor_globals_dtor);
+ ts_allocate_fast_id(&language_scanner_globals_id, &language_scanner_globals_offset, sizeof(zend_php_scanner_globals), (ts_allocate_ctor) php_scanner_globals_ctor, NULL);
+ ts_allocate_fast_id(&ini_scanner_globals_id, &ini_scanner_globals_offset, sizeof(zend_ini_scanner_globals), (ts_allocate_ctor) ini_scanner_globals_ctor, NULL);
compiler_globals = ts_resource(compiler_globals_id);
executor_globals = ts_resource(executor_globals_id);
@@ -883,6 +905,22 @@ int zend_startup(zend_utility_functions *utility_functions, char **extensions) /
#ifdef ZEND_WIN32
zend_get_windows_version_info(&EG(windows_version_info));
#endif
+# if ZEND_MAP_PTR_KIND == ZEND_MAP_PTR_KIND_PTR
+ /* Create a map region, used for indirect pointers from shared to
+ * process memory. It's allocatred once and never resized.
+ * All processes must map it into the same address space.
+ */
+ CG(map_ptr_size) = 1024 * 1024; // TODO: initial size ???
+ CG(map_ptr_last) = 0;
+ CG(map_ptr_base) = pemalloc(CG(map_ptr_size) * sizeof(void*), 1);
+# elif ZEND_MAP_PTR_KIND == ZEND_MAP_PTR_KIND_PTR_OR_OFFSET
+ /* Map region is going to be created and resized at run-time. */
+ CG(map_ptr_base) = NULL;
+ CG(map_ptr_size) = 0;
+ CG(map_ptr_last) = 0;
+# else
+# error "Unknown ZEND_MAP_PTR_KIND"
+# endif
#endif
EG(error_reporting) = E_ALL & ~E_NOTICE;
@@ -921,6 +959,35 @@ void zend_register_standard_ini_entries(void) /* {{{ */
}
/* }}} */
+static void zend_resolve_property_types(void) /* {{{ */
+{
+ zend_class_entry *ce;
+ zend_property_info *prop_info;
+
+ ZEND_HASH_FOREACH_PTR(CG(class_table), ce) {
+ if (ce->type != ZEND_INTERNAL_CLASS) {
+ continue;
+ }
+
+ if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(ce))) {
+ ZEND_HASH_FOREACH_PTR(&ce->properties_info, prop_info) {
+ if (ZEND_TYPE_IS_NAME(prop_info->type)) {
+ zend_string *type_name = ZEND_TYPE_NAME(prop_info->type);
+ zend_string *lc_type_name = zend_string_tolower(type_name);
+ zend_class_entry *prop_ce = zend_hash_find_ptr(CG(class_table), lc_type_name);
+
+ ZEND_ASSERT(prop_ce && prop_ce->type == ZEND_INTERNAL_CLASS);
+ prop_info->type = ZEND_TYPE_ENCODE_CE(prop_ce, ZEND_TYPE_ALLOW_NULL(prop_info->type));
+ zend_string_release(lc_type_name);
+ zend_string_release(type_name);
+ }
+ } ZEND_HASH_FOREACH_END();
+ }
+ ce->ce_flags |= ZEND_ACC_PROPERTY_TYPES_RESOLVED;
+ } ZEND_HASH_FOREACH_END();
+}
+/* }}} */
+
/* Unlink the global (r/o) copies of the class, function and constant tables,
* and use a fresh r/w copy for the startup thread
*/
@@ -931,17 +998,35 @@ int zend_post_startup(void) /* {{{ */
zend_compiler_globals *compiler_globals = ts_resource(compiler_globals_id);
zend_executor_globals *executor_globals = ts_resource(executor_globals_id);
+#endif
+
+ zend_resolve_property_types();
+
+ if (zend_post_startup_cb) {
+ int (*cb)(void) = zend_post_startup_cb;
+
+ zend_post_startup_cb = NULL;
+ if (cb() != SUCCESS) {
+ return FAILURE;
+ }
+ }
+#ifdef ZTS
*GLOBAL_FUNCTION_TABLE = *compiler_globals->function_table;
*GLOBAL_CLASS_TABLE = *compiler_globals->class_table;
*GLOBAL_CONSTANTS_TABLE = *executor_globals->zend_constants;
+ global_map_ptr_last = compiler_globals->map_ptr_last;
short_tags_default = CG(short_tags);
compiler_options_default = CG(compiler_options);
zend_destroy_rsrc_list(&EG(persistent_list));
free(compiler_globals->function_table);
+ compiler_globals->function_table = NULL;
free(compiler_globals->class_table);
+ compiler_globals->class_table = NULL;
+ free(compiler_globals->map_ptr_base);
+ compiler_globals->map_ptr_base = NULL;
if ((script_encoding_list = (zend_encoding **)compiler_globals->script_encoding_list)) {
compiler_globals_ctor(compiler_globals);
compiler_globals->script_encoding_list = (const zend_encoding **)script_encoding_list;
@@ -949,21 +1034,15 @@ int zend_post_startup(void) /* {{{ */
compiler_globals_ctor(compiler_globals);
}
free(EG(zend_constants));
+ EG(zend_constants) = NULL;
executor_globals_ctor(executor_globals);
global_persistent_list = &EG(persistent_list);
zend_copy_ini_directives();
+#else
+ global_map_ptr_last = CG(map_ptr_last);
#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;
}
/* }}} */
@@ -999,6 +1078,19 @@ void zend_shutdown(void) /* {{{ */
GLOBAL_CLASS_TABLE = NULL;
GLOBAL_AUTO_GLOBALS_TABLE = NULL;
GLOBAL_CONSTANTS_TABLE = NULL;
+ ts_free_id(executor_globals_id);
+ ts_free_id(compiler_globals_id);
+#else
+ if (CG(map_ptr_base)) {
+ free(CG(map_ptr_base));
+ CG(map_ptr_base) = NULL;
+ CG(map_ptr_size) = 0;
+ }
+ if (CG(script_encoding_list)) {
+ free(CG(script_encoding_list));
+ CG(script_encoding_list) = NULL;
+ CG(script_encoding_list_size) = 0;
+ }
#endif
zend_destroy_rsrc_list_dtors();
}
@@ -1007,7 +1099,6 @@ void zend_shutdown(void) /* {{{ */
void zend_set_utility_values(zend_utility_values *utility_values) /* {{{ */
{
zend_uv = *utility_values;
- zend_uv.import_use_extension_length = (uint32_t)strlen(zend_uv.import_use_extension);
}
/* }}} */
@@ -1026,7 +1117,7 @@ ZEND_COLD void zenderror(const char *error) /* {{{ */
/* }}} */
BEGIN_EXTERN_C()
-ZEND_API ZEND_COLD void _zend_bailout(const char *filename, uint32_t lineno) /* {{{ */
+ZEND_API ZEND_COLD ZEND_NORETURN void _zend_bailout(const char *filename, uint32_t lineno) /* {{{ */
{
if (!EG(bailout)) {
@@ -1080,6 +1171,9 @@ ZEND_API void zend_activate(void) /* {{{ */
init_compiler();
init_executor();
startup_scanner();
+ if (CG(map_ptr_last)) {
+ memset(CG(map_ptr_base), 0, CG(map_ptr_last) * sizeof(void*));
+ }
}
/* }}} */
@@ -1165,20 +1259,13 @@ ZEND_API zval *zend_get_configuration_directive(zend_string *name) /* {{{ */
} \
} while (0)
-#if !defined(HAVE_NORETURN) || defined(HAVE_NORETURN_ALIAS)
-ZEND_API ZEND_COLD void zend_error(int type, const char *format, ...) /* {{{ */
-#else
-static ZEND_COLD void zend_error_va_list(int type, const char *format, va_list args)
-#endif
+static ZEND_COLD void zend_error_va_list(
+ int type, const char *error_filename, uint32_t error_lineno,
+ const char *format, va_list args)
{
-#if !defined(HAVE_NORETURN) || defined(HAVE_NORETURN_ALIAS)
- va_list args;
-#endif
va_list usr_copy;
zval params[5];
zval retval;
- const char *error_filename;
- uint32_t error_lineno = 0;
zval orig_user_error_handler;
zend_bool in_compilation;
zend_class_entry *saved_class_entry;
@@ -1219,70 +1306,15 @@ static ZEND_COLD void zend_error_va_list(int type, const char *format, va_list a
}
}
- /* Obtain relevant filename and lineno */
- switch (type) {
- case E_CORE_ERROR:
- case E_CORE_WARNING:
- error_filename = NULL;
- error_lineno = 0;
- break;
- case E_PARSE:
- case E_COMPILE_ERROR:
- case E_COMPILE_WARNING:
- case E_ERROR:
- case E_NOTICE:
- case E_STRICT:
- case E_DEPRECATED:
- case E_WARNING:
- case E_USER_ERROR:
- case E_USER_WARNING:
- case E_USER_NOTICE:
- case E_USER_DEPRECATED:
- case E_RECOVERABLE_ERROR:
- if (zend_is_compiling()) {
- error_filename = ZSTR_VAL(zend_get_compiled_filename());
- error_lineno = zend_get_compiled_lineno();
- } else if (zend_is_executing()) {
- error_filename = zend_get_executed_filename();
- if (error_filename[0] == '[') { /* [no active file] */
- error_filename = NULL;
- error_lineno = 0;
- } else {
- error_lineno = zend_get_executed_lineno();
- }
- } else {
- error_filename = NULL;
- error_lineno = 0;
- }
- break;
- default:
- error_filename = NULL;
- error_lineno = 0;
- break;
- }
- if (!error_filename) {
- error_filename = "Unknown";
- }
-
#ifdef HAVE_DTRACE
if (DTRACE_ERROR_ENABLED()) {
char *dtrace_error_buffer;
-#if !defined(HAVE_NORETURN) || defined(HAVE_NORETURN_ALIAS)
- va_start(args, format);
-#endif
zend_vspprintf(&dtrace_error_buffer, 0, format, args);
DTRACE_ERROR(dtrace_error_buffer, (char *)error_filename, error_lineno);
efree(dtrace_error_buffer);
-#if !defined(HAVE_NORETURN) || defined(HAVE_NORETURN_ALIAS)
- va_end(args);
-#endif
}
#endif /* HAVE_DTRACE */
-#if !defined(HAVE_NORETURN) || defined(HAVE_NORETURN_ALIAS)
- va_start(args, format);
-#endif
-
/* if we don't have a user defined error handler */
if (Z_TYPE(EG(user_error_handler)) == IS_UNDEF
|| !(EG(user_error_handler_error_reporting) & type)
@@ -1328,7 +1360,7 @@ static ZEND_COLD void zend_error_va_list(int type, const char *format, va_list a
/* User error handler may include() additinal PHP files.
* If an error was generated during comilation PHP will compile
- * such scripts recursivly, but some CG() variables may be
+ * such scripts recursively, but some CG() variables may be
* inconsistent. */
in_compilation = CG(in_compilation);
@@ -1376,10 +1408,6 @@ static ZEND_COLD void zend_error_va_list(int type, const char *format, va_list a
break;
}
-#if !defined(HAVE_NORETURN) || defined(HAVE_NORETURN_ALIAS)
- va_end(args);
-#endif
-
if (type == E_PARSE) {
/* eval() errors do not affect exit_status */
if (!(EG(current_execute_data) &&
@@ -1393,30 +1421,110 @@ static ZEND_COLD void zend_error_va_list(int type, const char *format, va_list a
}
/* }}} */
-#ifdef HAVE_NORETURN
-# ifdef HAVE_NORETURN_ALIAS
-ZEND_COLD void zend_error_noreturn(int type, const char *format, ...) __attribute__ ((alias("zend_error"),noreturn));
-# else
-ZEND_API ZEND_COLD void zend_error(int type, const char *format, ...) /* {{{ */
+static ZEND_COLD void get_filename_lineno(int type, const char **filename, uint32_t *lineno) {
+ /* Obtain relevant filename and lineno */
+ switch (type) {
+ case E_CORE_ERROR:
+ case E_CORE_WARNING:
+ *filename = NULL;
+ *lineno = 0;
+ break;
+ case E_PARSE:
+ case E_COMPILE_ERROR:
+ case E_COMPILE_WARNING:
+ case E_ERROR:
+ case E_NOTICE:
+ case E_STRICT:
+ case E_DEPRECATED:
+ case E_WARNING:
+ case E_USER_ERROR:
+ case E_USER_WARNING:
+ case E_USER_NOTICE:
+ case E_USER_DEPRECATED:
+ case E_RECOVERABLE_ERROR:
+ if (zend_is_compiling()) {
+ *filename = ZSTR_VAL(zend_get_compiled_filename());
+ *lineno = zend_get_compiled_lineno();
+ } else if (zend_is_executing()) {
+ *filename = zend_get_executed_filename();
+ if ((*filename)[0] == '[') { /* [no active file] */
+ *filename = NULL;
+ *lineno = 0;
+ } else {
+ *lineno = zend_get_executed_lineno();
+ }
+ } else {
+ *filename = NULL;
+ *lineno = 0;
+ }
+ break;
+ default:
+ *filename = NULL;
+ *lineno = 0;
+ break;
+ }
+ if (!*filename) {
+ *filename = "Unknown";
+ }
+}
+
+ZEND_API ZEND_COLD void zend_error_at(
+ int type, const char *filename, uint32_t lineno, const char *format, ...) {
+ va_list args;
+
+ if (!filename) {
+ uint32_t dummy_lineno;
+ get_filename_lineno(type, &filename, &dummy_lineno);
+ }
+
+ va_start(args, format);
+ zend_error_va_list(type, filename, lineno, format, args);
+ va_end(args);
+}
+
+ZEND_API ZEND_COLD void zend_error(int type, const char *format, ...) {
+ const char *filename;
+ uint32_t lineno;
+ va_list args;
+
+ get_filename_lineno(type, &filename, &lineno);
+ va_start(args, format);
+ zend_error_va_list(type, filename, lineno, format, args);
+ va_end(args);
+}
+
+ZEND_API ZEND_COLD ZEND_NORETURN void zend_error_at_noreturn(
+ int type, const char *filename, uint32_t lineno, const char *format, ...)
{
- va_list va;
+ va_list args;
- va_start(va, format);
- zend_error_va_list(type, format, va);
- va_end(va);
+ if (!filename) {
+ uint32_t dummy_lineno;
+ get_filename_lineno(type, &filename, &dummy_lineno);
+ }
+
+ va_start(args, format);
+ zend_error_va_list(type, filename, lineno, format, args);
+ va_end(args);
+ /* Should never reach this. */
+ abort();
}
+/* }}} */
ZEND_API ZEND_COLD ZEND_NORETURN void zend_error_noreturn(int type, const char *format, ...)
{
- va_list va;
+ const char *filename;
+ uint32_t lineno;
+ va_list args;
- va_start(va, format);
- zend_error_va_list(type, format, va);
- va_end(va);
+ get_filename_lineno(type, &filename, &lineno);
+ va_start(args, format);
+ zend_error_va_list(type, filename, lineno, format, args);
+ va_end(args);
+ /* Should never reach this. */
+ abort();
}
/* }}} */
-# endif
-#endif
ZEND_API ZEND_COLD void zend_throw_error(zend_class_entry *exception_ce, const char *format, ...) /* {{{ */
{
@@ -1432,6 +1540,11 @@ ZEND_API ZEND_COLD void zend_throw_error(zend_class_entry *exception_ce, const c
exception_ce = zend_ce_error;
}
+ /* Marker used to disable exception generation during preloading. */
+ if (EG(exception) == (void*)(uintptr_t)-1) {
+ return;
+ }
+
va_start(va, format);
zend_vspprintf(&message, 0, format, va);
@@ -1519,29 +1632,25 @@ ZEND_API ZEND_COLD void zend_output_debug_string(zend_bool trigger_break, const
}
/* }}} */
-ZEND_API void zend_try_exception_handler() /* {{{ */
+ZEND_API ZEND_COLD void zend_user_exception_handler(void) /* {{{ */
{
- if (EG(exception)) {
- if (Z_TYPE(EG(user_exception_handler)) != IS_UNDEF) {
- zval orig_user_exception_handler;
- zval params[1], retval2;
- zend_object *old_exception;
- old_exception = EG(exception);
+ zval orig_user_exception_handler;
+ zval params[1], retval2;
+ zend_object *old_exception;
+ old_exception = EG(exception);
+ EG(exception) = NULL;
+ ZVAL_OBJ(&params[0], old_exception);
+ ZVAL_COPY_VALUE(&orig_user_exception_handler, &EG(user_exception_handler));
+
+ 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));
EG(exception) = NULL;
- ZVAL_OBJ(&params[0], old_exception);
- ZVAL_COPY_VALUE(&orig_user_exception_handler, &EG(user_exception_handler));
-
- 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));
- EG(exception) = NULL;
- }
- OBJ_RELEASE(old_exception);
- } else {
- EG(exception) = old_exception;
- }
}
+ OBJ_RELEASE(old_exception);
+ } else {
+ EG(exception) = old_exception;
}
} /* }}} */
@@ -1567,9 +1676,13 @@ ZEND_API int zend_execute_scripts(int type, zval *retval, int file_count, ...) /
if (op_array) {
zend_execute(op_array, retval);
zend_exception_restore();
- zend_try_exception_handler();
- if (EG(exception)) {
- zend_exception_error(EG(exception), E_ERROR);
+ if (UNEXPECTED(EG(exception))) {
+ if (Z_TYPE(EG(user_exception_handler)) != IS_UNDEF) {
+ zend_user_exception_handler();
+ }
+ if (EG(exception)) {
+ zend_exception_error(EG(exception), E_ERROR);
+ }
}
destroy_op_array(op_array);
efree_size(op_array, sizeof(zend_op_array));
@@ -1614,12 +1727,58 @@ void free_estring(char **str_p) /* {{{ */
}
/* }}} */
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * indent-tabs-mode: t
- * End:
- * vim600: sw=4 ts=4 fdm=marker
- * vim<600: sw=4 ts=4
- */
+ZEND_API void zend_map_ptr_reset(void)
+{
+ CG(map_ptr_last) = global_map_ptr_last;
+}
+
+ZEND_API void *zend_map_ptr_new(void)
+{
+ void **ptr;
+
+ if (CG(map_ptr_last) >= CG(map_ptr_size)) {
+#if ZEND_MAP_PTR_KIND == ZEND_MAP_PTR_KIND_PTR
+ // TODO: error ???
+ ZEND_ASSERT(0);
+#elif ZEND_MAP_PTR_KIND == ZEND_MAP_PTR_KIND_PTR_OR_OFFSET
+ /* Grow map_ptr table */
+ CG(map_ptr_size) = ZEND_MM_ALIGNED_SIZE_EX(CG(map_ptr_last) + 1, 4096);
+ CG(map_ptr_base) = perealloc(CG(map_ptr_base), CG(map_ptr_size) * sizeof(void*), 1);
+#else
+# error "Unknown ZEND_MAP_PTR_KIND"
+#endif
+ }
+ ptr = (void**)CG(map_ptr_base) + CG(map_ptr_last);
+ *ptr = NULL;
+ CG(map_ptr_last)++;
+#if ZEND_MAP_PTR_KIND == ZEND_MAP_PTR_KIND_PTR
+ return ptr;
+#elif ZEND_MAP_PTR_KIND == ZEND_MAP_PTR_KIND_PTR_OR_OFFSET
+ return ZEND_MAP_PTR_PTR2OFFSET(ptr);
+#else
+# error "Unknown ZEND_MAP_PTR_KIND"
+#endif
+}
+
+ZEND_API void zend_map_ptr_extend(size_t last)
+{
+ if (last > CG(map_ptr_last)) {
+ void **ptr;
+
+ if (last >= CG(map_ptr_size)) {
+#if ZEND_MAP_PTR_KIND == ZEND_MAP_PTR_KIND_PTR
+ /* This may never happen */
+ ZEND_ASSERT(0);
+#elif ZEND_MAP_PTR_KIND == ZEND_MAP_PTR_KIND_PTR_OR_OFFSET
+ /* Grow map_ptr table */
+ CG(map_ptr_size) = ZEND_MM_ALIGNED_SIZE_EX(last, 4096);
+ CG(map_ptr_base) = perealloc(CG(map_ptr_base), CG(map_ptr_size) * sizeof(void*), 1);
+#else
+# error "Unknown ZEND_MAP_PTR_KIND"
+#endif
+ }
+ ptr = (void**)CG(map_ptr_base) + CG(map_ptr_last);
+ memset(ptr, 0, (last - CG(map_ptr_last)) * sizeof(void*));
+ CG(map_ptr_last) = last;
+ }
+}
diff --git a/Zend/zend.h b/Zend/zend.h
index 98931f3c83..94fd9a3559 100644
--- a/Zend/zend.h
+++ b/Zend/zend.h
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| Zend Engine |
+----------------------------------------------------------------------+
- | Copyright (c) 1998-2018 Zend Technologies Ltd. (http://www.zend.com) |
+ | Copyright (c) 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 |
@@ -20,11 +20,12 @@
#ifndef ZEND_H
#define ZEND_H
-#define ZEND_VERSION "3.3.22-dev"
+#define ZEND_VERSION "3.4.0"
#define ZEND_ENGINE_3
#include "zend_types.h"
+#include "zend_map_ptr.h"
#include "zend_errors.h"
#include "zend_alloc.h"
#include "zend_llist.h"
@@ -39,6 +40,8 @@
#include "zend_smart_string_public.h"
#include "zend_signal.h"
+#define zend_sprintf sprintf
+
#define HANDLE_BLOCK_INTERRUPTIONS() ZEND_SIGNAL_BLOCK_INTERRUPTIONS()
#define HANDLE_UNBLOCK_INTERRUPTIONS() ZEND_SIGNAL_UNBLOCK_INTERRUPTIONS()
@@ -52,12 +55,14 @@
#ifdef ZEND_ENABLE_STATIC_TSRMLS_CACHE
#define ZEND_TSRMG TSRMG_STATIC
+#define ZEND_TSRMG_FAST TSRMG_FAST_STATIC
#define ZEND_TSRMLS_CACHE_EXTERN() TSRMLS_CACHE_EXTERN()
#define ZEND_TSRMLS_CACHE_DEFINE() TSRMLS_CACHE_DEFINE()
#define ZEND_TSRMLS_CACHE_UPDATE() TSRMLS_CACHE_UPDATE()
#define ZEND_TSRMLS_CACHE TSRMLS_CACHE
#else
#define ZEND_TSRMG TSRMG
+#define ZEND_TSRMG_FAST TSRMG_FAST
#define ZEND_TSRMLS_CACHE_EXTERN()
#define ZEND_TSRMLS_CACHE_DEFINE()
#define ZEND_TSRMLS_CACHE_UPDATE()
@@ -66,22 +71,17 @@
ZEND_TSRMLS_CACHE_EXTERN()
-#ifdef HAVE_NORETURN
-# ifdef ZEND_NORETURN_ALIAS
-ZEND_COLD void zend_error_noreturn(int type, const char *format, ...) ZEND_NORETURN ZEND_ATTRIBUTE_FORMAT(printf, 2, 3);
-# else
-ZEND_API ZEND_COLD ZEND_NORETURN void zend_error_noreturn(int type, const char *format, ...) ZEND_ATTRIBUTE_FORMAT(printf, 2, 3);
-# endif
-#else
-# define zend_error_noreturn zend_error
-#endif
-
struct _zend_serialize_data;
struct _zend_unserialize_data;
typedef struct _zend_serialize_data zend_serialize_data;
typedef struct _zend_unserialize_data zend_unserialize_data;
+typedef struct _zend_class_name {
+ zend_string *name;
+ zend_string *lc_name;
+} zend_class_name;
+
typedef struct _zend_trait_method_reference {
zend_string *method_name;
zend_string *class_name;
@@ -110,7 +110,11 @@ typedef struct _zend_trait_alias {
struct _zend_class_entry {
char type;
zend_string *name;
- struct _zend_class_entry *parent;
+ /* class_entry or string depending on ZEND_ACC_LINKED */
+ union {
+ zend_class_entry *parent;
+ zend_string *parent_name;
+ };
int refcount;
uint32_t ce_flags;
@@ -118,24 +122,26 @@ struct _zend_class_entry {
int default_static_members_count;
zval *default_properties_table;
zval *default_static_members_table;
- zval *static_members_table;
+ ZEND_MAP_PTR_DEF(zval *, static_members_table);
HashTable function_table;
HashTable properties_info;
HashTable constants_table;
- union _zend_function *constructor;
- union _zend_function *destructor;
- union _zend_function *clone;
- union _zend_function *__get;
- union _zend_function *__set;
- union _zend_function *__unset;
- union _zend_function *__isset;
- union _zend_function *__call;
- union _zend_function *__callstatic;
- union _zend_function *__tostring;
- union _zend_function *__debugInfo;
- union _zend_function *serialize_func;
- union _zend_function *unserialize_func;
+ struct _zend_property_info **properties_info_table;
+
+ zend_function *constructor;
+ zend_function *destructor;
+ zend_function *clone;
+ zend_function *__get;
+ zend_function *__set;
+ zend_function *__unset;
+ zend_function *__isset;
+ zend_function *__call;
+ zend_function *__callstatic;
+ zend_function *__tostring;
+ zend_function *__debugInfo;
+ zend_function *serialize_func;
+ zend_function *unserialize_func;
/* allocated only if class implements Iterator or IteratorAggregate interface */
zend_class_iterator_funcs *iterator_funcs_ptr;
@@ -146,7 +152,7 @@ struct _zend_class_entry {
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);
- union _zend_function *(*get_static_method)(zend_class_entry *ce, zend_string* method);
+ zend_function *(*get_static_method)(zend_class_entry *ce, zend_string* method);
/* serializer callbacks */
int (*serialize)(zval *object, unsigned char **buffer, size_t *buf_len, zend_serialize_data *data);
@@ -154,9 +160,14 @@ struct _zend_class_entry {
uint32_t num_interfaces;
uint32_t num_traits;
- zend_class_entry **interfaces;
- zend_class_entry **traits;
+ /* class_entry or string(s) depending on ZEND_ACC_LINKED */
+ union {
+ zend_class_entry **interfaces;
+ zend_class_name *interface_names;
+ };
+
+ zend_class_name *trait_names;
zend_trait_alias **trait_aliases;
zend_trait_precedence **trait_precedences;
@@ -191,8 +202,6 @@ typedef struct _zend_utility_functions {
} zend_utility_functions;
typedef struct _zend_utility_values {
- char *import_use_extension;
- uint32_t import_use_extension_length;
zend_bool html_errors;
} zend_utility_values;
@@ -217,13 +226,13 @@ typedef int (*zend_write_func_t)(const char *str, size_t str_length);
#define zend_first_try EG(bailout)=NULL; zend_try
BEGIN_EXTERN_C()
-int zend_startup(zend_utility_functions *utility_functions, char **extensions);
+int zend_startup(zend_utility_functions *utility_functions);
void zend_shutdown(void);
void zend_register_standard_ini_entries(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);
+ZEND_API ZEND_COLD ZEND_NORETURN void _zend_bailout(const char *filename, uint32_t lineno);
ZEND_API size_t zend_vspprintf(char **pbuf, size_t max_len, const char *format, va_list ap);
ZEND_API size_t zend_spprintf(char **message, size_t max_len, const char *format, ...) ZEND_ATTRIBUTE_FORMAT(printf, 3, 4);
@@ -255,6 +264,7 @@ ZEND_API void zend_deactivate_modules(void);
ZEND_API void zend_post_deactivate_modules(void);
ZEND_API void free_estring(char **str_p);
+
END_EXTERN_C()
/* output support */
@@ -277,9 +287,20 @@ extern void (*zend_printf_to_smart_string)(smart_string *buf, const char *format
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, size_t filename_len);
+
+/* These two callbacks are especially for opcache */
extern ZEND_API int (*zend_post_startup_cb)(void);
+extern ZEND_API void (*zend_post_shutdown_cb)(void);
+
+/* Callback for loading of not preloaded part of the script */
+extern ZEND_API int (*zend_preload_autoload)(zend_string *filename);
ZEND_API ZEND_COLD void zend_error(int type, const char *format, ...) ZEND_ATTRIBUTE_FORMAT(printf, 2, 3);
+ZEND_API ZEND_COLD ZEND_NORETURN void zend_error_noreturn(int type, const char *format, ...) ZEND_ATTRIBUTE_FORMAT(printf, 2, 3);
+/* If filename is NULL the default filename is used. */
+ZEND_API ZEND_COLD void zend_error_at(int type, const char *filename, uint32_t lineno, const char *format, ...) ZEND_ATTRIBUTE_FORMAT(printf, 4, 5);
+ZEND_API ZEND_COLD ZEND_NORETURN void zend_error_at_noreturn(int type, const char *filename, uint32_t lineno, const char *format, ...) ZEND_ATTRIBUTE_FORMAT(printf, 4, 5);
+
ZEND_API ZEND_COLD void zend_throw_error(zend_class_entry *exception_ce, const char *format, ...) ZEND_ATTRIBUTE_FORMAT(printf, 2, 3);
ZEND_API ZEND_COLD void zend_type_error(const char *format, ...) ZEND_ATTRIBUTE_FORMAT(printf, 1, 2);
ZEND_API ZEND_COLD void zend_internal_type_error(zend_bool throw_exception, const char *format, ...) ZEND_ATTRIBUTE_FORMAT(printf, 2, 3);
@@ -335,13 +356,3 @@ ZEND_API void zend_restore_error_handling(zend_error_handling *saved);
#include "zend_operators.h"
#endif /* ZEND_H */
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * indent-tabs-mode: t
- * End:
- * vim600: sw=4 ts=4 fdm=marker
- * vim<600: sw=4 ts=4
- */
diff --git a/Zend/zend.ico b/Zend/zend.ico
deleted file mode 100644
index 80978a6c7e..0000000000
--- a/Zend/zend.ico
+++ /dev/null
Binary files differ
diff --git a/Zend/zend_API.c b/Zend/zend_API.c
index bc67c6a1b6..b7af44a32a 100644
--- a/Zend/zend_API.c
+++ b/Zend/zend_API.c
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| Zend Engine |
+----------------------------------------------------------------------+
- | Copyright (c) 1998-2018 Zend Technologies Ltd. (http://www.zend.com) |
+ | Copyright (c) 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 |
@@ -29,10 +29,9 @@
#include "zend_exceptions.h"
#include "zend_closures.h"
#include "zend_inheritance.h"
+#include "zend_ini.h"
-#ifdef HAVE_STDARG_H
#include <stdarg.h>
-#endif
/* these variables are true statics/globals, and have to be mutex'ed on every access */
ZEND_API HashTable module_registry;
@@ -250,12 +249,16 @@ ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_parameters_count_exception(int
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);
+ const char *class_name;
static const char * const expected_error[] = {
Z_EXPECTED_TYPES(Z_EXPECTED_TYPE_STR)
NULL
};
+ if (EG(exception)) {
+ return;
+ }
+ 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, expected_error[expected_type], zend_zval_type_name(arg));
}
@@ -264,12 +267,16 @@ ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_parameter_type_error(int num, z
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);
+ const char *class_name;
static const char * const expected_error[] = {
Z_EXPECTED_TYPES(Z_EXPECTED_TYPE_STR)
NULL
};
+ if (EG(exception)) {
+ return;
+ }
+ class_name = get_active_class_name(&space);
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));
}
@@ -278,8 +285,12 @@ ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_parameter_type_exception(int nu
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);
+ const char *class_name;
+ if (EG(exception)) {
+ return;
+ }
+ 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));
}
@@ -288,8 +299,12 @@ ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_parameter_class_error(int num,
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);
+ const char *class_name;
+ if (EG(exception)) {
+ return;
+ }
+ class_name = get_active_class_name(&space);
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));
}
@@ -298,8 +313,12 @@ ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_parameter_class_exception(int n
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);
+ const char *class_name;
+ if (EG(exception)) {
+ return;
+ }
+ 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);
@@ -309,8 +328,12 @@ ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_callback_error(int num, char *e
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);
+ const char *class_name;
+ if (EG(exception)) {
+ return;
+ }
+ 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);
@@ -336,7 +359,11 @@ ZEND_API int ZEND_FASTCALL zend_parse_arg_class(zval *arg, zend_class_entry **pc
*pce = NULL;
return 1;
}
- convert_to_string_ex(arg);
+ if (!try_convert_to_string(arg)) {
+ *pce = NULL;
+ return 0;
+ }
+
*pce = zend_lookup_class(Z_STR_P(arg));
if (ce_base) {
if ((!*pce || !instanceof_function(*pce, ce_base))) {
@@ -412,6 +439,9 @@ ZEND_API int ZEND_FASTCALL zend_parse_arg_long_weak(zval *arg, zend_long *dest)
return 0;
}
}
+ if (UNEXPECTED(EG(exception))) {
+ return 0;
+ }
} else if (EXPECTED(Z_TYPE_P(arg) < IS_TRUE)) {
*dest = 0;
} else if (EXPECTED(Z_TYPE_P(arg) == IS_TRUE)) {
@@ -453,6 +483,9 @@ ZEND_API int ZEND_FASTCALL zend_parse_arg_long_cap_weak(zval *arg, zend_long *de
return 0;
}
}
+ if (UNEXPECTED(EG(exception))) {
+ return 0;
+ }
} else if (EXPECTED(Z_TYPE_P(arg) < IS_TRUE)) {
*dest = 0;
} else if (EXPECTED(Z_TYPE_P(arg) == IS_TRUE)) {
@@ -488,6 +521,9 @@ ZEND_API int ZEND_FASTCALL zend_parse_arg_double_weak(zval *arg, double *dest) /
return 0;
}
}
+ if (UNEXPECTED(EG(exception))) {
+ return 0;
+ }
} else if (EXPECTED(Z_TYPE_P(arg) < IS_TRUE)) {
*dest = 0.0;
} else if (EXPECTED(Z_TYPE_P(arg) == IS_TRUE)) {
@@ -733,7 +769,11 @@ static const char *zend_parse_arg_impl(int arg_num, zval *arg, va_list *va, cons
*pce = NULL;
break;
}
- convert_to_string_ex(arg);
+ if (!try_convert_to_string(arg)) {
+ *pce = NULL;
+ return "valid class name";
+ }
+
if ((lookup = zend_lookup_class(Z_STR_P(arg))) == NULL) {
*pce = NULL;
} else {
@@ -819,6 +859,9 @@ static int zend_parse_arg(int arg_num, zval *arg, va_list *va, const char **spec
expected_type = zend_parse_arg_impl(arg_num, arg, va, spec, &error, &severity);
if (expected_type) {
+ if (EG(exception)) {
+ return FAILURE;
+ }
if (!(flags & ZEND_PARSE_PARAMS_QUIET) && (*expected_type || error)) {
const char *space;
const char *class_name = get_active_class_name(&space);
@@ -1165,6 +1208,12 @@ ZEND_API int zend_update_class_constants(zend_class_entry *class_type) /* {{{ */
}
} ZEND_HASH_FOREACH_END();
+ if (class_type->default_static_members_count && !CE_STATIC_MEMBERS(class_type)) {
+ if (class_type->type == ZEND_INTERNAL_CLASS || (class_type->ce_flags & (ZEND_ACC_IMMUTABLE|ZEND_ACC_PRELOADED))) {
+ zend_class_init_statics(class_type);
+ }
+ }
+
ce = class_type;
while (ce) {
ZEND_HASH_FOREACH_PTR(&ce->properties_info, prop_info) {
@@ -1174,9 +1223,23 @@ ZEND_API int zend_update_class_constants(zend_class_entry *class_type) /* {{{ */
} 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)) {
+ if (prop_info->type) {
+ zval tmp;
+
+ ZVAL_COPY(&tmp, val);
+ if (UNEXPECTED(zval_update_constant_ex(&tmp, ce) != SUCCESS)) {
+ zval_ptr_dtor(&tmp);
+ return FAILURE;
+ }
+ /* property initializers must always be evaluated with strict types */;
+ if (UNEXPECTED(!zend_verify_property_type(prop_info, &tmp, /* strict */ 1))) {
+ zval_ptr_dtor(&tmp);
+ return FAILURE;
+ }
+ zval_ptr_dtor(val);
+ ZVAL_COPY_VALUE(val, &tmp);
+ } else if (UNEXPECTED(zval_update_constant_ex(val, ce) != SUCCESS)) {
return FAILURE;
}
}
@@ -1192,7 +1255,7 @@ ZEND_API int zend_update_class_constants(zend_class_entry *class_type) /* {{{ */
}
/* }}} */
-ZEND_API void object_properties_init(zend_object *object, zend_class_entry *class_type) /* {{{ */
+static zend_always_inline void _object_properties_init(zend_object *object, zend_class_entry *class_type) /* {{{ */
{
if (class_type->default_properties_count) {
zval *src = class_type->default_properties_table;
@@ -1201,22 +1264,28 @@ ZEND_API void object_properties_init(zend_object *object, zend_class_entry *clas
if (UNEXPECTED(class_type->type == ZEND_INTERNAL_CLASS)) {
do {
- ZVAL_COPY_OR_DUP(dst, src);
+ ZVAL_COPY_OR_DUP_PROP(dst, src);
src++;
dst++;
} while (src != end);
} else {
do {
- ZVAL_COPY(dst, src);
+ ZVAL_COPY_PROP(dst, src);
src++;
dst++;
} while (src != end);
}
- object->properties = NULL;
}
}
/* }}} */
+ZEND_API void object_properties_init(zend_object *object, zend_class_entry *class_type) /* {{{ */
+{
+ object->properties = NULL;
+ _object_properties_init(object, class_type);
+}
+/* }}} */
+
ZEND_API void object_properties_init_ex(zend_object *object, HashTable *properties) /* {{{ */
{
object->properties = properties;
@@ -1231,7 +1300,18 @@ ZEND_API void object_properties_init_ex(zend_object *object, HashTable *properti
property_info &&
(property_info->flags & ZEND_ACC_STATIC) == 0) {
zval *slot = OBJ_PROP(object, property_info->offset);
- ZVAL_COPY_VALUE(slot, prop);
+
+ if (UNEXPECTED(property_info->type)) {
+ zval tmp;
+
+ ZVAL_COPY_VALUE(&tmp, prop);
+ if (UNEXPECTED(!zend_verify_property_type(property_info, &tmp, 0))) {
+ continue;
+ }
+ ZVAL_COPY_VALUE(slot, &tmp);
+ } else {
+ ZVAL_COPY_VALUE(slot, prop);
+ }
ZVAL_INDIRECT(prop, slot);
}
} ZEND_HASH_FOREACH_END();
@@ -1301,7 +1381,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) /* {{{ */
+static zend_always_inline 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) {
@@ -1325,11 +1405,13 @@ ZEND_API int object_and_properties_init(zval *arg, zend_class_entry *class_type,
}
if (class_type->create_object == NULL) {
- ZVAL_OBJ(arg, zend_objects_new(class_type));
+ zend_object *obj = zend_objects_new(class_type);
+
+ ZVAL_OBJ(arg, obj);
if (properties) {
- object_properties_init_ex(Z_OBJ_P(arg), properties);
+ object_properties_init_ex(obj, properties);
} else {
- object_properties_init(Z_OBJ_P(arg), class_type);
+ _object_properties_init(obj, class_type);
}
} else {
ZVAL_OBJ(arg, class_type->create_object(class_type));
@@ -1338,9 +1420,15 @@ ZEND_API int object_and_properties_init(zval *arg, zend_class_entry *class_type,
}
/* }}} */
+ZEND_API int object_and_properties_init(zval *arg, zend_class_entry *class_type, HashTable *properties) /* {{{ */
+{
+ return _object_and_properties_init(arg, class_type, properties);
+}
+/* }}} */
+
ZEND_API int object_init_ex(zval *arg, zend_class_entry *class_type) /* {{{ */
{
- return object_and_properties_init(arg, class_type, 0);
+ return _object_and_properties_init(arg, class_type, NULL);
}
/* }}} */
@@ -1518,13 +1606,6 @@ ZEND_API int add_index_stringl(zval *arg, zend_ulong index, const char *str, siz
}
/* }}} */
-ZEND_API int add_index_zval(zval *arg, zend_ulong index, zval *value) /* {{{ */
-{
- zend_hash_index_update(Z_ARRVAL_P(arg), index, value);
- return SUCCESS;
-}
-/* }}} */
-
ZEND_API int add_next_index_long(zval *arg, zend_long n) /* {{{ */
{
zval tmp;
@@ -1597,77 +1678,6 @@ ZEND_API int add_next_index_stringl(zval *arg, const char *str, size_t length) /
}
/* }}} */
-ZEND_API int add_next_index_zval(zval *arg, zval *value) /* {{{ */
-{
- return zend_hash_next_index_insert(Z_ARRVAL_P(arg), value) ? SUCCESS : FAILURE;
-}
-/* }}} */
-
-ZEND_API zval *add_get_assoc_string_ex(zval *arg, const char *key, uint32_t key_len, const char *str) /* {{{ */
-{
- zval tmp, *ret;
-
- ZVAL_STRING(&tmp, str);
- ret = zend_symtable_str_update(Z_ARRVAL_P(arg), key, key_len, &tmp);
- return ret;
-}
-/* }}} */
-
-ZEND_API zval *add_get_assoc_stringl_ex(zval *arg, const char *key, uint32_t key_len, const char *str, size_t length) /* {{{ */
-{
- zval tmp, *ret;
-
- ZVAL_STRINGL(&tmp, str, length);
- ret = zend_symtable_str_update(Z_ARRVAL_P(arg), key, key_len, &tmp);
- return ret;
-}
-/* }}} */
-
-ZEND_API zval *add_get_index_long(zval *arg, zend_ulong index, zend_long l) /* {{{ */
-{
- zval tmp;
-
- ZVAL_LONG(&tmp, l);
- return zend_hash_index_update(Z_ARRVAL_P(arg), index, &tmp);
-}
-/* }}} */
-
-ZEND_API zval *add_get_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);
-}
-/* }}} */
-
-ZEND_API zval *add_get_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);
-}
-/* }}} */
-
-ZEND_API zval *add_get_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);
-}
-/* }}} */
-
-ZEND_API zval *add_get_index_stringl(zval *arg, zend_ulong index, const char *str, size_t length) /* {{{ */
-{
- zval tmp;
-
- ZVAL_STRINGL(&tmp, str, length);
- return zend_hash_index_update(Z_ARRVAL_P(arg), index, &tmp);
-}
-/* }}} */
-
ZEND_API int array_set_zval_key(HashTable *ht, zval *key, zval *value) /* {{{ */
{
zval *result;
@@ -1712,52 +1722,37 @@ ZEND_API int array_set_zval_key(HashTable *ht, zval *key, zval *value) /* {{{ */
ZEND_API int add_property_long_ex(zval *arg, const char *key, size_t key_len, zend_long n) /* {{{ */
{
zval tmp;
- zval z_key;
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(&z_key);
- return SUCCESS;
+ return add_property_zval_ex(arg, key, key_len, &tmp);
}
/* }}} */
ZEND_API int add_property_bool_ex(zval *arg, const char *key, size_t key_len, zend_long b) /* {{{ */
{
zval tmp;
- zval z_key;
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(&z_key);
- return SUCCESS;
+ return add_property_zval_ex(arg, key, key_len, &tmp);
}
/* }}} */
ZEND_API int add_property_null_ex(zval *arg, const char *key, size_t key_len) /* {{{ */
{
zval tmp;
- zval z_key;
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(&z_key);
- return SUCCESS;
+ return add_property_zval_ex(arg, key, key_len, &tmp);
}
/* }}} */
ZEND_API int add_property_resource_ex(zval *arg, const char *key, size_t key_len, zend_resource *r) /* {{{ */
{
zval tmp;
- zval z_key;
ZVAL_RES(&tmp, r);
- ZVAL_STRINGL(&z_key, key, key_len);
- Z_OBJ_HANDLER_P(arg, write_property)(arg, &z_key, &tmp, NULL);
+ add_property_zval_ex(arg, key, key_len, &tmp);
zval_ptr_dtor(&tmp); /* write_property will add 1 to refcount */
- zval_ptr_dtor(&z_key);
return SUCCESS;
}
/* }}} */
@@ -1765,26 +1760,19 @@ ZEND_API int add_property_resource_ex(zval *arg, const char *key, size_t key_len
ZEND_API int add_property_double_ex(zval *arg, const char *key, size_t key_len, double d) /* {{{ */
{
zval tmp;
- zval z_key;
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(&z_key);
- return SUCCESS;
+ return add_property_zval_ex(arg, key, key_len, &tmp);
}
/* }}} */
ZEND_API int add_property_str_ex(zval *arg, const char *key, size_t key_len, zend_string *str) /* {{{ */
{
zval tmp;
- zval z_key;
ZVAL_STR(&tmp, str);
- ZVAL_STRINGL(&z_key, key, key_len);
- Z_OBJ_HANDLER_P(arg, write_property)(arg, &z_key, &tmp, NULL);
+ add_property_zval_ex(arg, key, key_len, &tmp);
zval_ptr_dtor(&tmp); /* write_property will add 1 to refcount */
- zval_ptr_dtor(&z_key);
return SUCCESS;
}
/* }}} */
@@ -1792,13 +1780,10 @@ ZEND_API int add_property_str_ex(zval *arg, const char *key, size_t key_len, zen
ZEND_API int add_property_string_ex(zval *arg, const char *key, size_t key_len, const char *str) /* {{{ */
{
zval tmp;
- zval z_key;
ZVAL_STRING(&tmp, str);
- ZVAL_STRINGL(&z_key, key, key_len);
- Z_OBJ_HANDLER_P(arg, write_property)(arg, &z_key, &tmp, NULL);
+ add_property_zval_ex(arg, key, key_len, &tmp);
zval_ptr_dtor(&tmp); /* write_property will add 1 to refcount */
- zval_ptr_dtor(&z_key);
return SUCCESS;
}
/* }}} */
@@ -1806,13 +1791,10 @@ ZEND_API int add_property_string_ex(zval *arg, const char *key, size_t key_len,
ZEND_API int add_property_stringl_ex(zval *arg, const char *key, size_t key_len, const char *str, size_t length) /* {{{ */
{
zval tmp;
- zval z_key;
ZVAL_STRINGL(&tmp, str, length);
- ZVAL_STRINGL(&z_key, key, key_len);
- Z_OBJ_HANDLER_P(arg, write_property)(arg, &z_key, &tmp, NULL);
+ add_property_zval_ex(arg, key, key_len, &tmp);
zval_ptr_dtor(&tmp); /* write_property will add 1 to refcount */
- zval_ptr_dtor(&z_key);
return SUCCESS;
}
/* }}} */
@@ -2108,31 +2090,31 @@ ZEND_API void zend_check_magic_method_implementation(const zend_class_entry *ce,
} else if (name_len == sizeof(ZEND_GET_FUNC_NAME) - 1 && !memcmp(lcname, ZEND_GET_FUNC_NAME, sizeof(ZEND_GET_FUNC_NAME) - 1)) {
if (fptr->common.num_args != 1) {
zend_error(error_type, "Method %s::%s() must take exactly 1 argument", ZSTR_VAL(ce->name), ZEND_GET_FUNC_NAME);
- } else if (ARG_SHOULD_BE_SENT_BY_REF(fptr, 1)) {
+ } else if (QUICK_ARG_SHOULD_BE_SENT_BY_REF(fptr, 1)) {
zend_error(error_type, "Method %s::%s() cannot take arguments by reference", ZSTR_VAL(ce->name), ZEND_GET_FUNC_NAME);
}
} else if (name_len == sizeof(ZEND_SET_FUNC_NAME) - 1 && !memcmp(lcname, ZEND_SET_FUNC_NAME, sizeof(ZEND_SET_FUNC_NAME) - 1)) {
if (fptr->common.num_args != 2) {
zend_error(error_type, "Method %s::%s() must take exactly 2 arguments", ZSTR_VAL(ce->name), ZEND_SET_FUNC_NAME);
- } else if (ARG_SHOULD_BE_SENT_BY_REF(fptr, 1) || ARG_SHOULD_BE_SENT_BY_REF(fptr, 2)) {
+ } else if (QUICK_ARG_SHOULD_BE_SENT_BY_REF(fptr, 1) || QUICK_ARG_SHOULD_BE_SENT_BY_REF(fptr, 2)) {
zend_error(error_type, "Method %s::%s() cannot take arguments by reference", ZSTR_VAL(ce->name), ZEND_SET_FUNC_NAME);
}
} else if (name_len == sizeof(ZEND_UNSET_FUNC_NAME) - 1 && !memcmp(lcname, ZEND_UNSET_FUNC_NAME, sizeof(ZEND_UNSET_FUNC_NAME) - 1)) {
if (fptr->common.num_args != 1) {
zend_error(error_type, "Method %s::%s() must take exactly 1 argument", ZSTR_VAL(ce->name), ZEND_UNSET_FUNC_NAME);
- } else if (ARG_SHOULD_BE_SENT_BY_REF(fptr, 1)) {
+ } else if (QUICK_ARG_SHOULD_BE_SENT_BY_REF(fptr, 1)) {
zend_error(error_type, "Method %s::%s() cannot take arguments by reference", ZSTR_VAL(ce->name), ZEND_UNSET_FUNC_NAME);
}
} else if (name_len == sizeof(ZEND_ISSET_FUNC_NAME) - 1 && !memcmp(lcname, ZEND_ISSET_FUNC_NAME, sizeof(ZEND_ISSET_FUNC_NAME) - 1)) {
if (fptr->common.num_args != 1) {
zend_error(error_type, "Method %s::%s() must take exactly 1 argument", ZSTR_VAL(ce->name), ZEND_ISSET_FUNC_NAME);
- } else if (ARG_SHOULD_BE_SENT_BY_REF(fptr, 1)) {
+ } else if (QUICK_ARG_SHOULD_BE_SENT_BY_REF(fptr, 1)) {
zend_error(error_type, "Method %s::%s() cannot take arguments by reference", ZSTR_VAL(ce->name), ZEND_ISSET_FUNC_NAME);
}
} else if (name_len == sizeof(ZEND_CALL_FUNC_NAME) - 1 && !memcmp(lcname, ZEND_CALL_FUNC_NAME, sizeof(ZEND_CALL_FUNC_NAME) - 1)) {
if (fptr->common.num_args != 2) {
zend_error(error_type, "Method %s::%s() must take exactly 2 arguments", ZSTR_VAL(ce->name), ZEND_CALL_FUNC_NAME);
- } else if (ARG_SHOULD_BE_SENT_BY_REF(fptr, 1) || ARG_SHOULD_BE_SENT_BY_REF(fptr, 2)) {
+ } else if (QUICK_ARG_SHOULD_BE_SENT_BY_REF(fptr, 1) || QUICK_ARG_SHOULD_BE_SENT_BY_REF(fptr, 2)) {
zend_error(error_type, "Method %s::%s() cannot take arguments by reference", ZSTR_VAL(ce->name), ZEND_CALL_FUNC_NAME);
}
} else if (name_len == sizeof(ZEND_CALLSTATIC_FUNC_NAME) - 1 &&
@@ -2140,7 +2122,7 @@ ZEND_API void zend_check_magic_method_implementation(const zend_class_entry *ce,
) {
if (fptr->common.num_args != 2) {
zend_error(error_type, "Method %s::__callStatic() must take exactly 2 arguments", ZSTR_VAL(ce->name));
- } else if (ARG_SHOULD_BE_SENT_BY_REF(fptr, 1) || ARG_SHOULD_BE_SENT_BY_REF(fptr, 2)) {
+ } else if (QUICK_ARG_SHOULD_BE_SENT_BY_REF(fptr, 1) || QUICK_ARG_SHOULD_BE_SENT_BY_REF(fptr, 2)) {
zend_error(error_type, "Method %s::__callStatic() cannot take arguments by reference", ZSTR_VAL(ce->name));
}
} else if (name_len == sizeof(ZEND_TOSTRING_FUNC_NAME) - 1 &&
@@ -2163,7 +2145,7 @@ ZEND_API int zend_register_functions(zend_class_entry *scope, const zend_functio
int count=0, unload=0;
HashTable *target_function_table = function_table;
int error_type;
- zend_function *ctor = NULL, *dtor = NULL, *clone = NULL, *__get = NULL, *__set = NULL, *__unset = NULL, *__isset = NULL, *__call = NULL, *__callstatic = NULL, *__tostring = NULL, *__debugInfo = NULL;
+ zend_function *ctor = NULL, *dtor = NULL, *clone = NULL, *__get = NULL, *__set = NULL, *__unset = NULL, *__isset = NULL, *__call = NULL, *__callstatic = NULL, *__tostring = NULL, *__debugInfo = NULL, *serialize_func = NULL, *unserialize_func = NULL;
zend_string *lowercase_name;
size_t fname_len;
const char *lc_class_name = NULL;
@@ -2338,6 +2320,10 @@ 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 (zend_string_equals_literal(lowercase_name, "serialize")) {
+ serialize_func = reg_function;
+ } else if (zend_string_equals_literal(lowercase_name, "unserialize")) {
+ unserialize_func = 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)) {
@@ -2409,6 +2395,8 @@ ZEND_API int zend_register_functions(zend_class_entry *scope, const zend_functio
scope->__unset = __unset;
scope->__isset = __isset;
scope->__debugInfo = __debugInfo;
+ scope->serialize_func = serialize_func;
+ scope->unserialize_func = unserialize_func;
if (ctor) {
ctor->common.fn_flags |= ZEND_ACC_CTOR;
if (ctor->common.fn_flags & ZEND_ACC_STATIC) {
@@ -2477,11 +2465,11 @@ ZEND_API int zend_register_functions(zend_class_entry *scope, const zend_functio
}
}
- if (ctor && ctor->common.fn_flags & ZEND_ACC_HAS_RETURN_TYPE && ctor->common.fn_flags & ZEND_ACC_CTOR) {
+ if (ctor && (ctor->common.fn_flags & ZEND_ACC_HAS_RETURN_TYPE)) {
zend_error_noreturn(E_CORE_ERROR, "Constructor %s::%s() cannot declare a return type", ZSTR_VAL(scope->name), ZSTR_VAL(ctor->common.function_name));
}
- if (dtor && dtor->common.fn_flags & ZEND_ACC_HAS_RETURN_TYPE && dtor->common.fn_flags & ZEND_ACC_DTOR) {
+ if (dtor && (dtor->common.fn_flags & ZEND_ACC_HAS_RETURN_TYPE)) {
zend_error_noreturn(E_CORE_ERROR, "Destructor %s::%s() cannot declare a return type", ZSTR_VAL(scope->name), ZSTR_VAL(dtor->common.function_name));
}
@@ -2575,6 +2563,12 @@ void module_destructor(zend_module_entry *module) /* {{{ */
module->module_shutdown_func(module->type, module->module_number);
}
+ if (module->module_started
+ && !module->module_shutdown_func
+ && module->type == MODULE_TEMPORARY) {
+ zend_unregister_ini_entries(module->module_number);
+ }
+
/* Deinitilaise module globals */
if (module->globals_size) {
#ifdef ZTS
@@ -2617,28 +2611,22 @@ ZEND_API void zend_activate_modules(void) /* {{{ */
}
/* }}} */
-/* call request shutdown for all modules */
-static int module_registry_cleanup(zval *zv) /* {{{ */
-{
- zend_module_entry *module = Z_PTR_P(zv);
-
- if (module->request_shutdown_func) {
-#if 0
- zend_printf("%s: Request shutdown\n", module->name);
-#endif
- module->request_shutdown_func(module->type, module->module_number);
- }
- return 0;
-}
-/* }}} */
-
ZEND_API void zend_deactivate_modules(void) /* {{{ */
{
EG(current_execute_data) = NULL; /* we're no longer executing anything */
zend_try {
if (EG(full_tables_cleanup)) {
- zend_hash_reverse_apply(&module_registry, module_registry_cleanup);
+ zend_module_entry *module;
+
+ ZEND_HASH_REVERSE_FOREACH_PTR(&module_registry, module) {
+ if (module->request_shutdown_func) {
+#if 0
+ zend_printf("%s: Request shutdown\n", module->name);
+#endif
+ module->request_shutdown_func(module->type, module->module_number);
+ }
+ } ZEND_HASH_FOREACH_END();
} else {
zend_module_entry **p = module_request_shutdown_handlers;
@@ -2664,34 +2652,27 @@ ZEND_API void zend_cleanup_internal_classes(void) /* {{{ */
}
/* }}} */
-int module_registry_unload_temp(const zend_module_entry *module) /* {{{ */
-{
- return (module->type == MODULE_TEMPORARY) ? ZEND_HASH_APPLY_REMOVE : ZEND_HASH_APPLY_STOP;
-}
-/* }}} */
-
-static int module_registry_unload_temp_wrapper(zval *el) /* {{{ */
-{
- zend_module_entry *module = (zend_module_entry *)Z_PTR_P(el);
- return module_registry_unload_temp((const zend_module_entry *)module);
-}
-/* }}} */
-
-static int exec_done_cb(zval *el) /* {{{ */
-{
- zend_module_entry *module = (zend_module_entry *)Z_PTR_P(el);
- if (module->post_deactivate_func) {
- module->post_deactivate_func();
- }
- return 0;
-}
-/* }}} */
-
ZEND_API void zend_post_deactivate_modules(void) /* {{{ */
{
if (EG(full_tables_cleanup)) {
- zend_hash_apply(&module_registry, exec_done_cb);
- zend_hash_reverse_apply(&module_registry, module_registry_unload_temp_wrapper);
+ zend_module_entry *module;
+ zval *zv;
+ zend_string *key;
+
+ ZEND_HASH_FOREACH_PTR(&module_registry, module) {
+ if (module->post_deactivate_func) {
+ module->post_deactivate_func();
+ }
+ } ZEND_HASH_FOREACH_END();
+ ZEND_HASH_REVERSE_FOREACH_STR_KEY_VAL(&module_registry, key, zv) {
+ module = Z_PTR_P(zv);
+ if (module->type != MODULE_TEMPORARY) {
+ break;
+ }
+ module_destructor(module);
+ free(module);
+ zend_string_release_ex(key, 0);
+ } ZEND_HASH_FOREACH_END_DEL();
} else {
zend_module_entry **p = module_post_deactivate_handlers;
@@ -2720,7 +2701,7 @@ static zend_class_entry *do_register_internal_class(zend_class_entry *orig_class
class_entry->type = ZEND_INTERNAL_CLASS;
zend_initialize_class_data(class_entry, 0);
- class_entry->ce_flags = ce_flags | ZEND_ACC_CONSTANTS_UPDATED;
+ class_entry->ce_flags = ce_flags | ZEND_ACC_CONSTANTS_UPDATED | ZEND_ACC_LINKED | ZEND_ACC_RESOLVED_PARENT | ZEND_ACC_RESOLVED_INTERFACES;
class_entry->info.internal.module = EG(current_module);
if (class_entry->info.internal.builtin_functions) {
@@ -2748,6 +2729,7 @@ ZEND_API zend_class_entry *zend_register_internal_class_ex(zend_class_entry *cla
if (parent_ce) {
zend_do_inheritance(register_class, parent_ce);
+ zend_build_properties_info_table(register_class);
}
return register_class;
}
@@ -2785,6 +2767,7 @@ 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, int persistent) /* {{{ */
{
zend_string *lcname;
+ zval zv, *ret;
/* TODO: Move this out of here in 7.4. */
if (persistent && EG(current_module) && EG(current_module)->type == MODULE_TEMPORARY) {
@@ -2802,10 +2785,14 @@ ZEND_API int zend_register_class_alias_ex(const char *name, size_t name_len, zen
zend_assert_valid_class_name(lcname);
lcname = zend_new_interned_string(lcname);
- ce = zend_hash_add_ptr(CG(class_table), lcname, ce);
+
+ ZVAL_ALIAS_PTR(&zv, ce);
+ ret = zend_hash_add(CG(class_table), lcname, &zv);
zend_string_release_ex(lcname, 0);
- if (ce) {
- ce->refcount++;
+ if (ret) {
+ if (!(ce->ce_flags & ZEND_ACC_IMMUTABLE)) {
+ ce->refcount++;
+ }
return SUCCESS;
}
return FAILURE;
@@ -2838,7 +2825,7 @@ ZEND_API int zend_set_hash_symbol(zval *symbol, const char *name, int name_lengt
/* {{{ proto void display_disabled_function(void)
Dummy function which displays an error when a disabled function is called. */
-ZEND_API ZEND_FUNCTION(display_disabled_function)
+ZEND_API ZEND_COLD ZEND_FUNCTION(display_disabled_function)
{
zend_error(E_WARNING, "%s() has been disabled for security reasons", get_active_function_name());
}
@@ -2848,6 +2835,7 @@ ZEND_API int zend_disable_function(char *function_name, size_t function_name_len
{
zend_internal_function *func;
if ((func = zend_hash_str_find_ptr(CG(function_table), function_name, function_name_length))) {
+ zend_free_internal_arg_info(func);
func->fn_flags &= ~(ZEND_ACC_VARIADIC | ZEND_ACC_HAS_TYPE_HINTS | ZEND_ACC_HAS_RETURN_TYPE);
func->num_args = 0;
func->arg_info = NULL;
@@ -2861,7 +2849,7 @@ ZEND_API int zend_disable_function(char *function_name, size_t function_name_len
#ifdef ZEND_WIN32
#pragma optimize("", off)
#endif
-static zend_object *display_disabled_class(zend_class_entry *class_type) /* {{{ */
+static ZEND_COLD zend_object *display_disabled_class(zend_class_entry *class_type) /* {{{ */
{
zend_object *intern;
@@ -2893,6 +2881,7 @@ ZEND_API int zend_disable_class(char *class_name, size_t class_name_length) /* {
{
zend_class_entry *disabled_class;
zend_string *key;
+ zend_function *fn;
key = zend_string_alloc(class_name_length, 0);
zend_str_tolower_copy(ZSTR_VAL(key), class_name, class_name_length);
@@ -2901,8 +2890,16 @@ ZEND_API int zend_disable_class(char *class_name, size_t class_name_length) /* {
if (!disabled_class) {
return FAILURE;
}
+
INIT_CLASS_ENTRY_INIT_METHODS((*disabled_class), disabled_class_new);
disabled_class->create_object = display_disabled_class;
+
+ ZEND_HASH_FOREACH_PTR(&disabled_class->function_table, fn) {
+ if ((fn->common.fn_flags & (ZEND_ACC_HAS_RETURN_TYPE|ZEND_ACC_HAS_TYPE_HINTS)) &&
+ fn->common.scope == disabled_class) {
+ zend_free_internal_arg_info(&fn->internal_function);
+ }
+ } ZEND_HASH_FOREACH_END();
zend_hash_clean(&disabled_class->function_table);
return SUCCESS;
}
@@ -2959,7 +2956,7 @@ static int zend_is_callable_check_class(zend_string *name, zend_class_entry *sco
*strict_class = 1;
ret = 1;
}
- } else if ((ce = zend_lookup_class_ex(name, NULL, 1)) != NULL) {
+ } else if ((ce = zend_lookup_class(name)) != NULL) {
zend_class_entry *scope;
zend_execute_data *ex = EG(current_execute_data);
@@ -2992,6 +2989,20 @@ static int zend_is_callable_check_class(zend_string *name, zend_class_entry *sco
}
/* }}} */
+ZEND_API void zend_release_fcall_info_cache(zend_fcall_info_cache *fcc) {
+ if (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_ex(fcc->function_handler->common.function_name, 0);
+ }
+ zend_free_trampoline(fcc->function_handler);
+ }
+ fcc->function_handler = NULL;
+}
+
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;
@@ -3115,20 +3126,15 @@ static zend_always_inline int zend_is_callable_check_func(int check_flags, zval
}
}
}
- if ((check_flags & IS_CALLABLE_CHECK_NO_ACCESS) == 0 &&
+ if (!(fcc->function_handler->common.fn_flags & ZEND_ACC_PUBLIC) &&
+ !(check_flags & IS_CALLABLE_CHECK_NO_ACCESS) &&
(fcc->calling_scope &&
((fcc->object && fcc->calling_scope->__call) ||
(!fcc->object && fcc->calling_scope->__callstatic)))) {
- if (fcc->function_handler->op_array.fn_flags & ZEND_ACC_PRIVATE) {
- scope = zend_get_executed_scope();
- if (!zend_check_private(fcc->function_handler, fcc->object ? fcc->object->ce : scope, lmname)) {
- retval = 0;
- fcc->function_handler = NULL;
- goto get_function_via_handler;
- }
- } else if (fcc->function_handler->common.fn_flags & ZEND_ACC_PROTECTED) {
- scope = zend_get_executed_scope();
- if (!zend_check_protected(fcc->function_handler->common.scope, scope)) {
+ scope = zend_get_executed_scope();
+ if (fcc->function_handler->common.scope != scope) {
+ if ((fcc->function_handler->common.fn_flags & ZEND_ACC_PRIVATE)
+ || !zend_check_protected(zend_get_function_root_class(fcc->function_handler), scope)) {
retval = 0;
fcc->function_handler = NULL;
goto get_function_via_handler;
@@ -3142,19 +3148,13 @@ get_function_via_handler:
fcc->function_handler = zend_get_call_trampoline_func(ce_org, mname, 0);
call_via_handler = 1;
retval = 1;
- } else if (fcc->object->handlers->get_method) {
+ } else {
fcc->function_handler = fcc->object->handlers->get_method(&fcc->object, mname, NULL);
if (fcc->function_handler) {
if (strict_class &&
(!fcc->function_handler->common.scope ||
!instanceof_function(ce_org, fcc->function_handler->common.scope))) {
- 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_ex(fcc->function_handler->common.function_name, 0);
- }
- zend_free_trampoline(fcc->function_handler);
- }
+ zend_release_fcall_info_cache(fcc);
} else {
retval = 1;
call_via_handler = (fcc->function_handler->common.fn_flags & ZEND_ACC_CALL_VIA_TRAMPOLINE) != 0;
@@ -3184,12 +3184,9 @@ get_function_via_handler:
if (retval) {
if (fcc->calling_scope && !call_via_handler) {
if (fcc->function_handler->common.fn_flags & ZEND_ACC_ABSTRACT) {
+ retval = 0;
if (error) {
zend_spprintf(error, 0, "cannot call abstract method %s::%s()", ZSTR_VAL(fcc->calling_scope->name), ZSTR_VAL(fcc->function_handler->common.function_name));
- retval = 0;
- } else {
- zend_throw_error(NULL, "Cannot call abstract method %s::%s()", ZSTR_VAL(fcc->calling_scope->name), ZSTR_VAL(fcc->function_handler->common.function_name));
- retval = 0;
}
} else if (!fcc->object && !(fcc->function_handler->common.fn_flags & ZEND_ACC_STATIC)) {
int severity;
@@ -3218,26 +3215,18 @@ get_function_via_handler:
}
}
}
- if (retval && (check_flags & IS_CALLABLE_CHECK_NO_ACCESS) == 0) {
- if (fcc->function_handler->op_array.fn_flags & ZEND_ACC_PRIVATE) {
- scope = zend_get_executed_scope();
- if (!zend_check_private(fcc->function_handler, fcc->object ? fcc->object->ce : scope, lmname)) {
- if (error) {
- if (*error) {
- efree(*error);
- }
- zend_spprintf(error, 0, "cannot access private method %s::%s()", ZSTR_VAL(fcc->calling_scope->name), ZSTR_VAL(fcc->function_handler->common.function_name));
- }
- retval = 0;
- }
- } else if ((fcc->function_handler->common.fn_flags & ZEND_ACC_PROTECTED)) {
- scope = zend_get_executed_scope();
- if (!zend_check_protected(fcc->function_handler->common.scope, scope)) {
+ if (retval
+ && !(fcc->function_handler->common.fn_flags & ZEND_ACC_PUBLIC)
+ && !(check_flags & IS_CALLABLE_CHECK_NO_ACCESS)) {
+ scope = zend_get_executed_scope();
+ if (fcc->function_handler->common.scope != scope) {
+ if ((fcc->function_handler->common.fn_flags & ZEND_ACC_PRIVATE)
+ || (!zend_check_protected(zend_get_function_root_class(fcc->function_handler), scope))) {
if (error) {
if (*error) {
efree(*error);
}
- zend_spprintf(error, 0, "cannot access protected method %s::%s()", ZSTR_VAL(fcc->calling_scope->name), ZSTR_VAL(fcc->function_handler->common.function_name));
+ zend_spprintf(error, 0, "cannot access %s method %s::%s()", zend_visibility_string(fcc->function_handler->common.fn_flags), ZSTR_VAL(fcc->calling_scope->name), ZSTR_VAL(fcc->function_handler->common.function_name));
}
retval = 0;
}
@@ -3256,6 +3245,10 @@ get_function_via_handler:
if (fcc->object) {
fcc->called_scope = fcc->object->ce;
+ if (fcc->function_handler
+ && fcc->function_handler->common.fn_flags & ZEND_ACC_STATIC) {
+ fcc->object = NULL;
+ }
}
return retval;
}
@@ -3294,7 +3287,7 @@ try_again:
}
if (obj == NULL || method == NULL || Z_TYPE_P(method) != IS_STRING) {
- return zend_string_init("Array", sizeof("Array")-1, 0);
+ return ZSTR_KNOWN(ZEND_STR_ARRAY_CAPITALIZED);
}
if (Z_TYPE_P(obj) == IS_STRING) {
@@ -3302,7 +3295,7 @@ try_again:
} else if (Z_TYPE_P(obj) == IS_OBJECT) {
return zend_create_method_string(Z_OBJCE_P(obj)->name, Z_STR_P(method));
} else {
- return zend_string_init("Array", sizeof("Array")-1, 0);
+ return ZSTR_KNOWN(ZEND_STR_ARRAY_CAPITALIZED);
}
}
case IS_OBJECT:
@@ -3369,16 +3362,8 @@ again:
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) ||
- 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_ex(fcc->function_handler->common.function_name, 0);
- }
- zend_free_trampoline(fcc->function_handler);
+ if (fcc == &fcc_local) {
+ zend_release_fcall_info_cache(fcc);
}
return ret;
@@ -3444,9 +3429,17 @@ check_func:
}
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;
- return 1;
+ if (Z_OBJ_HANDLER_P(callable, get_closure)) {
+ if (Z_OBJ_HANDLER_P(callable, get_closure)(callable, &fcc->calling_scope, &fcc->function_handler, &fcc->object) == SUCCESS) {
+ fcc->called_scope = fcc->calling_scope;
+ if (fcc == &fcc_local) {
+ zend_release_fcall_info_cache(fcc);
+ }
+ return 1;
+ } else {
+ /* Discard exceptions thrown from Z_OBJ_HANDLER_P(callable, get_closure) */
+ zend_clear_exception();
+ }
}
if (error) *error = estrdup("no array or string given");
return 0;
@@ -3486,15 +3479,7 @@ ZEND_API zend_bool zend_make_callable(zval *callable, zend_string **callable_nam
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));
}
- if (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) {
- zend_string_release_ex(fcc.function_handler->common.function_name, 0);
- }
- zend_free_trampoline(fcc.function_handler);
- }
+ zend_release_fcall_info_cache(&fcc);
return 1;
}
return 0;
@@ -3526,7 +3511,7 @@ ZEND_API void zend_fcall_info_args_clear(zend_fcall_info *fci, int free_mem) /*
zval *end = p + fci->param_count;
while (p != end) {
- i_zval_ptr_dtor(p ZEND_FILE_LINE_CC);
+ i_zval_ptr_dtor(p);
p++;
}
if (free_mem) {
@@ -3706,10 +3691,14 @@ static zend_always_inline zend_bool is_persistent_class(zend_class_entry *ce) {
&& 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_API int zend_declare_typed_property(zend_class_entry *ce, zend_string *name, zval *property, int access_type, zend_string *doc_comment, zend_type type) /* {{{ */
{
zend_property_info *property_info, *property_info_ptr;
+ if (ZEND_TYPE_IS_SET(type)) {
+ ce->ce_flags |= ZEND_ACC_HAS_TYPE_HINTS;
+ }
+
if (ce->type == ZEND_INTERNAL_CLASS) {
property_info = pemalloc(sizeof(zend_property_info), 1);
} else {
@@ -3737,21 +3726,40 @@ ZEND_API int zend_declare_property_ex(zend_class_entry *ce, zend_string *name, z
ce->default_static_members_table = perealloc(ce->default_static_members_table, sizeof(zval) * ce->default_static_members_count, ce->type == ZEND_INTERNAL_CLASS);
}
ZVAL_COPY_VALUE(&ce->default_static_members_table[property_info->offset], property);
- if (ce->type == ZEND_USER_CLASS) {
- ce->static_members_table = ce->default_static_members_table;
+ if (!ZEND_MAP_PTR(ce->static_members_table)) {
+ ZEND_ASSERT(ce->type == ZEND_INTERNAL_CLASS);
+ if (!EG(current_execute_data)) {
+ ZEND_MAP_PTR_NEW(ce->static_members_table);
+ } else {
+ /* internal class loaded by dl() */
+ ZEND_MAP_PTR_INIT(ce->static_members_table, &ce->default_static_members_table);
+ }
}
} else {
+ zval *property_default_ptr;
if ((property_info_ptr = zend_hash_find_ptr(&ce->properties_info, name)) != NULL &&
(property_info_ptr->flags & ZEND_ACC_STATIC) == 0) {
property_info->offset = property_info_ptr->offset;
zval_ptr_dtor(&ce->default_properties_table[OBJ_PROP_TO_NUM(property_info->offset)]);
zend_hash_del(&ce->properties_info, name);
+
+ ZEND_ASSERT(ce->type == ZEND_INTERNAL_CLASS);
+ ZEND_ASSERT(ce->properties_info_table != NULL);
+ ce->properties_info_table[OBJ_PROP_TO_NUM(property_info->offset)] = property_info;
} else {
property_info->offset = OBJ_PROP_TO_OFFSET(ce->default_properties_count);
ce->default_properties_count++;
ce->default_properties_table = perealloc(ce->default_properties_table, sizeof(zval) * ce->default_properties_count, ce->type == ZEND_INTERNAL_CLASS);
+
+ /* For user classes this is handled during linking */
+ if (ce->type == ZEND_INTERNAL_CLASS) {
+ ce->properties_info_table = perealloc(ce->properties_info_table, sizeof(zend_property_info *) * ce->default_properties_count, 1);
+ ce->properties_info_table[ce->default_properties_count - 1] = property_info;
+ }
}
- ZVAL_COPY_VALUE(&ce->default_properties_table[OBJ_PROP_TO_NUM(property_info->offset)], property);
+ property_default_ptr = &ce->default_properties_table[OBJ_PROP_TO_NUM(property_info->offset)];
+ ZVAL_COPY_VALUE(property_default_ptr, property);
+ Z_PROP_FLAG_P(property_default_ptr) = Z_ISUNDEF_P(property) ? IS_PROP_UNINIT : 0;
}
if (ce->type & ZEND_INTERNAL_CLASS) {
switch(Z_TYPE_P(property)) {
@@ -3765,7 +3773,9 @@ ZEND_API int zend_declare_property_ex(zend_class_entry *ce, zend_string *name, z
}
/* Must be interned to avoid ZTS data races */
- name = zend_new_interned_string(zend_string_copy(name));
+ if (is_persistent_class(ce)) {
+ name = zend_new_interned_string(zend_string_copy(name));
+ }
}
if (access_type & ZEND_ACC_PUBLIC) {
@@ -3781,12 +3791,147 @@ ZEND_API int zend_declare_property_ex(zend_class_entry *ce, zend_string *name, z
property_info->flags = access_type;
property_info->doc_comment = doc_comment;
property_info->ce = ce;
+ property_info->type = type;
+
zend_hash_update_ptr(&ce->properties_info, name, property_info);
return SUCCESS;
}
/* }}} */
+ZEND_API int zend_try_assign_typed_ref_ex(zend_reference *ref, zval *val, zend_bool strict) /* {{{ */
+{
+ if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, val, strict))) {
+ zval_ptr_dtor(val);
+ return FAILURE;
+ } else {
+ zval_ptr_dtor(&ref->val);
+ ZVAL_COPY_VALUE(&ref->val, val);
+ return SUCCESS;
+ }
+}
+/* }}} */
+
+ZEND_API int zend_try_assign_typed_ref(zend_reference *ref, zval *val) /* {{{ */
+{
+ return zend_try_assign_typed_ref_ex(ref, val, ZEND_ARG_USES_STRICT_TYPES());
+}
+/* }}} */
+
+ZEND_API int zend_try_assign_typed_ref_null(zend_reference *ref) /* {{{ */
+{
+ zval tmp;
+
+ ZVAL_NULL(&tmp);
+ return zend_try_assign_typed_ref(ref, &tmp);
+}
+/* }}} */
+
+ZEND_API int zend_try_assign_typed_ref_bool(zend_reference *ref, zend_bool val) /* {{{ */
+{
+ zval tmp;
+
+ ZVAL_BOOL(&tmp, val);
+ return zend_try_assign_typed_ref(ref, &tmp);
+}
+/* }}} */
+
+ZEND_API int zend_try_assign_typed_ref_long(zend_reference *ref, zend_long lval) /* {{{ */
+{
+ zval tmp;
+
+ ZVAL_LONG(&tmp, lval);
+ return zend_try_assign_typed_ref(ref, &tmp);
+}
+/* }}} */
+
+ZEND_API int zend_try_assign_typed_ref_double(zend_reference *ref, double dval) /* {{{ */
+{
+ zval tmp;
+
+ ZVAL_DOUBLE(&tmp, dval);
+ return zend_try_assign_typed_ref(ref, &tmp);
+}
+/* }}} */
+
+ZEND_API int zend_try_assign_typed_ref_empty_string(zend_reference *ref) /* {{{ */
+{
+ zval tmp;
+
+ ZVAL_EMPTY_STRING(&tmp);
+ return zend_try_assign_typed_ref(ref, &tmp);
+}
+/* }}} */
+
+ZEND_API int zend_try_assign_typed_ref_str(zend_reference *ref, zend_string *str) /* {{{ */
+{
+ zval tmp;
+
+ ZVAL_STR(&tmp, str);
+ return zend_try_assign_typed_ref(ref, &tmp);
+}
+/* }}} */
+
+ZEND_API int zend_try_assign_typed_ref_string(zend_reference *ref, const char *string) /* {{{ */
+{
+ zval tmp;
+
+ ZVAL_STRING(&tmp, string);
+ return zend_try_assign_typed_ref(ref, &tmp);
+}
+/* }}} */
+
+ZEND_API int zend_try_assign_typed_ref_stringl(zend_reference *ref, const char *string, size_t len) /* {{{ */
+{
+ zval tmp;
+
+ ZVAL_STRINGL(&tmp, string, len);
+ return zend_try_assign_typed_ref(ref, &tmp);
+}
+/* }}} */
+
+ZEND_API int zend_try_assign_typed_ref_arr(zend_reference *ref, zend_array *arr) /* {{{ */
+{
+ zval tmp;
+
+ ZVAL_ARR(&tmp, arr);
+ return zend_try_assign_typed_ref(ref, &tmp);
+}
+/* }}} */
+
+ZEND_API int zend_try_assign_typed_ref_res(zend_reference *ref, zend_resource *res) /* {{{ */
+{
+ zval tmp;
+
+ ZVAL_RES(&tmp, res);
+ return zend_try_assign_typed_ref(ref, &tmp);
+}
+/* }}} */
+
+ZEND_API int zend_try_assign_typed_ref_zval(zend_reference *ref, zval *zv) /* {{{ */
+{
+ zval tmp;
+
+ ZVAL_COPY_VALUE(&tmp, zv);
+ return zend_try_assign_typed_ref(ref, &tmp);
+}
+/* }}} */
+
+ZEND_API int zend_try_assign_typed_ref_zval_ex(zend_reference *ref, zval *zv, zend_bool strict) /* {{{ */
+{
+ zval tmp;
+
+ ZVAL_COPY_VALUE(&tmp, zv);
+ return zend_try_assign_typed_ref_ex(ref, &tmp, strict);
+}
+/* }}} */
+
+ZEND_API int zend_declare_property_ex(zend_class_entry *ce, zend_string *name, zval *property, int access_type, zend_string *doc_comment) /* {{{ */
+{
+ return zend_declare_typed_property(ce, name, property, access_type, doc_comment, 0);
+}
+/* }}} */
+
ZEND_API int zend_declare_property(zend_class_entry *ce, const char *name, size_t name_length, zval *property, int access_type) /* {{{ */
{
zend_string *key = zend_string_init(name, name_length, is_persistent_class(ce));
@@ -3966,9 +4111,6 @@ ZEND_API void zend_update_property_ex(zend_class_entry *scope, zval *object, zen
EG(fake_scope) = scope;
- if (!Z_OBJ_HT_P(object)->write_property) {
- zend_error_noreturn(E_CORE_ERROR, "Property %s of class %s cannot be updated", ZSTR_VAL(name), ZSTR_VAL(Z_OBJCE_P(object)->name));
- }
ZVAL_STR(&property, name);
Z_OBJ_HT_P(object)->write_property(object, &property, value, NULL);
@@ -3983,9 +4125,6 @@ ZEND_API void zend_update_property(zend_class_entry *scope, zval *object, const
EG(fake_scope) = scope;
- if (!Z_OBJ_HT_P(object)->write_property) {
- zend_error_noreturn(E_CORE_ERROR, "Property %s of class %s cannot be updated", name, ZSTR_VAL(Z_OBJCE_P(object)->name));
- }
ZVAL_STRINGL(&property, name, name_length);
Z_OBJ_HT_P(object)->write_property(object, &property, value, NULL);
zval_ptr_dtor(&property);
@@ -4010,9 +4149,6 @@ ZEND_API void zend_unset_property(zend_class_entry *scope, zval *object, const c
EG(fake_scope) = scope;
- if (!Z_OBJ_HT_P(object)->unset_property) {
- zend_error_noreturn(E_CORE_ERROR, "Property %s of class %s cannot be unset", name, ZSTR_VAL(Z_OBJCE_P(object)->name));
- }
ZVAL_STRINGL(&property, name, name_length);
Z_OBJ_HT_P(object)->unset_property(object, &property, 0);
zval_ptr_dtor(&property);
@@ -4079,7 +4215,8 @@ ZEND_API void zend_update_property_stringl(zend_class_entry *scope, zval *object
ZEND_API int zend_update_static_property_ex(zend_class_entry *scope, zend_string *name, zval *value) /* {{{ */
{
- zval *property;
+ zval *property, tmp;
+ zend_property_info *prop_info;
zend_class_entry *old_scope = EG(fake_scope);
if (UNEXPECTED(!(scope->ce_flags & ZEND_ACC_CONSTANTS_UPDATED))) {
@@ -4089,21 +4226,25 @@ ZEND_API int zend_update_static_property_ex(zend_class_entry *scope, zend_string
}
EG(fake_scope) = scope;
- property = zend_std_get_static_property(scope, name, 0);
+ property = zend_std_get_static_property_with_info(scope, name, BP_VAR_W, &prop_info);
EG(fake_scope) = old_scope;
if (!property) {
return FAILURE;
}
- if (property != value) {
- zval garbage;
- ZVAL_DEREF(property);
- ZVAL_DEREF(value);
- ZVAL_COPY_VALUE(&garbage, property);
- ZVAL_COPY(property, value);
- zval_ptr_dtor(&garbage);
+ ZEND_ASSERT(!Z_ISREF_P(value));
+ Z_TRY_ADDREF_P(value);
+ if (prop_info->type) {
+ ZVAL_COPY_VALUE(&tmp, value);
+ if (!zend_verify_property_type(prop_info, &tmp, /* strict */ 0)) {
+ Z_TRY_DELREF_P(value);
+ return FAILURE;
+ }
+ value = &tmp;
}
+
+ zend_assign_to_variable(property, value, IS_TMP_VAR, /* strict */ 0);
return SUCCESS;
}
/* }}} */
@@ -4180,10 +4321,6 @@ ZEND_API zval *zend_read_property_ex(zend_class_entry *scope, zval *object, zend
EG(fake_scope) = scope;
- if (!Z_OBJ_HT_P(object)->read_property) {
- zend_error_noreturn(E_CORE_ERROR, "Property %s of class %s cannot be read", ZSTR_VAL(name), ZSTR_VAL(Z_OBJCE_P(object)->name));
- }
-
ZVAL_STR(&property, name);
value = Z_OBJ_HT_P(object)->read_property(object, &property, silent?BP_VAR_IS:BP_VAR_R, NULL, rv);
@@ -4210,7 +4347,7 @@ ZEND_API zval *zend_read_static_property_ex(zend_class_entry *scope, zend_string
zend_class_entry *old_scope = EG(fake_scope);
EG(fake_scope) = scope;
- property = zend_std_get_static_property(scope, name, silent);
+ property = zend_std_get_static_property(scope, name, silent ? BP_VAR_IS : BP_VAR_R);
EG(fake_scope) = old_scope;
return property;
@@ -4338,7 +4475,7 @@ ZEND_API zend_string *zend_resolve_method_name(zend_class_entry *ce, zend_functi
}
/* }}} */
-ZEND_API const char *zend_get_object_type(const zend_class_entry *ce) /* {{{ */
+ZEND_API ZEND_COLD const char *zend_get_object_type(const zend_class_entry *ce) /* {{{ */
{
if(ce->ce_flags & ZEND_ACC_TRAIT) {
return "trait";
@@ -4379,13 +4516,3 @@ ZEND_API zend_bool zend_is_countable(zval *countable) /* {{{ */
}
}
/* }}} */
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * indent-tabs-mode: t
- * End:
- * vim600: sw=4 ts=4 fdm=marker
- * vim<600: sw=4 ts=4
- */
diff --git a/Zend/zend_API.h b/Zend/zend_API.h
index 3c134f44ef..2a3b582902 100644
--- a/Zend/zend_API.h
+++ b/Zend/zend_API.h
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| Zend Engine |
+----------------------------------------------------------------------+
- | Copyright (c) 1998-2018 Zend Technologies Ltd. (http://www.zend.com) |
+ | Copyright (c) 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 |
@@ -76,6 +76,7 @@ typedef struct _zend_fcall_info_cache {
#define ZEND_DEP_FALIAS(name, alias, arg_info) ZEND_FENTRY(name, ZEND_FN(alias), arg_info, ZEND_ACC_DEPRECATED)
#define ZEND_NAMED_ME(zend_name, name, arg_info, flags) ZEND_FENTRY(zend_name, name, arg_info, flags)
#define ZEND_ME(classname, name, arg_info, flags) ZEND_FENTRY(name, ZEND_MN(classname##_##name), arg_info, flags)
+#define ZEND_DEP_ME(classname, name, arg_info, flags) ZEND_ME(classname, name, arg_info, flags | ZEND_ACC_DEPRECATED)
#define ZEND_ABSTRACT_ME(classname, name, arg_info) ZEND_FENTRY(name, NULL, arg_info, ZEND_ACC_PUBLIC|ZEND_ACC_ABSTRACT)
#define ZEND_MALIAS(classname, name, alias, arg_info, flags) \
ZEND_FENTRY(name, ZEND_MN(classname##_##alias), arg_info, flags)
@@ -140,7 +141,7 @@ typedef struct _zend_fcall_info_cache {
#define ZEND_MODULE_ACTIVATE_D(module) int ZEND_MODULE_ACTIVATE_N(module)(INIT_FUNC_ARGS)
#define ZEND_MODULE_DEACTIVATE_D(module) int ZEND_MODULE_DEACTIVATE_N(module)(SHUTDOWN_FUNC_ARGS)
#define ZEND_MODULE_POST_ZEND_DEACTIVATE_D(module) int ZEND_MODULE_POST_ZEND_DEACTIVATE_N(module)(void)
-#define ZEND_MODULE_INFO_D(module) void ZEND_MODULE_INFO_N(module)(ZEND_MODULE_INFO_FUNC_ARGS)
+#define ZEND_MODULE_INFO_D(module) ZEND_COLD void ZEND_MODULE_INFO_N(module)(ZEND_MODULE_INFO_FUNC_ARGS)
#define ZEND_MODULE_GLOBALS_CTOR_D(module) void ZEND_MODULE_GLOBALS_CTOR_N(module)(zend_##module##_globals *module##_globals)
#define ZEND_MODULE_GLOBALS_DTOR_D(module) void ZEND_MODULE_GLOBALS_DTOR_N(module)(zend_##module##_globals *module##_globals)
@@ -213,7 +214,7 @@ typedef struct _zend_fcall_info_cache {
class_container.unserialize_func = NULL; \
class_container.parent = NULL; \
class_container.num_interfaces = 0; \
- class_container.traits = NULL; \
+ class_container.trait_names = NULL; \
class_container.num_traits = 0; \
class_container.trait_aliases = NULL; \
class_container.trait_precedences = NULL; \
@@ -228,11 +229,8 @@ typedef struct _zend_fcall_info_cache {
#define INIT_NS_CLASS_ENTRY(class_container, ns, class_name, functions) \
INIT_CLASS_ENTRY(class_container, ZEND_NS_NAME(ns, class_name), functions)
-#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])
-#else
-# define CE_STATIC_MEMBERS(ce) ((ce)->static_members_table)
-#endif
+#define CE_STATIC_MEMBERS(ce) \
+ ((zval*)ZEND_MAP_PTR_GET((ce)->static_members_table))
#define ZEND_FCI_INITIALIZED(fci) ((fci).size != 0)
@@ -249,9 +247,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_wrong_parameters_none_error())
+ (EXPECTED(ZEND_NUM_ARGS() == 0) ? SUCCESS : (zend_wrong_parameters_none_error(), FAILURE))
#define zend_parse_parameters_none_throw() \
- (EXPECTED(ZEND_NUM_ARGS() == 0) ? SUCCESS : zend_wrong_parameters_none_exception())
+ (EXPECTED(ZEND_NUM_ARGS() == 0) ? SUCCESS : (zend_wrong_parameters_none_exception(), FAILURE))
/* Parameter parsing API -- andrei */
@@ -305,6 +303,7 @@ ZEND_API ZEND_COLD void zend_wrong_param_count(void);
#define IS_CALLABLE_STRICT (IS_CALLABLE_CHECK_IS_STATIC)
+ZEND_API void zend_release_fcall_info_cache(zend_fcall_info_cache *fcc);
ZEND_API zend_string *zend_get_callable_name_ex(zval *callable, zend_object *object);
ZEND_API zend_string *zend_get_callable_name(zval *callable);
ZEND_API zend_bool zend_is_callable_ex(zval *callable, zend_object *object, uint32_t check_flags, zend_string **callable_name, zend_fcall_info_cache *fcc, char **error);
@@ -312,6 +311,9 @@ ZEND_API zend_bool zend_is_callable(zval *callable, uint32_t check_flags, zend_s
ZEND_API zend_bool zend_make_callable(zval *callable, zend_string **callable_name);
ZEND_API const char *zend_get_module_version(const char *module_name);
ZEND_API int zend_get_module_started(const char *module_name);
+
+ZEND_API int zend_declare_typed_property(zend_class_entry *ce, zend_string *name, zval *property, int access_type, zend_string *doc_comment, zend_type type);
+
ZEND_API int zend_declare_property_ex(zend_class_entry *ce, zend_string *name, zval *property, int access_type, zend_string *doc_comment);
ZEND_API int zend_declare_property(zend_class_entry *ce, const char *name, size_t name_length, zval *property, int access_type);
ZEND_API int zend_declare_property_null(zend_class_entry *ce, const char *name, size_t name_length, int access_type);
@@ -360,7 +362,9 @@ ZEND_API zval *zend_read_static_property(zend_class_entry *scope, const char *na
ZEND_API char *zend_get_type_by_const(int type);
-#define getThis() ((Z_TYPE(EX(This)) == IS_OBJECT) ? &EX(This) : NULL)
+#define ZEND_THIS (&EX(This))
+
+#define getThis() ((Z_TYPE_P(ZEND_THIS) == IS_OBJECT) ? ZEND_THIS : NULL)
#define ZEND_IS_METHOD_CALL() (EX(func)->common.scope != NULL)
#define WRONG_PARAM_COUNT ZEND_WRONG_PARAM_COUNT()
@@ -405,21 +409,19 @@ 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 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)
-#define add_property_unset(__arg, __key) add_property_null(__arg, __key)
-
-ZEND_API int add_index_long(zval *arg, zend_ulong idx, zend_long n);
-ZEND_API int add_index_null(zval *arg, zend_ulong idx);
-ZEND_API int add_index_bool(zval *arg, zend_ulong idx, int b);
-ZEND_API int add_index_resource(zval *arg, zend_ulong idx, zend_resource *r);
-ZEND_API int add_index_double(zval *arg, zend_ulong idx, double d);
-ZEND_API int add_index_str(zval *arg, zend_ulong idx, zend_string *str);
-ZEND_API int add_index_string(zval *arg, zend_ulong idx, const char *str);
-ZEND_API int add_index_stringl(zval *arg, zend_ulong idx, const char *str, size_t length);
-ZEND_API int add_index_zval(zval *arg, zend_ulong index, zval *value);
+ZEND_API int add_index_long(zval *arg, zend_ulong index, zend_long n);
+ZEND_API int add_index_null(zval *arg, zend_ulong index);
+ZEND_API int add_index_bool(zval *arg, zend_ulong index, int b);
+ZEND_API int add_index_resource(zval *arg, zend_ulong index, zend_resource *r);
+ZEND_API int add_index_double(zval *arg, zend_ulong index, double d);
+ZEND_API int add_index_str(zval *arg, zend_ulong index, zend_string *str);
+ZEND_API int add_index_string(zval *arg, zend_ulong index, const char *str);
+ZEND_API int add_index_stringl(zval *arg, zend_ulong index, const char *str, size_t length);
+
+static zend_always_inline 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_API int add_next_index_long(zval *arg, zend_long n);
ZEND_API int add_next_index_null(zval *arg);
@@ -429,19 +431,11 @@ ZEND_API int add_next_index_double(zval *arg, double d);
ZEND_API int add_next_index_str(zval *arg, zend_string *str);
ZEND_API int add_next_index_string(zval *arg, const char *str);
ZEND_API int add_next_index_stringl(zval *arg, const char *str, size_t length);
-ZEND_API int add_next_index_zval(zval *arg, zval *value);
-
-ZEND_API zval *add_get_assoc_string_ex(zval *arg, const char *key, uint32_t key_len, const char *str);
-ZEND_API zval *add_get_assoc_stringl_ex(zval *arg, const char *key, uint32_t key_len, const char *str, size_t length);
-
-#define add_get_assoc_string(__arg, __key, __str) add_get_assoc_string_ex(__arg, __key, strlen(__key), __str)
-#define add_get_assoc_stringl(__arg, __key, __str, __length) add_get_assoc_stringl_ex(__arg, __key, strlen(__key), __str, __length)
-ZEND_API zval *add_get_index_long(zval *arg, zend_ulong idx, zend_long l);
-ZEND_API zval *add_get_index_double(zval *arg, zend_ulong idx, double d);
-ZEND_API zval *add_get_index_str(zval *arg, zend_ulong index, zend_string *str);
-ZEND_API zval *add_get_index_string(zval *arg, zend_ulong idx, const char *str);
-ZEND_API zval *add_get_index_stringl(zval *arg, zend_ulong idx, const char *str, size_t length);
+static zend_always_inline int add_next_index_zval(zval *arg, zval *value)
+{
+ return zend_hash_next_index_insert(Z_ARRVAL_P(arg), value) ? SUCCESS : FAILURE;
+}
ZEND_API int array_set_zval_key(HashTable *ht, zval *key, zval *value);
@@ -541,21 +535,30 @@ ZEND_API void zend_attach_symbol_table(zend_execute_data *execute_data);
ZEND_API void zend_detach_symbol_table(zend_execute_data *execute_data);
ZEND_API int zend_set_local_var(zend_string *name, zval *value, int force);
ZEND_API int zend_set_local_var_str(const char *name, size_t len, zval *value, int force);
-ZEND_API int zend_forbid_dynamic_call(const char *func_name);
+
+static zend_always_inline int zend_forbid_dynamic_call(const char *func_name)
+{
+ zend_execute_data *ex = EG(current_execute_data);
+ ZEND_ASSERT(ex != NULL && ex->func != NULL);
+
+ if (ZEND_CALL_INFO(ex) & ZEND_CALL_DYNAMIC) {
+ zend_error(E_WARNING, "Cannot call %s dynamically", func_name);
+ return FAILURE;
+ }
+
+ return SUCCESS;
+}
ZEND_API zend_string *zend_find_alias_name(zend_class_entry *ce, zend_string *name);
ZEND_API zend_string *zend_resolve_method_name(zend_class_entry *ce, zend_function *f);
-ZEND_API const char *zend_get_object_type(const zend_class_entry *ce);
+ZEND_API ZEND_COLD 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);
-ZEND_API ZEND_FUNCTION(display_disabled_class);
END_EXTERN_C()
#if ZEND_DEBUG
@@ -627,6 +630,7 @@ END_EXTERN_C()
#define RETVAL_EMPTY_STRING() ZVAL_EMPTY_STRING(return_value)
#define RETVAL_RES(r) ZVAL_RES(return_value, r)
#define RETVAL_ARR(r) ZVAL_ARR(return_value, r)
+#define RETVAL_EMPTY_ARRAY() ZVAL_EMPTY_ARRAY(return_value)
#define RETVAL_OBJ(r) ZVAL_OBJ(return_value, r)
#define RETVAL_ZVAL(zv, copy, dtor) ZVAL_ZVAL(return_value, zv, copy, dtor)
#define RETVAL_FALSE ZVAL_FALSE(return_value)
@@ -645,6 +649,7 @@ END_EXTERN_C()
#define RETURN_EMPTY_STRING() { RETVAL_EMPTY_STRING(); return; }
#define RETURN_RES(r) { RETVAL_RES(r); return; }
#define RETURN_ARR(r) { RETVAL_ARR(r); return; }
+#define RETURN_EMPTY_ARRAY() { RETVAL_EMPTY_ARRAY(); return; }
#define RETURN_OBJ(r) { RETVAL_OBJ(r); return; }
#define RETURN_ZVAL(zv, copy, dtor) { RETVAL_ZVAL(zv, copy, dtor); return; }
#define RETURN_FALSE { RETVAL_FALSE; return; }
@@ -670,6 +675,422 @@ END_EXTERN_C()
#define ZEND_GINIT_FUNCTION ZEND_MODULE_GLOBALS_CTOR_D
#define ZEND_GSHUTDOWN_FUNCTION ZEND_MODULE_GLOBALS_DTOR_D
+/* May modify arg in-place. Will free arg in failure case (and take ownership in success case).
+ * Prefer using the ZEND_TRY_ASSIGN_* macros over these APIs. */
+ZEND_API int zend_try_assign_typed_ref_ex(zend_reference *ref, zval *zv, zend_bool strict);
+ZEND_API int zend_try_assign_typed_ref(zend_reference *ref, zval *zv);
+
+ZEND_API int zend_try_assign_typed_ref_null(zend_reference *ref);
+ZEND_API int zend_try_assign_typed_ref_bool(zend_reference *ref, zend_bool val);
+ZEND_API int zend_try_assign_typed_ref_long(zend_reference *ref, zend_long lval);
+ZEND_API int zend_try_assign_typed_ref_double(zend_reference *ref, double dval);
+ZEND_API int zend_try_assign_typed_ref_empty_string(zend_reference *ref);
+ZEND_API int zend_try_assign_typed_ref_str(zend_reference *ref, zend_string *str);
+ZEND_API int zend_try_assign_typed_ref_string(zend_reference *ref, const char *string);
+ZEND_API int zend_try_assign_typed_ref_stringl(zend_reference *ref, const char *string, size_t len);
+ZEND_API int zend_try_assign_typed_ref_arr(zend_reference *ref, zend_array *arr);
+ZEND_API int zend_try_assign_typed_ref_res(zend_reference *ref, zend_resource *res);
+ZEND_API int zend_try_assign_typed_ref_zval(zend_reference *ref, zval *zv);
+ZEND_API int zend_try_assign_typed_ref_zval_ex(zend_reference *ref, zval *zv, zend_bool strict);
+
+#define _ZEND_TRY_ASSIGN_NULL(zv, is_ref) do { \
+ zval *_zv = zv; \
+ if (is_ref || UNEXPECTED(Z_ISREF_P(_zv))) { \
+ zend_reference *ref = Z_REF_P(_zv); \
+ if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { \
+ zend_try_assign_typed_ref_null(ref); \
+ break; \
+ } \
+ _zv = &ref->val; \
+ } \
+ zval_ptr_dtor(_zv); \
+ ZVAL_NULL(_zv); \
+} while (0)
+
+#define ZEND_TRY_ASSIGN_NULL(zv) \
+ _ZEND_TRY_ASSIGN_NULL(zv, 0)
+
+#define ZEND_TRY_ASSIGN_REF_NULL(zv) do { \
+ ZEND_ASSERT(Z_ISREF_P(zv)); \
+ _ZEND_TRY_ASSIGN_NULL(zv, 1); \
+} while (0)
+
+#define _ZEND_TRY_ASSIGN_FALSE(zv, is_ref) do { \
+ zval *_zv = zv; \
+ if (is_ref || UNEXPECTED(Z_ISREF_P(_zv))) { \
+ zend_reference *ref = Z_REF_P(_zv); \
+ if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { \
+ zend_try_assign_typed_ref_bool(ref, 0); \
+ break; \
+ } \
+ _zv = &ref->val; \
+ } \
+ zval_ptr_dtor(_zv); \
+ ZVAL_FALSE(_zv); \
+} while (0)
+
+#define ZEND_TRY_ASSIGN_FALSE(zv) \
+ _ZEND_TRY_ASSIGN_FALSE(zv, 0)
+
+#define ZEND_TRY_ASSIGN_REF_FALSE(zv) do { \
+ ZEND_ASSERT(Z_ISREF_P(zv)); \
+ _ZEND_TRY_ASSIGN_FALSE(zv, 1); \
+} while (0)
+
+#define _ZEND_TRY_ASSIGN_TRUE(zv, is_ref) do { \
+ zval *_zv = zv; \
+ if (is_ref || UNEXPECTED(Z_ISREF_P(_zv))) { \
+ zend_reference *ref = Z_REF_P(_zv); \
+ if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { \
+ zend_try_assign_typed_ref_bool(ref, 1); \
+ break; \
+ } \
+ _zv = &ref->val; \
+ } \
+ zval_ptr_dtor(_zv); \
+ ZVAL_TRUE(_zv); \
+} while (0)
+
+#define ZEND_TRY_ASSIGN_TRUE(zv) \
+ _ZEND_TRY_ASSIGN_TRUE(zv, 0)
+
+#define ZEND_TRY_ASSIGN_REF_TRUE(zv) do { \
+ ZEND_ASSERT(Z_ISREF_P(zv)); \
+ _ZEND_TRY_ASSIGN_TRUE(zv, 1); \
+} while (0)
+
+#define _ZEND_TRY_ASSIGN_BOOL(zv, bval, is_ref) do { \
+ zval *_zv = zv; \
+ if (is_ref || UNEXPECTED(Z_ISREF_P(_zv))) { \
+ zend_reference *ref = Z_REF_P(_zv); \
+ if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { \
+ zend_try_assign_typed_ref_bool(ref, 1); \
+ break; \
+ } \
+ _zv = &ref->val; \
+ } \
+ zval_ptr_dtor(_zv); \
+ ZVAL_BOOL(_zv, bval); \
+} while (0)
+
+#define ZEND_TRY_ASSIGN_BOOL(zv, bval) \
+ _ZEND_TRY_ASSIGN_BOOL(zv, bval, 0)
+
+#define ZEND_TRY_ASSIGN_REF_BOOL(zv, bval) do { \
+ ZEND_ASSERT(Z_ISREF_P(zv)); \
+ _ZEND_TRY_ASSIGN_BOOL(zv, bval, 1); \
+} while (0)
+
+#define _ZEND_TRY_ASSIGN_LONG(zv, lval, is_ref) do { \
+ zval *_zv = zv; \
+ if (is_ref || UNEXPECTED(Z_ISREF_P(_zv))) { \
+ zend_reference *ref = Z_REF_P(_zv); \
+ if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { \
+ zend_try_assign_typed_ref_long(ref, lval); \
+ break; \
+ } \
+ _zv = &ref->val; \
+ } \
+ zval_ptr_dtor(_zv); \
+ ZVAL_LONG(_zv, lval); \
+} while (0)
+
+#define ZEND_TRY_ASSIGN_LONG(zv, lval) \
+ _ZEND_TRY_ASSIGN_LONG(zv, lval, 0)
+
+#define ZEND_TRY_ASSIGN_REF_LONG(zv, lval) do { \
+ ZEND_ASSERT(Z_ISREF_P(zv)); \
+ _ZEND_TRY_ASSIGN_LONG(zv, lval, 1); \
+} while (0)
+
+#define _ZEND_TRY_ASSIGN_DOUBLE(zv, dval, is_ref) do { \
+ zval *_zv = zv; \
+ if (is_ref || UNEXPECTED(Z_ISREF_P(_zv))) { \
+ zend_reference *ref = Z_REF_P(_zv); \
+ if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { \
+ zend_try_assign_typed_ref_double(ref, dval); \
+ break; \
+ } \
+ _zv = &ref->val; \
+ } \
+ zval_ptr_dtor(_zv); \
+ ZVAL_DOUBLE(_zv, dval); \
+} while (0)
+
+#define ZEND_TRY_ASSIGN_DOUBLE(zv, dval) \
+ _ZEND_TRY_ASSIGN_DOUBLE(zv, dval, 0)
+
+#define ZEND_TRY_ASSIGN_REF_DOUBLE(zv, dval) do { \
+ ZEND_ASSERT(Z_ISREF_P(zv)); \
+ _ZEND_TRY_ASSIGN_DOUBLE(zv, dval, 1); \
+} while (0)
+
+#define _ZEND_TRY_ASSIGN_EMPTY_STRING(zv, is_ref) do { \
+ zval *_zv = zv; \
+ if (is_ref || UNEXPECTED(Z_ISREF_P(_zv))) { \
+ zend_reference *ref = Z_REF_P(_zv); \
+ if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { \
+ zend_try_assign_typed_ref_empty_string(ref); \
+ break; \
+ } \
+ _zv = &ref->val; \
+ } \
+ zval_ptr_dtor(_zv); \
+ ZVAL_EMPTY_STRING(_zv); \
+} while (0)
+
+#define ZEND_TRY_ASSIGN_EMPTY_STRING(zv) \
+ _ZEND_TRY_ASSIGN_EMPTY_STRING(zv, 0)
+
+#define ZEND_TRY_ASSIGN_REF_EMPTY_STRING(zv) do { \
+ ZEND_ASSERT(Z_ISREF_P(zv)); \
+ _ZEND_TRY_ASSIGN_EMPTY_STRING(zv, 1); \
+} while (0)
+
+#define _ZEND_TRY_ASSIGN_STR(zv, str, is_ref) do { \
+ zval *_zv = zv; \
+ if (is_ref || UNEXPECTED(Z_ISREF_P(_zv))) { \
+ zend_reference *ref = Z_REF_P(_zv); \
+ if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { \
+ zend_try_assign_typed_ref_str(ref, str); \
+ break; \
+ } \
+ _zv = &ref->val; \
+ } \
+ zval_ptr_dtor(_zv); \
+ ZVAL_STR(_zv, str); \
+} while (0)
+
+#define ZEND_TRY_ASSIGN_STR(zv, str) \
+ _ZEND_TRY_ASSIGN_STR(zv, str, 0)
+
+#define ZEND_TRY_ASSIGN_REF_STR(zv, str) do { \
+ ZEND_ASSERT(Z_ISREF_P(zv)); \
+ _ZEND_TRY_ASSIGN_STR(zv, str, 1); \
+} while (0)
+
+#define _ZEND_TRY_ASSIGN_NEW_STR(zv, str, is_str) do { \
+ zval *_zv = zv; \
+ if (is_str || UNEXPECTED(Z_ISREF_P(_zv))) { \
+ zend_reference *ref = Z_REF_P(_zv); \
+ if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { \
+ zend_try_assign_typed_ref_str(ref, str); \
+ break; \
+ } \
+ _zv = &ref->val; \
+ } \
+ zval_ptr_dtor(_zv); \
+ ZVAL_NEW_STR(_zv, str); \
+} while (0)
+
+#define ZEND_TRY_ASSIGN_NEW_STR(zv, str) \
+ _ZEND_TRY_ASSIGN_NEW_STR(zv, str, 0)
+
+#define ZEND_TRY_ASSIGN_REF_NEW_STR(zv, str) do { \
+ ZEND_ASSERT(Z_ISREF_P(zv)); \
+ _ZEND_TRY_ASSIGN_NEW_STR(zv, str, 1); \
+} while (0)
+
+#define _ZEND_TRY_ASSIGN_STRING(zv, string, is_ref) do { \
+ zval *_zv = zv; \
+ if (is_ref || UNEXPECTED(Z_ISREF_P(_zv))) { \
+ zend_reference *ref = Z_REF_P(_zv); \
+ if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { \
+ zend_try_assign_typed_ref_string(ref, string); \
+ break; \
+ } \
+ _zv = &ref->val; \
+ } \
+ zval_ptr_dtor(_zv); \
+ ZVAL_STRING(_zv, string); \
+} while (0)
+
+#define ZEND_TRY_ASSIGN_STRING(zv, string) \
+ _ZEND_TRY_ASSIGN_STRING(zv, string, 0)
+
+#define ZEND_TRY_ASSIGN_REF_STRING(zv, string) do { \
+ ZEND_ASSERT(Z_ISREF_P(zv)); \
+ _ZEND_TRY_ASSIGN_STRING(zv, string, 1); \
+} while (0)
+
+#define _ZEND_TRY_ASSIGN_STRINGL(zv, string, len, is_ref) do { \
+ zval *_zv = zv; \
+ if (is_ref || UNEXPECTED(Z_ISREF_P(_zv))) { \
+ zend_reference *ref = Z_REF_P(_zv); \
+ if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { \
+ zend_try_assign_typed_ref_stringl(ref, string, len); \
+ break; \
+ } \
+ _zv = &ref->val; \
+ } \
+ zval_ptr_dtor(_zv); \
+ ZVAL_STRINGL(_zv, string, len); \
+} while (0)
+
+#define ZEND_TRY_ASSIGN_STRINGL(zv, string, len) \
+ _ZEND_TRY_ASSIGN_STRINGL(zv, string, len, 0)
+
+#define ZEND_TRY_ASSIGN_REF_STRINGL(zv, string, len) do { \
+ ZEND_ASSERT(Z_ISREF_P(zv)); \
+ _ZEND_TRY_ASSIGN_STRINGL(zv, string, len, 1); \
+} while (0)
+
+#define _ZEND_TRY_ASSIGN_ARR(zv, arr, is_ref) do { \
+ zval *_zv = zv; \
+ if (is_ref || UNEXPECTED(Z_ISREF_P(_zv))) { \
+ zend_reference *ref = Z_REF_P(_zv); \
+ if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { \
+ zend_try_assign_typed_ref_arr(ref, arr); \
+ break; \
+ } \
+ _zv = &ref->val; \
+ } \
+ zval_ptr_dtor(_zv); \
+ ZVAL_ARR(_zv, arr); \
+} while (0)
+
+#define ZEND_TRY_ASSIGN_ARR(zv, arr) \
+ _ZEND_TRY_ASSIGN_ARR(zv, arr, 0)
+
+#define ZEND_TRY_ASSIGN_REF_ARR(zv, arr) do { \
+ ZEND_ASSERT(Z_ISREF_P(zv)); \
+ _ZEND_TRY_ASSIGN_ARR(zv, arr, 1); \
+} while (0)
+
+#define _ZEND_TRY_ASSIGN_RES(zv, res, is_ref) do { \
+ zval *_zv = zv; \
+ if (is_ref || UNEXPECTED(Z_ISREF_P(_zv))) { \
+ zend_reference *ref = Z_REF_P(_zv); \
+ if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { \
+ zend_try_assign_typed_ref_res(ref, res); \
+ break; \
+ } \
+ _zv = &ref->val; \
+ } \
+ zval_ptr_dtor(_zv); \
+ ZVAL_RES(_zv, res); \
+} while (0)
+
+#define ZEND_TRY_ASSIGN_RES(zv, res) \
+ _ZEND_TRY_ASSIGN_RES(zv, res, 0)
+
+#define ZEND_TRY_ASSIGN_REF_RES(zv, res) do { \
+ ZEND_ASSERT(Z_ISREF_P(zv)); \
+ _ZEND_TRY_ASSIGN_RES(zv, res, 1); \
+} while (0)
+
+#define _ZEND_TRY_ASSIGN_TMP(zv, other_zv, is_ref) do { \
+ zval *_zv = zv; \
+ if (is_ref || UNEXPECTED(Z_ISREF_P(_zv))) { \
+ zend_reference *ref = Z_REF_P(_zv); \
+ if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { \
+ zend_try_assign_typed_ref(ref, other_zv); \
+ break; \
+ } \
+ _zv = &ref->val; \
+ } \
+ zval_ptr_dtor(_zv); \
+ ZVAL_COPY_VALUE(_zv, other_zv); \
+} while (0)
+
+#define ZEND_TRY_ASSIGN_TMP(zv, other_zv) \
+ _ZEND_TRY_ASSIGN_TMP(zv, other_zv, 0)
+
+#define ZEND_TRY_ASSIGN_REF_TMP(zv, other_zv) do { \
+ ZEND_ASSERT(Z_ISREF_P(zv)); \
+ _ZEND_TRY_ASSIGN_TMP(zv, other_zv, 1); \
+} while (0)
+
+#define _ZEND_TRY_ASSIGN_VALUE(zv, other_zv, is_ref) do { \
+ zval *_zv = zv; \
+ if (is_ref || UNEXPECTED(Z_ISREF_P(_zv))) { \
+ zend_reference *ref = Z_REF_P(_zv); \
+ if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { \
+ zend_try_assign_typed_ref_zval(ref, other_zv); \
+ break; \
+ } \
+ _zv = &ref->val; \
+ } \
+ zval_ptr_dtor(_zv); \
+ ZVAL_COPY_VALUE(_zv, other_zv); \
+} while (0)
+
+#define ZEND_TRY_ASSIGN_VALUE(zv, other_zv) \
+ _ZEND_TRY_ASSIGN_VALUE(zv, other_zv, 0)
+
+#define ZEND_TRY_ASSIGN_REF_VALUE(zv, other_zv) do { \
+ ZEND_ASSERT(Z_ISREF_P(zv)); \
+ _ZEND_TRY_ASSIGN_VALUE(zv, other_zv, 1); \
+} while (0)
+
+#define ZEND_TRY_ASSIGN_COPY(zv, other_zv) do { \
+ Z_TRY_ADDREF_P(other_zv); \
+ ZEND_TRY_ASSIGN_VALUE(zv, other_zv); \
+} while (0)
+
+#define ZEND_TRY_ASSIGN_REF_COPY(zv, other_zv) do { \
+ Z_TRY_ADDREF_P(other_zv); \
+ ZEND_TRY_ASSIGN_REF_VALUE(zv, other_zv); \
+} while (0)
+
+#define _ZEND_TRY_ASSIGN_VALUE_EX(zv, other_zv, strict, is_ref) do { \
+ zval *_zv = zv; \
+ if (is_ref || UNEXPECTED(Z_ISREF_P(_zv))) { \
+ zend_reference *ref = Z_REF_P(_zv); \
+ if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { \
+ zend_try_assign_typed_ref_zval_ex(ref, other_zv, strict); \
+ break; \
+ } \
+ _zv = &ref->val; \
+ } \
+ zval_ptr_dtor(_zv); \
+ ZVAL_COPY_VALUE(_zv, other_zv); \
+} while (0)
+
+#define ZEND_TRY_ASSIGN_VALUE_EX(zv, other_zv, strict) \
+ _ZEND_TRY_ASSIGN_VALUE_EX(zv, other_zv, strict, 0)
+
+#define ZEND_TRY_ASSIGN_REF_VALUE_EX(zv, other_zv, strict) do { \
+ ZEND_ASSERT(Z_ISREF_P(zv)); \
+ _ZEND_TRY_ASSIGN_VALUE_EX(zv, other_zv, strict, 1); \
+} while (0)
+
+#define ZEND_TRY_ASSIGN_COPY_EX(zv, other_zv, strict) do { \
+ Z_TRY_ADDREF_P(other_zv); \
+ ZEND_TRY_ASSIGN_VALUE_EX(zv, other_zv, strict); \
+} while (0)
+
+#define ZEND_TRY_ASSIGN_REF_COPY_EX(zv, other_zv, strict) do { \
+ Z_TRY_ADDREF_P(other_zv); \
+ ZEND_TRY_ASSIGN_REF_VALUE_EX(zv, other_zv, strict); \
+} while (0)
+
+/* Initializes a reference to an empty array and returns dereferenced zval,
+ * or NULL if the initialization failed. */
+static zend_always_inline zval *zend_try_array_init_size(zval *zv, uint32_t size)
+{
+ zend_array *arr = zend_new_array(size);
+
+ if (EXPECTED(Z_ISREF_P(zv))) {
+ zend_reference *ref = Z_REF_P(zv);
+ if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) {
+ if (zend_try_assign_typed_ref_arr(ref, arr) != SUCCESS) {
+ return NULL;
+ }
+ return &ref->val;
+ }
+ zv = &ref->val;
+ }
+ zval_ptr_dtor(zv);
+ ZVAL_ARR(zv, arr);
+ return zv;
+}
+
+static zend_always_inline zval *zend_try_array_init(zval *zv)
+{
+ return zend_try_array_init_size(zv, 0);
+}
+
/* Fast parameter parsing API */
/* Fast ZPP is always enabled now; this define is left in for compatibility
@@ -720,13 +1141,13 @@ ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_callback_exception(int num, cha
int _min_num_args = (min_num_args); \
int _max_num_args = (max_num_args); \
int _num_args = EX_NUM_ARGS(); \
- int _i; \
+ int _i = 0; \
zval *_real_arg, *_arg = NULL; \
zend_expected_type _expected_type = Z_EXPECTED_LONG; \
char *_error = NULL; \
zend_bool _dummy; \
zend_bool _optional = 0; \
- int error_code = ZPP_ERROR_OK; \
+ int _error_code = ZPP_ERROR_OK; \
((void)_i); \
((void)_real_arg); \
((void)_arg); \
@@ -746,10 +1167,9 @@ ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_callback_exception(int num, cha
zend_wrong_parameters_count_error(_min_num_args, _max_num_args); \
} \
} \
- error_code = ZPP_ERROR_FAILURE; \
+ _error_code = ZPP_ERROR_FAILURE; \
break; \
} \
- _i = 0; \
_real_arg = ZEND_CALL_ARG(execute_data, 0);
#define ZEND_PARSE_PARAMETERS_START(min_num_args, max_num_args) \
@@ -764,21 +1184,21 @@ ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_callback_exception(int num, cha
#define ZEND_PARSE_PARAMETERS_END_EX(failure) \
} while (0); \
- if (UNEXPECTED(error_code != ZPP_ERROR_OK)) { \
+ if (UNEXPECTED(_error_code != ZPP_ERROR_OK)) { \
if (!(_flags & ZEND_PARSE_PARAMS_QUIET)) { \
- if (error_code == ZPP_ERROR_WRONG_CALLBACK) { \
+ if (_error_code == ZPP_ERROR_WRONG_CALLBACK) { \
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) { \
+ } else if (_error_code == ZPP_ERROR_WRONG_CLASS) { \
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) { \
+ } else if (_error_code == ZPP_ERROR_WRONG_ARG) { \
if (_flags & ZEND_PARSE_PARAMS_THROW) { \
zend_wrong_parameter_type_exception(_i, _expected_type, _arg); \
} else { \
@@ -803,7 +1223,9 @@ ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_callback_exception(int num, cha
_real_arg++; \
_arg = _real_arg; \
if (deref) { \
- ZVAL_DEREF(_arg); \
+ if (EXPECTED(Z_ISREF_P(_arg))) { \
+ _arg = Z_REFVAL_P(_arg); \
+ } \
} \
if (separate) { \
SEPARATE_ZVAL_NOREF(_arg); \
@@ -818,7 +1240,7 @@ ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_callback_exception(int num, cha
Z_PARAM_PROLOGUE(deref, separate); \
if (UNEXPECTED(!zend_parse_arg_array(_arg, &dest, check_null, 0))) { \
_expected_type = Z_EXPECTED_ARRAY; \
- error_code = ZPP_ERROR_WRONG_ARG; \
+ _error_code = ZPP_ERROR_WRONG_ARG; \
break; \
}
@@ -833,7 +1255,7 @@ ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_callback_exception(int num, cha
Z_PARAM_PROLOGUE(deref, separate); \
if (UNEXPECTED(!zend_parse_arg_array(_arg, &dest, check_null, 1))) { \
_expected_type = Z_EXPECTED_ARRAY; \
- error_code = ZPP_ERROR_WRONG_ARG; \
+ _error_code = ZPP_ERROR_WRONG_ARG; \
break; \
}
@@ -848,7 +1270,7 @@ ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_callback_exception(int num, cha
Z_PARAM_PROLOGUE(deref, separate); \
if (UNEXPECTED(!zend_parse_arg_bool(_arg, &dest, &is_null, check_null))) { \
_expected_type = Z_EXPECTED_BOOL; \
- error_code = ZPP_ERROR_WRONG_ARG; \
+ _error_code = ZPP_ERROR_WRONG_ARG; \
break; \
}
@@ -862,7 +1284,7 @@ ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_callback_exception(int num, cha
#define Z_PARAM_CLASS_EX2(dest, check_null, deref, separate) \
Z_PARAM_PROLOGUE(deref, separate); \
if (UNEXPECTED(!zend_parse_arg_class(_arg, &dest, _i, check_null))) { \
- error_code = ZPP_ERROR_FAILURE; \
+ _error_code = ZPP_ERROR_FAILURE; \
break; \
}
@@ -877,7 +1299,7 @@ ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_callback_exception(int num, cha
Z_PARAM_PROLOGUE(deref, separate); \
if (UNEXPECTED(!zend_parse_arg_double(_arg, &dest, &is_null, check_null))) { \
_expected_type = Z_EXPECTED_DOUBLE; \
- error_code = ZPP_ERROR_WRONG_ARG; \
+ _error_code = ZPP_ERROR_WRONG_ARG; \
break; \
}
@@ -893,10 +1315,10 @@ ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_callback_exception(int num, cha
if (UNEXPECTED(!zend_parse_arg_func(_arg, &dest_fci, &dest_fcc, check_null, &_error))) { \
if (!_error) { \
_expected_type = Z_EXPECTED_FUNC; \
- error_code = ZPP_ERROR_WRONG_ARG; \
+ _error_code = ZPP_ERROR_WRONG_ARG; \
break; \
} else { \
- error_code = ZPP_ERROR_WRONG_CALLBACK; \
+ _error_code = ZPP_ERROR_WRONG_CALLBACK; \
break; \
} \
} else if (UNEXPECTED(_error != NULL)) { \
@@ -914,7 +1336,7 @@ ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_callback_exception(int num, cha
Z_PARAM_PROLOGUE(deref, separate); \
if (UNEXPECTED(!zend_parse_arg_array_ht(_arg, &dest, check_null, 0, separate))) { \
_expected_type = Z_EXPECTED_ARRAY; \
- error_code = ZPP_ERROR_WRONG_ARG; \
+ _error_code = ZPP_ERROR_WRONG_ARG; \
break; \
}
@@ -929,7 +1351,7 @@ ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_callback_exception(int num, cha
Z_PARAM_PROLOGUE(deref, separate); \
if (UNEXPECTED(!zend_parse_arg_array_ht(_arg, &dest, check_null, 1, separate))) { \
_expected_type = Z_EXPECTED_ARRAY; \
- error_code = ZPP_ERROR_WRONG_ARG; \
+ _error_code = ZPP_ERROR_WRONG_ARG; \
break; \
}
@@ -944,7 +1366,7 @@ ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_callback_exception(int num, cha
Z_PARAM_PROLOGUE(deref, separate); \
if (UNEXPECTED(!zend_parse_arg_long(_arg, &dest, &is_null, check_null, 0))) { \
_expected_type = Z_EXPECTED_LONG; \
- error_code = ZPP_ERROR_WRONG_ARG; \
+ _error_code = ZPP_ERROR_WRONG_ARG; \
break; \
}
@@ -959,7 +1381,7 @@ ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_callback_exception(int num, cha
Z_PARAM_PROLOGUE(deref, separate); \
if (UNEXPECTED(!zend_parse_arg_long(_arg, &dest, &is_null, check_null, 1))) { \
_expected_type = Z_EXPECTED_LONG; \
- error_code = ZPP_ERROR_WRONG_ARG; \
+ _error_code = ZPP_ERROR_WRONG_ARG; \
break; \
}
@@ -974,7 +1396,7 @@ ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_callback_exception(int num, cha
Z_PARAM_PROLOGUE(deref, separate); \
if (UNEXPECTED(!zend_parse_arg_object(_arg, &dest, NULL, check_null))) { \
_expected_type = Z_EXPECTED_OBJECT; \
- error_code = ZPP_ERROR_WRONG_ARG; \
+ _error_code = ZPP_ERROR_WRONG_ARG; \
break; \
}
@@ -990,11 +1412,11 @@ ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_callback_exception(int num, cha
if (UNEXPECTED(!zend_parse_arg_object(_arg, &dest, _ce, check_null))) { \
if (_ce) { \
_error = ZSTR_VAL((_ce)->name); \
- error_code = ZPP_ERROR_WRONG_CLASS; \
+ _error_code = ZPP_ERROR_WRONG_CLASS; \
break; \
} else { \
_expected_type = Z_EXPECTED_OBJECT; \
- error_code = ZPP_ERROR_WRONG_ARG; \
+ _error_code = ZPP_ERROR_WRONG_ARG; \
break; \
} \
}
@@ -1010,7 +1432,7 @@ ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_callback_exception(int num, cha
Z_PARAM_PROLOGUE(deref, separate); \
if (UNEXPECTED(!zend_parse_arg_path(_arg, &dest, &dest_len, check_null))) { \
_expected_type = Z_EXPECTED_PATH; \
- error_code = ZPP_ERROR_WRONG_ARG; \
+ _error_code = ZPP_ERROR_WRONG_ARG; \
break; \
}
@@ -1025,7 +1447,7 @@ ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_callback_exception(int num, cha
Z_PARAM_PROLOGUE(deref, separate); \
if (UNEXPECTED(!zend_parse_arg_path_str(_arg, &dest, check_null))) { \
_expected_type = Z_EXPECTED_PATH; \
- error_code = ZPP_ERROR_WRONG_ARG; \
+ _error_code = ZPP_ERROR_WRONG_ARG; \
break; \
}
@@ -1040,7 +1462,7 @@ ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_callback_exception(int num, cha
Z_PARAM_PROLOGUE(deref, separate); \
if (UNEXPECTED(!zend_parse_arg_resource(_arg, &dest, check_null))) { \
_expected_type = Z_EXPECTED_RESOURCE; \
- error_code = ZPP_ERROR_WRONG_ARG; \
+ _error_code = ZPP_ERROR_WRONG_ARG; \
break; \
}
@@ -1055,7 +1477,7 @@ ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_callback_exception(int num, cha
Z_PARAM_PROLOGUE(deref, separate); \
if (UNEXPECTED(!zend_parse_arg_string(_arg, &dest, &dest_len, check_null))) { \
_expected_type = Z_EXPECTED_STRING; \
- error_code = ZPP_ERROR_WRONG_ARG; \
+ _error_code = ZPP_ERROR_WRONG_ARG; \
break; \
}
@@ -1070,7 +1492,7 @@ ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_callback_exception(int num, cha
Z_PARAM_PROLOGUE(deref, separate); \
if (UNEXPECTED(!zend_parse_arg_str(_arg, &dest, check_null))) { \
_expected_type = Z_EXPECTED_STRING; \
- error_code = ZPP_ERROR_WRONG_ARG; \
+ _error_code = ZPP_ERROR_WRONG_ARG; \
break; \
}
@@ -1327,14 +1749,3 @@ static zend_always_inline void zend_parse_arg_zval_deref(zval *arg, zval **dest,
END_EXTERN_C()
#endif /* ZEND_API_H */
-
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * indent-tabs-mode: t
- * End:
- * vim600: sw=4 ts=4 fdm=marker
- * vim<600: sw=4 ts=4
- */
diff --git a/Zend/zend_alloc.c b/Zend/zend_alloc.c
index 25216898ed..5458e7acf6 100644
--- a/Zend/zend_alloc.c
+++ b/Zend/zend_alloc.c
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| Zend Engine |
+----------------------------------------------------------------------+
- | Copyright (c) 1998-2018 Zend Technologies Ltd. (http://www.zend.com) |
+ | Copyright (c) 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 |
@@ -57,10 +57,8 @@
#include "zend_operators.h"
#include "zend_multiply.h"
#include "zend_bitset.h"
+#include <signal.h>
-#ifdef HAVE_SIGNAL_H
-# include <signal.h>
-#endif
#ifdef HAVE_UNISTD_H
# include <unistd.h>
#endif
@@ -68,6 +66,7 @@
#ifdef ZEND_WIN32
# include <wincrypt.h>
# include <process.h>
+# include "win32/winutil.h"
#endif
#include <stdio.h>
@@ -76,30 +75,17 @@
#include <sys/types.h>
#include <sys/stat.h>
-#if HAVE_LIMITS_H
#include <limits.h>
-#endif
#include <fcntl.h>
#include <errno.h>
#ifndef _WIN32
-# ifdef HAVE_MREMAP
-# ifndef _GNU_SOURCE
-# define _GNU_SOURCE
-# endif
-# ifndef __USE_GNU
-# define __USE_GNU
-# endif
-# endif
# include <sys/mman.h>
# ifndef MAP_ANON
# ifdef MAP_ANONYMOUS
# define MAP_ANON MAP_ANONYMOUS
# endif
# endif
-# ifndef MREMAP_MAYMOVE
-# define MREMAP_MAYMOVE 0
-# endif
# ifndef MAP_FAILED
# define MAP_FAILED ((void*)-1)
# endif
@@ -110,12 +96,30 @@
# define REAL_PAGE_SIZE _real_page_size
static size_t _real_page_size = ZEND_MM_PAGE_SIZE;
# endif
+# ifdef MAP_ALIGNED_SUPER
+# define MAP_HUGETLB MAP_ALIGNED_SUPER
+# endif
#endif
#ifndef REAL_PAGE_SIZE
# define REAL_PAGE_SIZE ZEND_MM_PAGE_SIZE
#endif
+/* NetBSD has an mremap() function with a signature that is incompatible with Linux (WTF?),
+ * so pretend it doesn't exist. */
+#ifndef __linux__
+# undef HAVE_MREMAP
+#endif
+
+#ifndef __APPLE__
+# define ZEND_MM_FD -1
+#else
+/* Mac allows to track anonymous page via vmmap per TAG id.
+ * user land applications are allowed to take from 240 to 255.
+ */
+# define ZEND_MM_FD (250<<24)
+#endif
+
#ifndef ZEND_MM_STAT
# define ZEND_MM_STAT 1 /* track current and peak memory usage */
#endif
@@ -194,10 +198,10 @@ typedef struct _zend_mm_huge_list zend_mm_huge_list;
int zend_mm_use_huge_pages = 0;
/*
- * Memory is retrived from OS by chunks of fixed size 2MB.
+ * Memory is retrieved from OS by chunks of fixed size 2MB.
* Inside chunk it's managed by pages of fixed size 4096B.
* So each chunk consists from 512 pages.
- * The first page of each chunk is reseved for chunk header.
+ * The first page of each chunk is reserved for chunk header.
* It contains service information about all pages.
*
* free_pages - current number of free pages in this chunk
@@ -252,7 +256,7 @@ struct _zend_mm_heap {
zend_mm_chunk *main_chunk;
zend_mm_chunk *cached_chunks; /* list of unused chunks */
- int chunks_count; /* number of alocated chunks */
+ int chunks_count; /* number of allocated chunks */
int peak_chunks_count; /* peak number of allocated chunks for current request */
int cached_chunks_count; /* number of cached chunks */
double avg_chunks_count; /* average number of chunks allocated per request */
@@ -271,6 +275,7 @@ struct _zend_mm_heap {
void *(*_realloc)(void*, size_t ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC);
} debug;
} custom_heap;
+ HashTable *tracked_allocs;
#endif
};
@@ -392,23 +397,17 @@ static ZEND_COLD ZEND_NORETURN void zend_mm_safe_error(zend_mm_heap *heap,
void
stderr_last_error(char *msg)
{
- LPSTR buf = NULL;
DWORD err = GetLastError();
+ char *buf = php_win32_error_to_msg(err);
- if (!FormatMessage(
- FORMAT_MESSAGE_ALLOCATE_BUFFER |
- FORMAT_MESSAGE_FROM_SYSTEM |
- FORMAT_MESSAGE_IGNORE_INSERTS,
- NULL,
- err,
- MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
- (LPSTR)&buf,
- 0, NULL)) {
+ if (!buf[0]) {
fprintf(stderr, "\n%s: [0x%08lx]\n", msg, err);
}
else {
fprintf(stderr, "\n%s: [0x%08lx] %s\n", msg, err, buf);
}
+
+ php_win32_error_msg_free(buf);
}
#endif
@@ -416,6 +415,7 @@ stderr_last_error(char *msg)
/* OS Allocation */
/*****************/
+#ifndef HAVE_MREMAP
static void *zend_mm_mmap_fixed(void *addr, size_t size)
{
#ifdef _WIN32
@@ -426,7 +426,7 @@ static void *zend_mm_mmap_fixed(void *addr, size_t size)
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, flags /*| MAP_POPULATE | MAP_HUGETLB*/, -1, 0);
+ void *ptr = mmap(addr, size, PROT_READ | PROT_WRITE, flags /*| MAP_POPULATE | MAP_HUGETLB*/, ZEND_MM_FD, 0);
if (ptr == MAP_FAILED) {
#if ZEND_MM_ERROR && !defined(MAP_EXCL)
@@ -444,6 +444,7 @@ static void *zend_mm_mmap_fixed(void *addr, size_t size)
return ptr;
#endif
}
+#endif
static void *zend_mm_mmap(size_t size)
{
@@ -469,7 +470,7 @@ static void *zend_mm_mmap(size_t size)
}
#endif
- ptr = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON, -1, 0);
+ ptr = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON, ZEND_MM_FD, 0);
if (ptr == MAP_FAILED) {
#if ZEND_MM_ERROR
@@ -541,50 +542,6 @@ static zend_always_inline int zend_mm_bitset_nts(zend_mm_bitset bitset)
#endif
}
-static zend_always_inline int zend_mm_bitset_find_zero(zend_mm_bitset *bitset, int size)
-{
- int i = 0;
-
- do {
- zend_mm_bitset tmp = bitset[i];
- if (tmp != (zend_mm_bitset)-1) {
- return i * ZEND_MM_BITSET_LEN + zend_mm_bitset_nts(tmp);
- }
- i++;
- } while (i < size);
- return -1;
-}
-
-static zend_always_inline int zend_mm_bitset_find_one(zend_mm_bitset *bitset, int size)
-{
- int i = 0;
-
- do {
- zend_mm_bitset tmp = bitset[i];
- if (tmp != 0) {
- return i * ZEND_MM_BITSET_LEN + zend_ulong_ntz(tmp);
- }
- i++;
- } while (i < size);
- return -1;
-}
-
-static zend_always_inline int zend_mm_bitset_find_zero_and_set(zend_mm_bitset *bitset, int size)
-{
- int i = 0;
-
- do {
- zend_mm_bitset tmp = bitset[i];
- if (tmp != (zend_mm_bitset)-1) {
- int n = zend_mm_bitset_nts(tmp);
- bitset[i] |= Z_UL(1) << n;
- return i * ZEND_MM_BITSET_LEN + n;
- }
- i++;
- } while (i < size);
- return -1;
-}
-
static zend_always_inline int zend_mm_bitset_is_set(zend_mm_bitset *bitset, int bit)
{
return ZEND_BIT_TEST(bitset, bit);
@@ -592,12 +549,12 @@ static zend_always_inline int zend_mm_bitset_is_set(zend_mm_bitset *bitset, int
static zend_always_inline void zend_mm_bitset_set_bit(zend_mm_bitset *bitset, int bit)
{
- bitset[bit / ZEND_MM_BITSET_LEN] |= (Z_L(1) << (bit & (ZEND_MM_BITSET_LEN-1)));
+ bitset[bit / ZEND_MM_BITSET_LEN] |= (Z_UL(1) << (bit & (ZEND_MM_BITSET_LEN-1)));
}
static zend_always_inline void zend_mm_bitset_reset_bit(zend_mm_bitset *bitset, int bit)
{
- bitset[bit / ZEND_MM_BITSET_LEN] &= ~(Z_L(1) << (bit & (ZEND_MM_BITSET_LEN-1)));
+ bitset[bit / ZEND_MM_BITSET_LEN] &= ~(Z_UL(1) << (bit & (ZEND_MM_BITSET_LEN-1)));
}
static zend_always_inline void zend_mm_bitset_set_range(zend_mm_bitset *bitset, int start, int len)
@@ -644,7 +601,7 @@ static zend_always_inline void zend_mm_bitset_reset_range(zend_mm_bitset *bitset
if (pos != end) {
/* reset bits from "bit" to ZEND_MM_BITSET_LEN-1 */
- tmp = ~((Z_L(1) << bit) - 1);
+ tmp = ~((Z_UL(1) << bit) - 1);
bitset[pos++] &= ~tmp;
while (pos != end) {
/* set all bits */
@@ -807,7 +764,16 @@ static int zend_mm_chunk_extend(zend_mm_heap *heap, void *addr, size_t old_size,
}
}
#endif
-#ifndef _WIN32
+#ifdef HAVE_MREMAP
+ /* We don't use MREMAP_MAYMOVE due to alignment requirements. */
+ void *ptr = mremap(addr, old_size, new_size, 0);
+ if (ptr == MAP_FAILED) {
+ return 0;
+ }
+ /* Sanity check: The mapping shouldn't have moved. */
+ ZEND_ASSERT(ptr == addr);
+ return 1;
+#elif !defined(_WIN32)
return (zend_mm_mmap_fixed((char*)addr + old_size, new_size - old_size) != NULL);
#else
return 0;
@@ -1273,7 +1239,7 @@ static zend_never_inline void *zend_mm_alloc_small_slow(zend_mm_heap *heap, uint
return (char*)bin;
}
-static zend_always_inline void *zend_mm_alloc_small(zend_mm_heap *heap, size_t size, int bin_num ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC)
+static zend_always_inline void *zend_mm_alloc_small(zend_mm_heap *heap, int bin_num ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC)
{
#if ZEND_MM_STAT
do {
@@ -1357,7 +1323,7 @@ static zend_always_inline void *zend_mm_alloc_heap(zend_mm_heap *heap, size_t si
}
#endif
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);
+ ptr = zend_mm_alloc_small(heap, 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);
dbg->size = real_size;
@@ -1446,14 +1412,12 @@ static zend_never_inline void *zend_mm_realloc_slow(zend_mm_heap *heap, void *pt
#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;
@@ -1585,7 +1549,7 @@ static zend_always_inline void *zend_mm_realloc_heap(zend_mm_heap *heap, void *p
/* 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);
+ ret = zend_mm_alloc_small(heap, 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);
@@ -1599,15 +1563,13 @@ static zend_always_inline void *zend_mm_realloc_heap(zend_mm_heap *heap, void *p
#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);
+ ret = zend_mm_alloc_small(heap, 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
} else {
@@ -2017,7 +1979,7 @@ ZEND_API size_t zend_mm_gc(zend_mm_heap *heap)
int pages_count = bin_pages[bin_num];
if (ZEND_MM_SRUN_FREE_COUNTER(info) == bin_elements[bin_num]) {
- /* all elemens are free */
+ /* all elements are free */
zend_mm_free_pages_ex(heap, chunk, i, pages_count, 0);
collected += pages_count;
} else {
@@ -2236,6 +2198,11 @@ static void zend_mm_check_leaks(zend_mm_heap *heap)
}
#endif
+#if ZEND_MM_CUSTOM
+static void *tracked_malloc(size_t size);
+static void tracked_free_all();
+#endif
+
void zend_mm_shutdown(zend_mm_heap *heap, int full, int silent)
{
zend_mm_chunk *p;
@@ -2243,6 +2210,19 @@ void zend_mm_shutdown(zend_mm_heap *heap, int full, int silent)
#if ZEND_MM_CUSTOM
if (heap->use_custom_heap) {
+ if (heap->custom_heap.std._malloc == tracked_malloc) {
+ if (silent) {
+ tracked_free_all();
+ }
+ zend_hash_clean(heap->tracked_allocs);
+ if (full) {
+ zend_hash_destroy(heap->tracked_allocs);
+ free(heap->tracked_allocs);
+ /* Make sure the heap free below does not use tracked_free(). */
+ heap->custom_heap.std._free = free;
+ }
+ }
+
if (full) {
if (ZEND_DEBUG && heap->use_custom_heap == ZEND_MM_CUSTOM_HEAP_DEBUG) {
heap->custom_heap.debug._free(heap ZEND_FILE_LINE_CC ZEND_FILE_LINE_EMPTY_CC);
@@ -2290,8 +2270,6 @@ void zend_mm_shutdown(zend_mm_heap *heap, int full, int silent)
/* free the first chunk */
zend_mm_chunk_free(heap, heap->main_chunk, ZEND_MM_CHUNK_SIZE);
} else {
- zend_mm_heap old_heap;
-
/* free some cached chunks to keep average count */
heap->avg_chunks_count = (heap->avg_chunks_count + (double)heap->peak_chunks_count) / 2.0;
while ((double)heap->cached_chunks_count + 0.9 > heap->avg_chunks_count &&
@@ -2311,30 +2289,32 @@ void zend_mm_shutdown(zend_mm_heap *heap, int full, int silent)
}
/* reinitialize the first chunk and heap */
- old_heap = *heap;
p = heap->main_chunk;
- memset(p, 0, ZEND_MM_FIRST_PAGE * ZEND_MM_PAGE_SIZE);
- *heap = old_heap;
- memset(heap->free_slot, 0, sizeof(heap->free_slot));
- heap->main_chunk = p;
p->heap = &p->heap_slot;
p->next = p;
p->prev = p;
p->free_pages = ZEND_MM_PAGES - ZEND_MM_FIRST_PAGE;
p->free_tail = ZEND_MM_FIRST_PAGE;
- p->free_map[0] = (1L << ZEND_MM_FIRST_PAGE) - 1;
- p->map[0] = ZEND_MM_LRUN(ZEND_MM_FIRST_PAGE);
- heap->chunks_count = 1;
- heap->peak_chunks_count = 1;
- heap->last_chunks_delete_boundary = 0;
- heap->last_chunks_delete_count = 0;
+ p->num = 0;
+
+#if ZEND_MM_STAT
+ heap->size = heap->peak = 0;
+#endif
+ memset(heap->free_slot, 0, sizeof(heap->free_slot));
#if ZEND_MM_STAT || ZEND_MM_LIMIT
heap->real_size = ZEND_MM_CHUNK_SIZE;
#endif
#if ZEND_MM_STAT
heap->real_peak = ZEND_MM_CHUNK_SIZE;
- heap->size = heap->peak = 0;
#endif
+ heap->chunks_count = 1;
+ heap->peak_chunks_count = 1;
+ heap->last_chunks_delete_boundary = 0;
+ heap->last_chunks_delete_count = 0;
+
+ memset(p->free_map, 0, sizeof(p->free_map) + sizeof(p->map));
+ p->free_map[0] = (1L << ZEND_MM_FIRST_PAGE) - 1;
+ p->map[0] = ZEND_MM_LRUN(ZEND_MM_FIRST_PAGE);
}
}
@@ -2377,7 +2357,8 @@ typedef struct _zend_alloc_globals {
#ifdef ZTS
static int alloc_globals_id;
-# define AG(v) ZEND_TSRMG(alloc_globals_id, zend_alloc_globals *, v)
+static size_t alloc_globals_offset;
+# define AG(v) ZEND_TSRMG_FAST(alloc_globals_offset, zend_alloc_globals *, v)
#else
# define AG(v) (alloc_globals.v)
static zend_alloc_globals alloc_globals;
@@ -2392,26 +2373,82 @@ ZEND_API int is_zend_mm(void)
#endif
}
+ZEND_API int is_zend_ptr(const void *ptr)
+{
+#if ZEND_MM_CUSTOM
+ if (AG(mm_heap)->use_custom_heap) {
+ return 0;
+ }
+#endif
+
+ if (AG(mm_heap)->main_chunk) {
+ zend_mm_chunk *chunk = AG(mm_heap)->main_chunk;
+
+ do {
+ if (ptr >= (void*)chunk
+ && ptr < (void*)((char*)chunk + ZEND_MM_CHUNK_SIZE)) {
+ return 1;
+ }
+ chunk = chunk->next;
+ } while (chunk != AG(mm_heap)->main_chunk);
+ }
+
+ if (AG(mm_heap)->huge_list) {
+ zend_mm_huge_list *block = AG(mm_heap)->huge_list;
+
+ do {
+ if (ptr >= (void*)block
+ && ptr < (void*)((char*)block + block->size)) {
+ return 1;
+ }
+ block = block->next;
+ } while (block != AG(mm_heap)->huge_list);
+ }
+ return 0;
+}
+
+#if ZEND_MM_CUSTOM
+
+static ZEND_COLD void* ZEND_FASTCALL _malloc_custom(size_t size ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC)
+{
+ if (ZEND_DEBUG && AG(mm_heap)->use_custom_heap == ZEND_MM_CUSTOM_HEAP_DEBUG) {
+ return AG(mm_heap)->custom_heap.debug._malloc(size ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC);
+ } else {
+ return AG(mm_heap)->custom_heap.std._malloc(size);
+ }
+}
+
+static ZEND_COLD void ZEND_FASTCALL _efree_custom(void *ptr ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC)
+{
+ if (ZEND_DEBUG && AG(mm_heap)->use_custom_heap == ZEND_MM_CUSTOM_HEAP_DEBUG) {
+ AG(mm_heap)->custom_heap.debug._free(ptr ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC);
+ } else {
+ AG(mm_heap)->custom_heap.std._free(ptr);
+ }
+}
+
+static ZEND_COLD void* ZEND_FASTCALL _realloc_custom(void *ptr, size_t size ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC)
+{
+ 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);
+ } else {
+ return AG(mm_heap)->custom_heap.std._realloc(ptr, size);
+ }
+}
+#endif
+
#if !ZEND_DEBUG && defined(HAVE_BUILTIN_CONSTANT_P)
#undef _emalloc
#if ZEND_MM_CUSTOM
# define ZEND_MM_CUSTOM_ALLOCATOR(size) do { \
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._malloc(size ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC); \
- } else { \
- return AG(mm_heap)->custom_heap.std._malloc(size); \
- } \
+ return _malloc_custom(size ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC); \
} \
} while (0)
# define ZEND_MM_CUSTOM_DEALLOCATOR(ptr) do { \
if (UNEXPECTED(AG(mm_heap)->use_custom_heap)) { \
- if (ZEND_DEBUG && AG(mm_heap)->use_custom_heap == ZEND_MM_CUSTOM_HEAP_DEBUG) { \
- AG(mm_heap)->custom_heap.debug._free(ptr ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC); \
- } else { \
- AG(mm_heap)->custom_heap.std._free(ptr); \
- } \
+ _efree_custom(ptr ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC); \
return; \
} \
} while (0)
@@ -2423,7 +2460,7 @@ ZEND_API int is_zend_mm(void)
# define _ZEND_BIN_ALLOCATOR(_num, _size, _elements, _pages, x, y) \
ZEND_API void* ZEND_FASTCALL _emalloc_ ## _size(void) { \
ZEND_MM_CUSTOM_ALLOCATOR(_size); \
- return zend_mm_alloc_small(AG(mm_heap), _size, _num ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC); \
+ return zend_mm_alloc_small(AG(mm_heap), _num ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC); \
}
ZEND_MM_BINS_INFO(_ZEND_BIN_ALLOCATOR, x, y)
@@ -2496,11 +2533,7 @@ ZEND_API void* ZEND_FASTCALL _emalloc(size_t size ZEND_FILE_LINE_DC ZEND_FILE_LI
{
#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._malloc(size ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC);
- } else {
- return AG(mm_heap)->custom_heap.std._malloc(size);
- }
+ return _malloc_custom(size ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC);
}
#endif
return zend_mm_alloc_heap(AG(mm_heap), size ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC);
@@ -2510,11 +2543,7 @@ ZEND_API void ZEND_FASTCALL _efree(void *ptr ZEND_FILE_LINE_DC ZEND_FILE_LINE_OR
{
#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) {
- AG(mm_heap)->custom_heap.debug._free(ptr ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC);
- } else {
- AG(mm_heap)->custom_heap.std._free(ptr);
- }
+ _efree_custom(ptr ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC);
return;
}
#endif
@@ -2525,11 +2554,7 @@ ZEND_API void* ZEND_FASTCALL _erealloc(void *ptr, size_t size ZEND_FILE_LINE_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);
- } else {
- return AG(mm_heap)->custom_heap.std._realloc(ptr, size);
- }
+ return _realloc_custom(ptr, 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);
@@ -2539,11 +2564,7 @@ ZEND_API void* ZEND_FASTCALL _erealloc2(void *ptr, size_t size, size_t copy_size
{
#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);
- } else {
- return AG(mm_heap)->custom_heap.std._realloc(ptr, size);
- }
+ return _realloc_custom(ptr, 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);
@@ -2561,7 +2582,7 @@ ZEND_API size_t ZEND_FASTCALL _zend_mem_block_size(void *ptr ZEND_FILE_LINE_DC Z
ZEND_API void* ZEND_FASTCALL _safe_emalloc(size_t nmemb, size_t size, size_t offset ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC)
{
- return emalloc_rel(zend_safe_address_guarded(nmemb, size, offset));
+ return _emalloc(zend_safe_address_guarded(nmemb, size, offset) ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC);
}
ZEND_API void* ZEND_FASTCALL _safe_malloc(size_t nmemb, size_t size, size_t offset)
@@ -2571,7 +2592,7 @@ ZEND_API void* ZEND_FASTCALL _safe_malloc(size_t nmemb, size_t size, size_t offs
ZEND_API void* ZEND_FASTCALL _safe_erealloc(void *ptr, size_t nmemb, size_t size, size_t offset ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC)
{
- return erealloc_rel(ptr, zend_safe_address_guarded(nmemb, size, offset));
+ return _erealloc(ptr, zend_safe_address_guarded(nmemb, size, offset) ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC);
}
ZEND_API void* ZEND_FASTCALL _safe_realloc(void *ptr, size_t nmemb, size_t size, size_t offset)
@@ -2584,7 +2605,7 @@ ZEND_API void* ZEND_FASTCALL _ecalloc(size_t nmemb, size_t size ZEND_FILE_LINE_D
void *p;
size = zend_safe_address_guarded(nmemb, size, 0);
- p = emalloc_rel(size);
+ p = _emalloc(size ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC);
memset(p, 0, size);
return p;
}
@@ -2674,6 +2695,42 @@ ZEND_API void shutdown_memory_manager(int silent, int full_shutdown)
zend_mm_shutdown(AG(mm_heap), full_shutdown, silent);
}
+#if ZEND_MM_CUSTOM
+static void *tracked_malloc(size_t size)
+{
+ void *ptr = __zend_malloc(size);
+ zend_ulong h = ((uintptr_t) ptr) >> ZEND_MM_ALIGNMENT_LOG2;
+ ZEND_ASSERT((void *) (uintptr_t) (h << ZEND_MM_ALIGNMENT_LOG2) == ptr);
+ zend_hash_index_add_empty_element(AG(mm_heap)->tracked_allocs, h);
+ return ptr;
+}
+
+static void tracked_free(void *ptr) {
+ zend_ulong h = ((uintptr_t) ptr) >> ZEND_MM_ALIGNMENT_LOG2;
+ zend_hash_index_del(AG(mm_heap)->tracked_allocs, h);
+ free(ptr);
+}
+
+static void *tracked_realloc(void *ptr, size_t new_size) {
+ zend_ulong h = ((uintptr_t) ptr) >> ZEND_MM_ALIGNMENT_LOG2;
+ zend_hash_index_del(AG(mm_heap)->tracked_allocs, h);
+ ptr = __zend_realloc(ptr, new_size);
+ h = ((uintptr_t) ptr) >> ZEND_MM_ALIGNMENT_LOG2;
+ ZEND_ASSERT((void *) (uintptr_t) (h << ZEND_MM_ALIGNMENT_LOG2) == ptr);
+ zend_hash_index_add_empty_element(AG(mm_heap)->tracked_allocs, h);
+ return ptr;
+}
+
+static void tracked_free_all() {
+ HashTable *tracked_allocs = AG(mm_heap)->tracked_allocs;
+ zend_ulong h;
+ ZEND_HASH_FOREACH_NUM_KEY(tracked_allocs, h) {
+ void *ptr = (void *) (uintptr_t) (h << ZEND_MM_ALIGNMENT_LOG2);
+ free(ptr);
+ } ZEND_HASH_FOREACH_END();
+}
+#endif
+
static void alloc_globals_ctor(zend_alloc_globals *alloc_globals)
{
char *tmp;
@@ -2681,12 +2738,23 @@ static void alloc_globals_ctor(zend_alloc_globals *alloc_globals)
#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));
- alloc_globals->mm_heap->use_custom_heap = ZEND_MM_CUSTOM_HEAP_STD;
- alloc_globals->mm_heap->custom_heap.std._malloc = __zend_malloc;
- alloc_globals->mm_heap->custom_heap.std._free = free;
- alloc_globals->mm_heap->custom_heap.std._realloc = __zend_realloc;
+ zend_bool tracked = (tmp = getenv("USE_TRACKED_ALLOC")) && zend_atoi(tmp, 0);
+ zend_mm_heap *mm_heap = alloc_globals->mm_heap = malloc(sizeof(zend_mm_heap));
+ memset(mm_heap, 0, sizeof(zend_mm_heap));
+ mm_heap->use_custom_heap = ZEND_MM_CUSTOM_HEAP_STD;
+ if (!tracked) {
+ /* Use system allocator. */
+ mm_heap->custom_heap.std._malloc = __zend_malloc;
+ mm_heap->custom_heap.std._free = free;
+ mm_heap->custom_heap.std._realloc = __zend_realloc;
+ } else {
+ /* Use system allocator and track allocations for auto-free. */
+ mm_heap->custom_heap.std._malloc = tracked_malloc;
+ mm_heap->custom_heap.std._free = tracked_free;
+ mm_heap->custom_heap.std._realloc = tracked_realloc;
+ mm_heap->tracked_allocs = malloc(sizeof(HashTable));
+ zend_hash_init(mm_heap->tracked_allocs, 1024, NULL, NULL, 1);
+ }
return;
}
#endif
@@ -2695,7 +2763,6 @@ static void alloc_globals_ctor(zend_alloc_globals *alloc_globals)
if (tmp && zend_atoi(tmp, 0)) {
zend_mm_use_huge_pages = 1;
}
- ZEND_TSRMLS_CACHE_UPDATE();
alloc_globals->mm_heap = zend_mm_init();
}
@@ -2709,7 +2776,7 @@ static void alloc_globals_dtor(zend_alloc_globals *alloc_globals)
ZEND_API void start_memory_manager(void)
{
#ifdef ZTS
- ts_allocate_id(&alloc_globals_id, sizeof(zend_alloc_globals), (ts_allocate_ctor) alloc_globals_ctor, (ts_allocate_dtor) alloc_globals_dtor);
+ ts_allocate_fast_id(&alloc_globals_id, &alloc_globals_offset, sizeof(zend_alloc_globals), (ts_allocate_ctor) alloc_globals_ctor, (ts_allocate_dtor) alloc_globals_dtor);
#else
alloc_globals_ctor(&alloc_globals);
#endif
@@ -2932,12 +2999,9 @@ ZEND_API void * __zend_realloc(void *p, size_t len)
zend_out_of_memory();
}
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * indent-tabs-mode: t
- * End:
- * vim600: sw=4 ts=4 fdm=marker
- * vim<600: sw=4 ts=4
- */
+#ifdef ZTS
+size_t zend_mm_globals_size(void)
+{
+ return sizeof(zend_alloc_globals);
+}
+#endif
diff --git a/Zend/zend_alloc.h b/Zend/zend_alloc.h
index b3986ab961..8bb854328d 100644
--- a/Zend/zend_alloc.h
+++ b/Zend/zend_alloc.h
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| Zend Engine |
+----------------------------------------------------------------------+
- | Copyright (c) 1998-2018 Zend Technologies Ltd. (http://www.zend.com) |
+ | Copyright (c) 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 |
@@ -27,21 +27,21 @@
#include "zend.h"
#ifndef ZEND_MM_ALIGNMENT
-# define ZEND_MM_ALIGNMENT Z_L(8)
+# define ZEND_MM_ALIGNMENT Z_UL(8)
# define ZEND_MM_ALIGNMENT_LOG2 Z_L(3)
#elif ZEND_MM_ALIGNMENT < 4
# undef ZEND_MM_ALIGNMENT
# undef ZEND_MM_ALIGNMENT_LOG2
-# define ZEND_MM_ALIGNMENT Z_L(4)
+# define ZEND_MM_ALIGNMENT Z_UL(4)
# define ZEND_MM_ALIGNMENT_LOG2 Z_L(2)
#endif
-#define ZEND_MM_ALIGNMENT_MASK ~(ZEND_MM_ALIGNMENT - Z_L(1))
+#define ZEND_MM_ALIGNMENT_MASK ~(ZEND_MM_ALIGNMENT - 1)
-#define ZEND_MM_ALIGNED_SIZE(size) (((size) + ZEND_MM_ALIGNMENT - Z_L(1)) & ZEND_MM_ALIGNMENT_MASK)
+#define ZEND_MM_ALIGNED_SIZE(size) (((size) + ZEND_MM_ALIGNMENT - 1) & ZEND_MM_ALIGNMENT_MASK)
#define ZEND_MM_ALIGNED_SIZE_EX(size, alignment) \
- (((size) + ((alignment) - Z_L(1))) & ~((alignment) - Z_L(1)))
+ (((size) + ((alignment) - 1)) & ~((alignment) - 1))
typedef struct _zend_leak_info {
void *addr;
@@ -224,6 +224,7 @@ ZEND_API int zend_set_memory_limit(size_t memory_limit);
ZEND_API void start_memory_manager(void);
ZEND_API void shutdown_memory_manager(int silent, int full_shutdown);
ZEND_API int is_zend_mm(void);
+ZEND_API int is_zend_ptr(const void *ptr);
ZEND_API size_t zend_memory_usage(int real_usage);
ZEND_API size_t zend_memory_peak_usage(int real_usage);
@@ -397,16 +398,10 @@ static void apc_init_heap(void)
*/
+#ifdef ZTS
+size_t zend_mm_globals_size(void);
+#endif
+
END_EXTERN_C()
#endif
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * indent-tabs-mode: t
- * End:
- * vim600: sw=4 ts=4 fdm=marker
- * vim<600: sw=4 ts=4
- */
diff --git a/Zend/zend_alloc_sizes.h b/Zend/zend_alloc_sizes.h
index 09e89ed907..9f1c00eaad 100644
--- a/Zend/zend_alloc_sizes.h
+++ b/Zend/zend_alloc_sizes.h
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| Zend Engine |
+----------------------------------------------------------------------+
- | Copyright (c) 1998-2018 Zend Technologies Ltd. (http://www.zend.com) |
+ | Copyright (c) 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 |
@@ -62,13 +62,3 @@
_(29, 3072, 4, 3, x, y)
#endif /* ZEND_ALLOC_SIZES_H */
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * indent-tabs-mode: t
- * End:
- * vim600: sw=4 ts=4 fdm=marker
- * vim<600: sw=4 ts=4
- */
diff --git a/Zend/zend_arena.h b/Zend/zend_arena.h
index 604285fc97..6ecc1fc85f 100644
--- a/Zend/zend_arena.h
+++ b/Zend/zend_arena.h
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| Zend Engine |
+----------------------------------------------------------------------+
- | Copyright (c) 1998-2018 Zend Technologies Ltd. (http://www.zend.com) |
+ | Copyright (c) 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 |
@@ -21,6 +21,8 @@
#include "zend.h"
+#ifndef ZEND_TRACK_ARENA_ALLOC
+
typedef struct _zend_arena zend_arena;
struct _zend_arena {
@@ -48,8 +50,6 @@ static zend_always_inline void zend_arena_destroy(zend_arena *arena)
} while (arena);
}
-#define ZEND_ARENA_ALIGNMENT 8U
-
static zend_always_inline void* zend_arena_alloc(zend_arena **arena_ptr, size_t size)
{
zend_arena *arena = *arena_ptr;
@@ -121,14 +121,104 @@ static zend_always_inline zend_bool zend_arena_contains(zend_arena *arena, void
return 0;
}
-#endif /* _ZEND_ARENA_H_ */
+#else
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * indent-tabs-mode: t
- * End:
- * vim600: sw=4 ts=4 fdm=marker
- * vim<600: sw=4 ts=4
- */
+/* Use normal allocations and keep track of them for mass-freeing.
+ * This is intended for use with asan/valgrind. */
+
+typedef struct _zend_arena zend_arena;
+
+struct _zend_arena {
+ void **ptr;
+ void **end;
+ struct _zend_arena *prev;
+ void *ptrs[0];
+};
+
+#define ZEND_TRACKED_ARENA_SIZE 1000
+
+static zend_always_inline zend_arena *zend_arena_create(size_t _size)
+{
+ zend_arena *arena = (zend_arena*) emalloc(
+ sizeof(zend_arena) + sizeof(void *) * ZEND_TRACKED_ARENA_SIZE);
+ arena->ptr = &arena->ptrs[0];
+ arena->end = &arena->ptrs[ZEND_TRACKED_ARENA_SIZE];
+ arena->prev = NULL;
+ return arena;
+}
+
+static zend_always_inline void zend_arena_destroy(zend_arena *arena)
+{
+ do {
+ zend_arena *prev = arena->prev;
+ void **ptr;
+ for (ptr = arena->ptrs; ptr < arena->ptr; ptr++) {
+ efree(*ptr);
+ }
+ efree(arena);
+ arena = prev;
+ } while (arena);
+}
+
+static zend_always_inline void *zend_arena_alloc(zend_arena **arena_ptr, size_t size)
+{
+ zend_arena *arena = *arena_ptr;
+ if (arena->ptr == arena->end) {
+ *arena_ptr = zend_arena_create(0);
+ (*arena_ptr)->prev = arena;
+ arena = *arena_ptr;
+ }
+
+ return *arena->ptr++ = emalloc(size);
+}
+
+static zend_always_inline void* zend_arena_calloc(zend_arena **arena_ptr, size_t count, size_t unit_size)
+{
+ int overflow;
+ size_t size;
+ void *ret;
+
+ size = zend_safe_address(unit_size, count, 0, &overflow);
+ if (UNEXPECTED(overflow)) {
+ zend_error(E_ERROR, "Possible integer overflow in zend_arena_calloc() (%zu * %zu)", unit_size, count);
+ }
+ ret = zend_arena_alloc(arena_ptr, size);
+ memset(ret, 0, size);
+ return ret;
+}
+
+static zend_always_inline void* zend_arena_checkpoint(zend_arena *arena)
+{
+ return arena->ptr;
+}
+
+static zend_always_inline void zend_arena_release(zend_arena **arena_ptr, void *checkpoint)
+{
+ while (1) {
+ zend_arena *arena = *arena_ptr;
+ zend_arena *prev = arena->prev;
+ while (1) {
+ if (arena->ptr == (void **) checkpoint) {
+ return;
+ }
+ if (arena->ptr == arena->ptrs) {
+ break;
+ }
+ arena->ptr--;
+ efree(*arena->ptr);
+ }
+ efree(arena);
+ *arena_ptr = prev;
+ ZEND_ASSERT(*arena_ptr);
+ }
+}
+
+static zend_always_inline zend_bool zend_arena_contains(zend_arena *arena, void *ptr)
+{
+ /* TODO: Dummy */
+ return 1;
+}
+
+#endif
+
+#endif /* _ZEND_ARENA_H_ */
diff --git a/Zend/zend_ast.c b/Zend/zend_ast.c
index d007e01480..338ff09f76 100644
--- a/Zend/zend_ast.c
+++ b/Zend/zend_ast.c
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| Zend Engine |
+----------------------------------------------------------------------+
- | Copyright (c) 1998-2018 Zend Technologies Ltd. (http://www.zend.com) |
+ | Copyright (c) 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 |
@@ -102,6 +102,16 @@ ZEND_API zend_ast * ZEND_FASTCALL zend_ast_create_constant(zend_string *name, ze
return (zend_ast *) ast;
}
+ZEND_API zend_ast * ZEND_FASTCALL zend_ast_create_class_const_or_name(zend_ast *class_name, zend_ast *name) {
+ zend_string *name_str = zend_ast_get_str(name);
+ if (zend_string_equals_literal_ci(name_str, "class")) {
+ zend_string_release(name_str);
+ return zend_ast_create(ZEND_AST_CLASS_NAME, class_name);
+ } else {
+ return zend_ast_create(ZEND_AST_CLASS_CONST, class_name, name);
+ }
+}
+
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
@@ -436,6 +446,32 @@ static int zend_ast_add_array_element(zval *result, zval *offset, zval *expr)
return SUCCESS;
}
+static int zend_ast_add_unpacked_element(zval *result, zval *expr) {
+ if (EXPECTED(Z_TYPE_P(expr) == IS_ARRAY)) {
+ HashTable *ht = Z_ARRVAL_P(expr);
+ zval *val;
+ zend_string *key;
+
+ ZEND_HASH_FOREACH_STR_KEY_VAL(ht, key, val) {
+ if (key) {
+ zend_throw_error(NULL, "Cannot unpack array with string keys");
+ return FAILURE;
+ } else {
+ if (!zend_hash_next_index_insert(Z_ARRVAL_P(result), val)) {
+ zend_error(E_WARNING, "Cannot add element to the array as the next element is already occupied");
+ break;
+ }
+ Z_TRY_ADDREF_P(val);
+ }
+ } ZEND_HASH_FOREACH_END();
+ return SUCCESS;
+ }
+
+ /* Objects or references cannot occur in a constant expression. */
+ zend_throw_error(NULL, "Only arrays and Traversables can be unpacked");
+ return FAILURE;
+}
+
ZEND_API int ZEND_FASTCALL zend_ast_evaluate(zval *result, zend_ast *ast, zend_class_entry *scope)
{
zval op1, op2;
@@ -501,13 +537,30 @@ ZEND_API int ZEND_FASTCALL zend_ast_evaluate(zval *result, zend_ast *ast, zend_c
break;
}
case ZEND_AST_CONSTANT_CLASS:
- ZEND_ASSERT(EG(current_execute_data));
- if (scope && scope->name) {
+ if (scope) {
ZVAL_STR_COPY(result, scope->name);
} else {
ZVAL_EMPTY_STRING(result);
}
break;
+ case ZEND_AST_CLASS_NAME:
+ if (!scope) {
+ zend_throw_error(NULL, "Cannot use \"self\" when no class scope is active");
+ return FAILURE;
+ }
+ if (ast->attr == ZEND_FETCH_CLASS_SELF) {
+ ZVAL_STR_COPY(result, scope->name);
+ } else if (ast->attr == ZEND_FETCH_CLASS_PARENT) {
+ if (!scope->parent) {
+ zend_throw_error(NULL,
+ "Cannot use \"parent\" when current class scope has no parent");
+ return FAILURE;
+ }
+ ZVAL_STR_COPY(result, scope->parent->name);
+ } else {
+ ZEND_ASSERT(0 && "Should have errored during compilation");
+ }
+ break;
case ZEND_AST_AND:
if (UNEXPECTED(zend_ast_evaluate(&op1, ast->child[0], scope) != SUCCESS)) {
ret = FAILURE;
@@ -615,6 +668,19 @@ ZEND_API int ZEND_FASTCALL zend_ast_evaluate(zval *result, zend_ast *ast, zend_c
array_init(result);
for (i = 0; i < list->children; i++) {
zend_ast *elem = list->child[i];
+ if (elem->kind == ZEND_AST_UNPACK) {
+ if (UNEXPECTED(zend_ast_evaluate(&op1, elem->child[0], scope) != SUCCESS)) {
+ zval_ptr_dtor_nogc(result);
+ return FAILURE;
+ }
+ if (UNEXPECTED(zend_ast_add_unpacked_element(result, &op1) != SUCCESS)) {
+ zval_ptr_dtor_nogc(&op1);
+ zval_ptr_dtor_nogc(result);
+ return FAILURE;
+ }
+ zval_ptr_dtor_nogc(&op1);
+ continue;
+ }
if (elem->child[1]) {
if (UNEXPECTED(zend_ast_evaluate(&op1, elem->child[1], scope) != SUCCESS)) {
zval_ptr_dtor_nogc(result);
@@ -648,7 +714,7 @@ ZEND_API int ZEND_FASTCALL zend_ast_evaluate(zval *result, zend_ast *ast, zend_c
zval_ptr_dtor_nogc(&op1);
ret = FAILURE;
} else {
- zend_fetch_dimension_const(result, &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);
zval_ptr_dtor_nogc(&op1);
zval_ptr_dtor_nogc(&op2);
@@ -821,7 +887,7 @@ ZEND_API void zend_ast_apply(zend_ast *ast, zend_ast_apply_func fn) {
}
/*
- * Operator Precendence
+ * Operator Precedence
* ====================
* priority associativity operators
* ----------------------------------
@@ -1084,7 +1150,7 @@ static ZEND_COLD void zend_ast_export_var_list(smart_str *str, zend_ast_list *li
if (i != 0) {
smart_str_appends(str, ", ");
}
- if (list->child[i]->attr) {
+ if (list->child[i]->attr & ZEND_BIND_REF) {
smart_str_appendc(str, '&');
}
smart_str_appendc(str, '$');
@@ -1319,6 +1385,7 @@ tail_call:
/* declaration nodes */
case ZEND_AST_FUNC_DECL:
case ZEND_AST_CLOSURE:
+ case ZEND_AST_ARROW_FUNC:
case ZEND_AST_METHOD:
decl = (zend_ast_decl *) ast;
if (decl->flags & ZEND_ACC_PUBLIC) {
@@ -1337,11 +1404,15 @@ tail_call:
if (decl->flags & ZEND_ACC_FINAL) {
smart_str_appends(str, "final ");
}
- smart_str_appends(str, "function ");
+ if (decl->kind == ZEND_AST_ARROW_FUNC) {
+ smart_str_appends(str, "fn");
+ } else {
+ smart_str_appends(str, "function ");
+ }
if (decl->flags & ZEND_ACC_RETURN_REFERENCE) {
smart_str_appendc(str, '&');
}
- if (ast->kind != ZEND_AST_CLOSURE) {
+ if (ast->kind != ZEND_AST_CLOSURE && ast->kind != ZEND_AST_ARROW_FUNC) {
smart_str_appendl(str, ZSTR_VAL(decl->name), ZSTR_LEN(decl->name));
}
smart_str_appendc(str, '(');
@@ -1356,6 +1427,13 @@ tail_call:
zend_ast_export_ns_name(str, decl->child[3], 0, indent);
}
if (decl->child[2]) {
+ if (decl->kind == ZEND_AST_ARROW_FUNC) {
+ ZEND_ASSERT(decl->child[2]->kind == ZEND_AST_RETURN);
+ smart_str_appends(str, " => ");
+ zend_ast_export_ex(str, decl->child[2]->child[0], 0, indent);
+ break;
+ }
+
smart_str_appends(str, " {\n");
zend_ast_export_stmt(str, decl->child[2], indent + 1);
zend_ast_export_indent(str, indent);
@@ -1420,7 +1498,10 @@ simple_list:
zend_ast_export_var_list(str, (zend_ast_list*)ast, indent);
smart_str_appendc(str, ')');
break;
- case ZEND_AST_PROP_DECL:
+ case ZEND_AST_PROP_GROUP: {
+ zend_ast *type_ast = ast->child[0];
+ zend_ast *prop_ast = ast->child[1];
+
if (ast->attr & ZEND_ACC_PUBLIC) {
smart_str_appends(str, "public ");
} else if (ast->attr & ZEND_ACC_PROTECTED) {
@@ -1431,7 +1512,20 @@ simple_list:
if (ast->attr & ZEND_ACC_STATIC) {
smart_str_appends(str, "static ");
}
+
+ if (type_ast) {
+ if (type_ast->attr & ZEND_TYPE_NULLABLE) {
+ smart_str_appendc(str, '?');
+ }
+ zend_ast_export_ns_name(
+ str, type_ast, 0, indent);
+ smart_str_appendc(str, ' ');
+ }
+
+ ast = prop_ast;
goto simple_list;
+ }
+
case ZEND_AST_CONST_DECL:
case ZEND_AST_CLASS_CONST_DECL:
smart_str_appends(str, "const ");
@@ -1611,25 +1705,30 @@ simple_list:
smart_str_appends(str, "::");
zend_ast_export_name(str, ast->child[1], 0, indent);
break;
+ case ZEND_AST_CLASS_NAME:
+ zend_ast_export_ns_name(str, ast->child[0], 0, indent);
+ smart_str_appends(str, "::class");
+ break;
case ZEND_AST_ASSIGN: BINARY_OP(" = ", 90, 91, 90);
case ZEND_AST_ASSIGN_REF: BINARY_OP(" =& ", 90, 91, 90);
case ZEND_AST_ASSIGN_OP:
switch (ast->attr) {
- case ZEND_ASSIGN_ADD: BINARY_OP(" += ", 90, 91, 90);
- case ZEND_ASSIGN_SUB: BINARY_OP(" -= ", 90, 91, 90);
- case ZEND_ASSIGN_MUL: BINARY_OP(" *= ", 90, 91, 90);
- case ZEND_ASSIGN_DIV: BINARY_OP(" /= ", 90, 91, 90);
- case ZEND_ASSIGN_MOD: BINARY_OP(" %= ", 90, 91, 90);
- case ZEND_ASSIGN_SL: BINARY_OP(" <<= ", 90, 91, 90);
- case ZEND_ASSIGN_SR: BINARY_OP(" >>= ", 90, 91, 90);
- case ZEND_ASSIGN_CONCAT: BINARY_OP(" .= ", 90, 91, 90);
- case ZEND_ASSIGN_BW_OR: BINARY_OP(" |= ", 90, 91, 90);
- case ZEND_ASSIGN_BW_AND: BINARY_OP(" &= ", 90, 91, 90);
- case ZEND_ASSIGN_BW_XOR: BINARY_OP(" ^= ", 90, 91, 90);
- case ZEND_ASSIGN_POW: BINARY_OP(" **= ", 90, 91, 90);
+ case ZEND_ADD: BINARY_OP(" += ", 90, 91, 90);
+ case ZEND_SUB: BINARY_OP(" -= ", 90, 91, 90);
+ case ZEND_MUL: BINARY_OP(" *= ", 90, 91, 90);
+ case ZEND_DIV: BINARY_OP(" /= ", 90, 91, 90);
+ case ZEND_MOD: BINARY_OP(" %= ", 90, 91, 90);
+ case ZEND_SL: BINARY_OP(" <<= ", 90, 91, 90);
+ case ZEND_SR: BINARY_OP(" >>= ", 90, 91, 90);
+ case ZEND_CONCAT: BINARY_OP(" .= ", 90, 91, 90);
+ case ZEND_BW_OR: BINARY_OP(" |= ", 90, 91, 90);
+ case ZEND_BW_AND: BINARY_OP(" &= ", 90, 91, 90);
+ case ZEND_BW_XOR: BINARY_OP(" ^= ", 90, 91, 90);
+ case ZEND_POW: BINARY_OP(" **= ", 90, 91, 90);
EMPTY_SWITCH_DEFAULT_CASE();
}
break;
+ case ZEND_AST_ASSIGN_COALESCE: BINARY_OP(" \?\?= ", 90, 91, 90);
case ZEND_AST_BINARY_OP:
switch (ast->attr) {
case ZEND_ADD: BINARY_OP(" + ", 200, 200, 201);
@@ -1639,6 +1738,7 @@ simple_list:
case ZEND_MOD: BINARY_OP(" % ", 210, 210, 211);
case ZEND_SL: BINARY_OP(" << ", 190, 190, 191);
case ZEND_SR: BINARY_OP(" >> ", 190, 190, 191);
+ case ZEND_PARENTHESIZED_CONCAT: /* fallthrough */
case ZEND_CONCAT: BINARY_OP(" . ", 200, 200, 201);
case ZEND_BW_OR: BINARY_OP(" | ", 140, 140, 141);
case ZEND_BW_AND: BINARY_OP(" & ", 160, 160, 161);
@@ -2003,13 +2103,3 @@ ZEND_API ZEND_COLD zend_string *zend_ast_export(const char *prefix, zend_ast *as
smart_str_0(&str);
return str.s;
}
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * indent-tabs-mode: t
- * End:
- * vim600: sw=4 ts=4 fdm=marker
- * vim<600: sw=4 ts=4
- */
diff --git a/Zend/zend_ast.h b/Zend/zend_ast.h
index db1f51b378..fd6dd1677a 100644
--- a/Zend/zend_ast.h
+++ b/Zend/zend_ast.h
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| Zend Engine |
+----------------------------------------------------------------------+
- | Copyright (c) 1998-2018 Zend Technologies Ltd. (http://www.zend.com) |
+ | Copyright (c) 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 |
@@ -42,6 +42,7 @@ enum _zend_ast_kind {
ZEND_AST_CLOSURE,
ZEND_AST_METHOD,
ZEND_AST_CLASS,
+ ZEND_AST_ARROW_FUNC,
/* list nodes */
ZEND_AST_ARG_LIST = 1 << ZEND_AST_IS_LIST_SHIFT,
@@ -87,6 +88,7 @@ enum _zend_ast_kind {
ZEND_AST_POST_INC,
ZEND_AST_POST_DEC,
ZEND_AST_YIELD_FROM,
+ ZEND_AST_CLASS_NAME,
ZEND_AST_GLOBAL,
ZEND_AST_UNSET,
@@ -119,6 +121,7 @@ enum _zend_ast_kind {
ZEND_AST_INSTANCEOF,
ZEND_AST_YIELD,
ZEND_AST_COALESCE,
+ ZEND_AST_ASSIGN_COALESCE,
ZEND_AST_STATIC,
ZEND_AST_WHILE,
@@ -134,6 +137,7 @@ enum _zend_ast_kind {
ZEND_AST_USE_ELEM,
ZEND_AST_TRAIT_ALIAS,
ZEND_AST_GROUP_USE,
+ ZEND_AST_PROP_GROUP,
/* 3 child nodes */
ZEND_AST_METHOD_CALL = 3 << ZEND_AST_NUM_CHILDREN_SHIFT,
@@ -200,6 +204,7 @@ 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);
+ZEND_API zend_ast * ZEND_FASTCALL zend_ast_create_class_const_or_name(zend_ast *class_name, zend_ast *name);
#if ZEND_AST_SPEC
# define ZEND_AST_SPEC_CALL(name, ...) \
@@ -277,6 +282,10 @@ 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);
+static zend_always_inline zend_bool zend_ast_is_special(zend_ast *ast) {
+ return (ast->kind >> ZEND_AST_SPECIAL_SHIFT) & 1;
+}
+
static zend_always_inline zend_bool zend_ast_is_list(zend_ast *ast) {
return (ast->kind >> ZEND_AST_IS_LIST_SHIFT) & 1;
}
@@ -331,13 +340,3 @@ static zend_always_inline zend_ast *zend_ast_list_rtrim(zend_ast *ast) {
return ast;
}
#endif
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * indent-tabs-mode: t
- * End:
- * vim600: sw=4 ts=4 fdm=marker
- * vim<600: sw=4 ts=4
- */
diff --git a/Zend/zend_bitset.h b/Zend/zend_bitset.h
index 263cf222a5..2a227e4822 100644
--- a/Zend/zend_bitset.h
+++ b/Zend/zend_bitset.h
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| Zend OPcache JIT |
+----------------------------------------------------------------------+
- | Copyright (c) 1998-2018 The PHP Group |
+ | Copyright (c) The PHP Group |
+----------------------------------------------------------------------+
| This source file is subject to version 3.01 of the PHP license, |
| that is bundled with this package in the file LICENSE, and is |
@@ -252,13 +252,3 @@ static inline int zend_bitset_pop_first(zend_bitset set, uint32_t len) {
}
#endif /* _ZEND_BITSET_H_ */
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * indent-tabs-mode: t
- * End:
- * vim600: sw=4 ts=4 fdm=marker
- * vim<600: sw=4 ts=4
- */
diff --git a/Zend/zend_build.h b/Zend/zend_build.h
index 20f5ea861b..c604fb311a 100644
--- a/Zend/zend_build.h
+++ b/Zend/zend_build.h
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| Zend Engine |
+----------------------------------------------------------------------+
- | Copyright (c) 1998-2018 Zend Technologies Ltd. (http://www.zend.com) |
+ | Copyright (c) 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 |
@@ -44,13 +44,3 @@
#define ZEND_BUILD_EXTRA
#endif
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * indent-tabs-mode: t
- * End:
- * vim600: sw=4 ts=4 fdm=marker
- * vim<600: sw=4 ts=4
- */
diff --git a/Zend/zend_builtin_functions.c b/Zend/zend_builtin_functions.c
index 468a7c3446..33dfea0ea7 100644
--- a/Zend/zend_builtin_functions.c
+++ b/Zend/zend_builtin_functions.c
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| Zend Engine |
+----------------------------------------------------------------------+
- | Copyright (c) 1998-2018 Zend Technologies Ltd. (http://www.zend.com) |
+ | Copyright (c) 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 |
@@ -56,6 +56,7 @@ static ZEND_FUNCTION(is_subclass_of);
static ZEND_FUNCTION(is_a);
static ZEND_FUNCTION(get_class_vars);
static ZEND_FUNCTION(get_object_vars);
+static ZEND_FUNCTION(get_mangled_object_vars);
static ZEND_FUNCTION(get_class_methods);
static ZEND_FUNCTION(trigger_error);
static ZEND_FUNCTION(set_error_handler);
@@ -145,6 +146,10 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_get_object_vars, 0, 0, 1)
ZEND_ARG_INFO(0, obj)
ZEND_END_ARG_INFO()
+ZEND_BEGIN_ARG_INFO_EX(arginfo_get_mangled_object_vars, 0, 0, 1)
+ ZEND_ARG_INFO(0, obj)
+ZEND_END_ARG_INFO()
+
ZEND_BEGIN_ARG_INFO_EX(arginfo_get_class_methods, 0, 0, 1)
ZEND_ARG_INFO(0, class)
ZEND_END_ARG_INFO()
@@ -264,6 +269,7 @@ static const zend_function_entry builtin_functions[] = { /* {{{ */
ZEND_FE(is_a, arginfo_is_subclass_of)
ZEND_FE(get_class_vars, arginfo_get_class_vars)
ZEND_FE(get_object_vars, arginfo_get_object_vars)
+ ZEND_FE(get_mangled_object_vars, arginfo_get_mangled_object_vars)
ZEND_FE(get_class_methods, arginfo_get_class_methods)
ZEND_FE(trigger_error, arginfo_trigger_error)
ZEND_FALIAS(user_error, trigger_error, arginfo_trigger_error)
@@ -311,7 +317,7 @@ ZEND_MINIT_FUNCTION(core) { /* {{{ */
/* }}} */
zend_module_entry zend_builtin_module = { /* {{{ */
- STANDARD_MODULE_HEADER,
+ STANDARD_MODULE_HEADER,
"Core",
builtin_functions,
ZEND_MINIT(core),
@@ -540,10 +546,11 @@ ZEND_FUNCTION(func_get_args)
if (Z_OPT_REFCOUNTED_P(q)) {
Z_ADDREF_P(q);
}
+ ZEND_HASH_FILL_SET(q);
} else {
- q = &EG(uninitialized_zval);
+ ZEND_HASH_FILL_SET_NULL();
}
- ZEND_HASH_FILL_ADD(q);
+ ZEND_HASH_FILL_NEXT();
p++;
i++;
}
@@ -556,17 +563,18 @@ ZEND_FUNCTION(func_get_args)
if (Z_OPT_REFCOUNTED_P(q)) {
Z_ADDREF_P(q);
}
+ ZEND_HASH_FILL_SET(q);
} else {
- q = &EG(uninitialized_zval);
+ ZEND_HASH_FILL_SET_NULL();
}
- ZEND_HASH_FILL_ADD(q);
+ ZEND_HASH_FILL_NEXT();
p++;
i++;
}
} ZEND_HASH_FILL_END();
Z_ARRVAL_P(return_value)->nNumOfElements = arg_count;
} else {
- ZVAL_EMPTY_ARRAY(return_value);
+ RETURN_EMPTY_ARRAY();
}
}
/* }}} */
@@ -734,7 +742,12 @@ ZEND_FUNCTION(error_reporting)
old_error_reporting = EG(error_reporting);
if (ZEND_NUM_ARGS() != 0) {
- zend_string *new_val = zval_get_string(err);
+ zend_string *new_val = zval_try_get_string(err);
+
+ if (UNEXPECTED(!new_val)) {
+ return;
+ }
+
do {
zend_ini_entry *p = EG(error_reporting_ini_entry);
@@ -1008,7 +1021,7 @@ ZEND_FUNCTION(get_parent_class)
if (Z_TYPE_P(arg) == IS_OBJECT) {
ce = Z_OBJ_P(arg)->ce;
} else if (Z_TYPE_P(arg) == IS_STRING) {
- ce = zend_lookup_class(Z_STR_P(arg));
+ ce = zend_lookup_class(Z_STR_P(arg));
}
if (ce && ce->parent) {
@@ -1055,7 +1068,7 @@ static void is_a_impl(INTERNAL_FUNCTION_PARAMETERS, zend_bool only_subclass) /*
if (!only_subclass && EXPECTED(zend_string_equals(instance_ce->name, class_name))) {
retval = 1;
} else {
- ce = zend_lookup_class_ex(class_name, NULL, 0);
+ ce = zend_lookup_class_ex(class_name, NULL, ZEND_FETCH_CLASS_NO_AUTOLOAD);
if (!ce) {
retval = 0;
} else {
@@ -1095,12 +1108,9 @@ static void add_class_vars(zend_class_entry *scope, zend_class_entry *ce, int st
zend_string *key;
ZEND_HASH_FOREACH_STR_KEY_PTR(&ce->properties_info, key, prop_info) {
- if (((prop_info->flags & ZEND_ACC_SHADOW) &&
- prop_info->ce != scope) ||
- ((prop_info->flags & ZEND_ACC_PROTECTED) &&
- !zend_check_protected(prop_info->ce, scope)) ||
- ((prop_info->flags & ZEND_ACC_PRIVATE) &&
- ce != scope &&
+ if (((prop_info->flags & ZEND_ACC_PROTECTED) &&
+ !zend_check_protected(prop_info->ce, scope)) ||
+ ((prop_info->flags & ZEND_ACC_PRIVATE) &&
prop_info->ce != scope)) {
continue;
}
@@ -1111,13 +1121,17 @@ static void add_class_vars(zend_class_entry *scope, zend_class_entry *ce, int st
} else if (!statics && (prop_info->flags & ZEND_ACC_STATIC) == 0) {
prop = &ce->default_properties_table[OBJ_PROP_TO_NUM(prop_info->offset)];
}
- if (!prop || Z_TYPE_P(prop) == IS_UNDEF) {
+ if (!prop) {
continue;
}
- /* copy: enforce read only access */
- ZVAL_DEREF(prop);
- ZVAL_COPY_OR_DUP(&prop_copy, prop);
+ if (Z_ISUNDEF_P(prop)) {
+ /* Return uninitialized typed properties as a null value */
+ ZVAL_NULL(&prop_copy);
+ } else {
+ /* copy: enforce read only access */
+ ZVAL_COPY_OR_DUP(&prop_copy, prop);
+ }
prop = &prop_copy;
/* this is necessary to make it able to work with default array
@@ -1176,12 +1190,7 @@ ZEND_FUNCTION(get_object_vars)
Z_PARAM_OBJECT(obj)
ZEND_PARSE_PARAMETERS_END();
- if (Z_OBJ_HT_P(obj)->get_properties == NULL) {
- RETURN_FALSE;
- }
-
properties = Z_OBJ_HT_P(obj)->get_properties(obj);
-
if (properties == NULL) {
RETURN_FALSE;
}
@@ -1198,18 +1207,18 @@ ZEND_FUNCTION(get_object_vars)
array_init_size(return_value, zend_hash_num_elements(properties));
ZEND_HASH_FOREACH_KEY_VAL(properties, num_key, key, value) {
- zend_bool unmangle = 0;
+ zend_bool is_dynamic = 1;
if (Z_TYPE_P(value) == IS_INDIRECT) {
value = Z_INDIRECT_P(value);
if (UNEXPECTED(Z_ISUNDEF_P(value))) {
continue;
}
- ZEND_ASSERT(key);
- if (zend_check_property_access(zobj, key) == FAILURE) {
- continue;
- }
- unmangle = 1;
+ is_dynamic = 0;
+ }
+
+ if (key && zend_check_property_access(zobj, key, is_dynamic) == FAILURE) {
+ continue;
}
if (Z_ISREF_P(value) && Z_REFCOUNT_P(value) == 1) {
@@ -1220,7 +1229,7 @@ ZEND_FUNCTION(get_object_vars)
if (UNEXPECTED(!key)) {
/* This case is only possible due to loopholes, e.g. ArrayObject */
zend_hash_index_add(Z_ARRVAL_P(return_value), num_key, value);
- } else if (unmangle && ZSTR_VAL(key)[0] == 0) {
+ } else if (!is_dynamic && ZSTR_VAL(key)[0] == 0) {
const char *prop_name, *class_name;
size_t prop_len;
zend_unmangle_property_name_ex(key, &class_name, &prop_name, &prop_len);
@@ -1238,6 +1247,31 @@ ZEND_FUNCTION(get_object_vars)
}
/* }}} */
+/* {{{ proto array get_mangled_object_vars(object obj)
+ Returns an array of mangled object properties. Does not respect property visibility. */
+ZEND_FUNCTION(get_mangled_object_vars)
+{
+ zval *obj;
+ HashTable *properties;
+
+ ZEND_PARSE_PARAMETERS_START(1, 1)
+ Z_PARAM_OBJECT(obj)
+ ZEND_PARSE_PARAMETERS_END();
+
+ properties = Z_OBJ_HT_P(obj)->get_properties(obj);
+ if (!properties) {
+ ZVAL_EMPTY_ARRAY(return_value);
+ return;
+ }
+
+ properties = zend_proptable_to_symtable(properties,
+ (Z_OBJCE_P(obj)->default_properties_count ||
+ Z_OBJ_P(obj)->handlers != &std_object_handlers ||
+ GC_IS_RECURSIVE(properties)));
+ RETURN_ARR(properties);
+}
+/* }}} */
+
static int same_name(zend_string *key, zend_string *name) /* {{{ */
{
zend_string *lcname;
@@ -1274,7 +1308,7 @@ ZEND_FUNCTION(get_class_methods)
if (Z_TYPE_P(klass) == IS_OBJECT) {
ce = Z_OBJCE_P(klass);
} else if (Z_TYPE_P(klass) == IS_STRING) {
- ce = zend_lookup_class(Z_STR_P(klass));
+ ce = zend_lookup_class(Z_STR_P(klass));
}
if (!ce) {
@@ -1288,29 +1322,19 @@ ZEND_FUNCTION(get_class_methods)
if ((mptr->common.fn_flags & ZEND_ACC_PUBLIC)
|| (scope &&
- (((mptr->common.fn_flags & ZEND_ACC_PROTECTED) &&
- zend_check_protected(mptr->common.scope, scope))
+ (((mptr->common.fn_flags & ZEND_ACC_PROTECTED) &&
+ zend_check_protected(mptr->common.scope, scope))
|| ((mptr->common.fn_flags & ZEND_ACC_PRIVATE) &&
- scope == mptr->common.scope)))) {
- size_t len = ZSTR_LEN(mptr->common.function_name);
-
- /* Do not display old-style inherited constructors */
- if (!key) {
+ scope == mptr->common.scope)))
+ ) {
+ if (mptr->type == ZEND_USER_FUNCTION &&
+ (!mptr->op_array.refcount || *mptr->op_array.refcount > 1) &&
+ key && !same_name(key, mptr->common.function_name)) {
+ ZVAL_STR_COPY(&method_name, zend_find_alias_name(mptr->common.scope, key));
+ zend_hash_next_index_insert_new(Z_ARRVAL_P(return_value), &method_name);
+ } else {
ZVAL_STR_COPY(&method_name, mptr->common.function_name);
zend_hash_next_index_insert_new(Z_ARRVAL_P(return_value), &method_name);
- } else if ((mptr->common.fn_flags & ZEND_ACC_CTOR) == 0 ||
- mptr->common.scope == ce ||
- zend_binary_strcasecmp(ZSTR_VAL(key), ZSTR_LEN(key), ZSTR_VAL(mptr->common.function_name), len) == 0) {
-
- if (mptr->type == ZEND_USER_FUNCTION &&
- (!mptr->op_array.refcount || *mptr->op_array.refcount > 1) &&
- !same_name(key, mptr->common.function_name)) {
- ZVAL_STR_COPY(&method_name, zend_find_alias_name(mptr->common.scope, key));
- zend_hash_next_index_insert_new(Z_ARRVAL_P(return_value), &method_name);
- } else {
- ZVAL_STR_COPY(&method_name, mptr->common.function_name);
- zend_hash_next_index_insert_new(Z_ARRVAL_P(return_value), &method_name);
- }
}
}
} ZEND_HASH_FOREACH_END();
@@ -1324,7 +1348,8 @@ ZEND_FUNCTION(method_exists)
zval *klass;
zend_string *method_name;
zend_string *lcname;
- zend_class_entry * ce;
+ zend_class_entry *ce;
+ zend_function *func;
ZEND_PARSE_PARAMETERS_START(2, 2)
Z_PARAM_ZVAL(klass)
@@ -1342,28 +1367,33 @@ ZEND_FUNCTION(method_exists)
}
lcname = zend_string_tolower(method_name);
- if (zend_hash_exists(&ce->function_table, 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) {
+ func = zend_hash_find_ptr(&ce->function_table, lcname);
+ zend_string_release_ex(lcname, 0);
+
+ if (func) {
+ /* Exclude shadow properties when checking a method on a specific class. Include
+ * them when checking an object, as method_exists() generally ignores visibility.
+ * TODO: Should we use EG(scope) for the object case instead? */
+ RETURN_BOOL(Z_TYPE_P(klass) == IS_OBJECT
+ || !(func->common.fn_flags & ZEND_ACC_PRIVATE) || func->common.scope == ce);
+ }
+
+ if (Z_TYPE_P(klass) == IS_OBJECT) {
zend_object *obj = Z_OBJ_P(klass);
- zend_function *func = Z_OBJ_HT_P(klass)->get_method(&obj, method_name, NULL);
+ func = Z_OBJ_HT_P(klass)->get_method(&obj, method_name, NULL);
if (func != NULL) {
if (func->common.fn_flags & ZEND_ACC_CALL_VIA_TRAMPOLINE) {
/* Returns true to the fake Closure's __invoke */
RETVAL_BOOL(func->common.scope == zend_ce_closure
&& zend_string_equals_literal(method_name, ZEND_INVOKE_FUNC_NAME));
- zend_string_release_ex(lcname, 0);
zend_string_release_ex(func->common.function_name, 0);
zend_free_trampoline(func);
return;
}
- zend_string_release_ex(lcname, 0);
RETURN_TRUE;
}
}
- zend_string_release_ex(lcname, 0);
RETURN_FALSE;
}
/* }}} */
@@ -1398,15 +1428,16 @@ ZEND_FUNCTION(property_exists)
RETURN_NULL();
}
- if ((property_info = zend_hash_find_ptr(&ce->properties_info, property)) != NULL
- && (property_info->flags & ZEND_ACC_SHADOW) == 0) {
+ property_info = zend_hash_find_ptr(&ce->properties_info, property);
+ if (property_info != NULL
+ && (!(property_info->flags & ZEND_ACC_PRIVATE)
+ || property_info->ce == ce)) {
RETURN_TRUE;
}
ZVAL_STR(&property_z, property);
if (Z_TYPE_P(object) == IS_OBJECT &&
- Z_OBJ_HANDLER_P(object, has_property) &&
Z_OBJ_HANDLER_P(object, has_property)(object, &property_z, 2, NULL)) {
RETURN_TRUE;
}
@@ -1414,77 +1445,55 @@ ZEND_FUNCTION(property_exists)
}
/* }}} */
-/* {{{ proto bool class_exists(string classname [, bool autoload])
- Checks if the class exists */
-ZEND_FUNCTION(class_exists)
+static inline void class_exists_impl(INTERNAL_FUNCTION_PARAMETERS, int flags, int skip_flags) /* {{{ */
{
- zend_string *class_name;
- zend_string *lc_name;
+ zend_string *name;
+ zend_string *lcname;
zend_class_entry *ce;
zend_bool autoload = 1;
ZEND_PARSE_PARAMETERS_START(1, 2)
- Z_PARAM_STR(class_name)
+ Z_PARAM_STR(name)
Z_PARAM_OPTIONAL
Z_PARAM_BOOL(autoload)
ZEND_PARSE_PARAMETERS_END();
if (!autoload) {
- if (ZSTR_VAL(class_name)[0] == '\\') {
+ if (ZSTR_VAL(name)[0] == '\\') {
/* Ignore leading "\" */
- lc_name = zend_string_alloc(ZSTR_LEN(class_name) - 1, 0);
- zend_str_tolower_copy(ZSTR_VAL(lc_name), ZSTR_VAL(class_name) + 1, ZSTR_LEN(class_name) - 1);
+ lcname = zend_string_alloc(ZSTR_LEN(name) - 1, 0);
+ zend_str_tolower_copy(ZSTR_VAL(lcname), ZSTR_VAL(name) + 1, ZSTR_LEN(name) - 1);
} else {
- lc_name = zend_string_tolower(class_name);
+ lcname = zend_string_tolower(name);
}
- ce = zend_hash_find_ptr(EG(class_table), lc_name);
- zend_string_release_ex(lc_name, 0);
+ ce = zend_hash_find_ptr(EG(class_table), lcname);
+ zend_string_release_ex(lcname, 0);
} else {
- ce = zend_lookup_class(class_name);
+ ce = zend_lookup_class(name);
}
if (ce) {
- RETURN_BOOL((ce->ce_flags & (ZEND_ACC_INTERFACE | ZEND_ACC_TRAIT)) == 0);
+ RETURN_BOOL(((ce->ce_flags & flags) == flags) && !(ce->ce_flags & skip_flags));
} else {
RETURN_FALSE;
}
}
+/* {{{ */
+
+/* {{{ proto bool class_exists(string classname [, bool autoload])
+ Checks if the class exists */
+ZEND_FUNCTION(class_exists)
+{
+ class_exists_impl(INTERNAL_FUNCTION_PARAM_PASSTHRU, ZEND_ACC_LINKED, ZEND_ACC_INTERFACE | ZEND_ACC_TRAIT);
+}
/* }}} */
/* {{{ proto bool interface_exists(string classname [, bool autoload])
Checks if the class exists */
ZEND_FUNCTION(interface_exists)
{
- zend_string *iface_name, *lc_name;
- zend_class_entry *ce;
- zend_bool autoload = 1;
-
- ZEND_PARSE_PARAMETERS_START(1, 2)
- Z_PARAM_STR(iface_name)
- Z_PARAM_OPTIONAL
- Z_PARAM_BOOL(autoload)
- ZEND_PARSE_PARAMETERS_END();
-
- if (!autoload) {
- if (ZSTR_VAL(iface_name)[0] == '\\') {
- /* Ignore leading "\" */
- lc_name = zend_string_alloc(ZSTR_LEN(iface_name) - 1, 0);
- zend_str_tolower_copy(ZSTR_VAL(lc_name), ZSTR_VAL(iface_name) + 1, ZSTR_LEN(iface_name) - 1);
- } else {
- lc_name = zend_string_tolower(iface_name);
- }
- ce = zend_hash_find_ptr(EG(class_table), lc_name);
- zend_string_release_ex(lc_name, 0);
- RETURN_BOOL(ce && ce->ce_flags & ZEND_ACC_INTERFACE);
- }
-
- ce = zend_lookup_class(iface_name);
- if (ce) {
- RETURN_BOOL((ce->ce_flags & ZEND_ACC_INTERFACE) > 0);
- } else {
- RETURN_FALSE;
- }
+ class_exists_impl(INTERNAL_FUNCTION_PARAM_PASSTHRU, ZEND_ACC_LINKED|ZEND_ACC_INTERFACE, 0);
}
/* }}} */
@@ -1492,36 +1501,7 @@ ZEND_FUNCTION(interface_exists)
Checks if the trait exists */
ZEND_FUNCTION(trait_exists)
{
- zend_string *trait_name, *lc_name;
- zend_class_entry *ce;
- zend_bool autoload = 1;
-
- ZEND_PARSE_PARAMETERS_START(1, 2)
- Z_PARAM_STR(trait_name)
- Z_PARAM_OPTIONAL
- Z_PARAM_BOOL(autoload)
- ZEND_PARSE_PARAMETERS_END();
-
- if (!autoload) {
- if (ZSTR_VAL(trait_name)[0] == '\\') {
- /* Ignore leading "\" */
- lc_name = zend_string_alloc(ZSTR_LEN(trait_name) - 1, 0);
- zend_str_tolower_copy(ZSTR_VAL(lc_name), ZSTR_VAL(trait_name) + 1, ZSTR_LEN(trait_name) - 1);
- } else {
- lc_name = zend_string_tolower(trait_name);
- }
-
- ce = zend_hash_find_ptr(EG(class_table), lc_name);
- zend_string_release_ex(lc_name, 0);
- } else {
- ce = zend_lookup_class(trait_name);
- }
-
- if (ce) {
- RETURN_BOOL((ce->ce_flags & ZEND_ACC_TRAIT) != 0);
- } else {
- RETURN_FALSE;
- }
+ class_exists_impl(INTERNAL_FUNCTION_PARAM_PASSTHRU, ZEND_ACC_TRAIT, 0);
}
/* }}} */
@@ -1571,7 +1551,7 @@ ZEND_FUNCTION(class_alias)
return;
}
- ce = zend_lookup_class_ex(class_name, NULL, autoload);
+ ce = zend_lookup_class_ex(class_name, NULL, !autoload ? ZEND_FETCH_CLASS_NO_AUTOLOAD : 0);
if (ce) {
if (ce->type == ZEND_USER_CLASS) {
@@ -1765,40 +1745,42 @@ ZEND_FUNCTION(restore_exception_handler)
}
/* }}} */
-static int copy_class_or_interface_name(zval *el, int num_args, va_list args, zend_hash_key *hash_key) /* {{{ */
+static void copy_class_or_interface_name(zval *array, zend_string *key, zend_class_entry *ce) /* {{{ */
{
- zend_class_entry *ce = (zend_class_entry *)Z_PTR_P(el);
- zval *array = va_arg(args, zval *);
- uint32_t mask = va_arg(args, uint32_t);
- uint32_t comply = va_arg(args, uint32_t);
- uint32_t comply_mask = (comply)? mask:0;
-
- if ((hash_key->key && ZSTR_VAL(hash_key->key)[0] != 0)
- && (comply_mask == (ce->ce_flags & mask))) {
- if (ce->refcount > 1 &&
- !same_name(hash_key->key, ce->name)) {
- add_next_index_str(array, zend_string_copy(hash_key->key));
- } else {
- add_next_index_str(array, zend_string_copy(ce->name));
- }
+ if ((ce->refcount == 1 && !(ce->ce_flags & ZEND_ACC_IMMUTABLE)) ||
+ same_name(key, ce->name)) {
+ key = ce->name;
}
- return ZEND_HASH_APPLY_KEEP;
+ add_next_index_str(array, zend_string_copy(key));
}
/* }}} */
-/* {{{ proto array get_declared_traits()
- Returns an array of all declared traits. */
-ZEND_FUNCTION(get_declared_traits)
+static inline void get_declared_class_impl(INTERNAL_FUNCTION_PARAMETERS, int flags, int skip_flags) /* {{{ */
{
- uint32_t mask = ZEND_ACC_TRAIT;
- uint32_t comply = 1;
+ zend_string *key;
+ zend_class_entry *ce;
if (zend_parse_parameters_none() == FAILURE) {
return;
}
array_init(return_value);
- zend_hash_apply_with_arguments(EG(class_table), copy_class_or_interface_name, 3, return_value, mask, comply);
+ ZEND_HASH_FOREACH_STR_KEY_PTR(EG(class_table), key, ce) {
+ if (key
+ && ZSTR_VAL(key)[0] != 0
+ && (ce->ce_flags & flags)
+ && !(ce->ce_flags & skip_flags)) {
+ copy_class_or_interface_name(return_value, key, ce);
+ }
+ } ZEND_HASH_FOREACH_END();
+}
+/* {{{ */
+
+/* {{{ proto array get_declared_traits()
+ Returns an array of all declared traits. */
+ZEND_FUNCTION(get_declared_traits)
+{
+ get_declared_class_impl(INTERNAL_FUNCTION_PARAM_PASSTHRU, ZEND_ACC_TRAIT, 0);
}
/* }}} */
@@ -1806,15 +1788,7 @@ ZEND_FUNCTION(get_declared_traits)
Returns an array of all declared classes. */
ZEND_FUNCTION(get_declared_classes)
{
- uint32_t mask = ZEND_ACC_INTERFACE | ZEND_ACC_TRAIT;
- uint32_t comply = 0;
-
- if (zend_parse_parameters_none() == FAILURE) {
- return;
- }
-
- array_init(return_value);
- zend_hash_apply_with_arguments(EG(class_table), copy_class_or_interface_name, 3, return_value, mask, comply);
+ get_declared_class_impl(INTERNAL_FUNCTION_PARAM_PASSTHRU, ZEND_ACC_LINKED, ZEND_ACC_INTERFACE | ZEND_ACC_TRAIT);
}
/* }}} */
@@ -1822,37 +1796,7 @@ ZEND_FUNCTION(get_declared_classes)
Returns an array of all declared interfaces. */
ZEND_FUNCTION(get_declared_interfaces)
{
- uint32_t mask = ZEND_ACC_INTERFACE;
- uint32_t comply = 1;
-
- if (zend_parse_parameters_none() == FAILURE) {
- return;
- }
-
- array_init(return_value);
- zend_hash_apply_with_arguments(EG(class_table), copy_class_or_interface_name, 3, return_value, mask, comply);
-}
-/* }}} */
-
-static int copy_function_name(zval *zv, int num_args, va_list args, zend_hash_key *hash_key) /* {{{ */
-{
- zend_function *func = Z_PTR_P(zv);
- zval *internal_ar = va_arg(args, zval *),
- *user_ar = va_arg(args, zval *);
- zend_bool *exclude_disabled = va_arg(args, zend_bool *);
-
- if (hash_key->key == NULL || ZSTR_VAL(hash_key->key)[0] == 0) {
- return 0;
- }
-
- if (func->type == ZEND_INTERNAL_FUNCTION
- && (!*exclude_disabled || func->internal_function.handler != ZEND_FN(display_disabled_function))) {
- add_next_index_str(internal_ar, zend_string_copy(hash_key->key));
- } else if (func->type == ZEND_USER_FUNCTION) {
- add_next_index_str(user_ar, zend_string_copy(hash_key->key));
- }
-
- return 0;
+ get_declared_class_impl(INTERNAL_FUNCTION_PARAM_PASSTHRU, ZEND_ACC_INTERFACE, 0);
}
/* }}} */
@@ -1861,6 +1805,8 @@ static int copy_function_name(zval *zv, int num_args, va_list args, zend_hash_ke
ZEND_FUNCTION(get_defined_functions)
{
zval internal, user;
+ zend_string *key;
+ zend_function *func;
zend_bool exclude_disabled = 0;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "|b", &exclude_disabled) == FAILURE) {
@@ -1871,7 +1817,16 @@ ZEND_FUNCTION(get_defined_functions)
array_init(&user);
array_init(return_value);
- zend_hash_apply_with_arguments(EG(function_table), copy_function_name, 3, &internal, &user, &exclude_disabled);
+ ZEND_HASH_FOREACH_STR_KEY_PTR(EG(function_table), key, func) {
+ if (key && ZSTR_VAL(key)[0] != 0) {
+ if (func->type == ZEND_INTERNAL_FUNCTION
+ && (!exclude_disabled || func->internal_function.handler != ZEND_FN(display_disabled_function))) {
+ add_next_index_str(&internal, zend_string_copy(key));
+ } else if (func->type == ZEND_USER_FUNCTION) {
+ add_next_index_str(&user, zend_string_copy(key));
+ }
+ }
+ } ZEND_HASH_FOREACH_END();
zend_hash_str_add_new(Z_ARRVAL_P(return_value), "internal", sizeof("internal")-1, &internal);
zend_hash_str_add_new(Z_ARRVAL_P(return_value), "user", sizeof("user")-1, &user);
@@ -2043,15 +1998,6 @@ ZEND_FUNCTION(get_resources)
}
/* }}} */
-static int add_extension_info(zval *item, void *arg) /* {{{ */
-{
- zval *name_array = (zval *)arg;
- zend_module_entry *module = (zend_module_entry*)Z_PTR_P(item);
- add_next_index_string(name_array, module->name);
- return 0;
-}
-/* }}} */
-
static int add_zendext_info(zend_extension *ext, void *arg) /* {{{ */
{
zval *name_array = (zval *)arg;
@@ -2060,23 +2006,6 @@ static int add_zendext_info(zend_extension *ext, void *arg) /* {{{ */
}
/* }}} */
-static int add_constant_info(zval *item, void *arg) /* {{{ */
-{
- zval *name_array = (zval *)arg;
- zend_constant *constant = (zend_constant*)Z_PTR_P(item);
- zval const_val;
-
- if (!constant->name) {
- /* skip special constants */
- return 0;
- }
-
- ZVAL_COPY_OR_DUP(&const_val, &constant->value);
- zend_hash_add_new(Z_ARRVAL_P(name_array), constant->name, &const_val);
- return 0;
-}
-/* }}} */
-
/* {{{ proto array get_loaded_extensions([bool zend_extensions])
Return an array containing names of loaded extensions */
ZEND_FUNCTION(get_loaded_extensions)
@@ -2092,7 +2021,11 @@ ZEND_FUNCTION(get_loaded_extensions)
if (zendext) {
zend_llist_apply_with_argument(&zend_extensions, (llist_apply_with_arg_func_t)add_zendext_info, return_value);
} else {
- zend_hash_apply_with_argument(&module_registry, add_extension_info, return_value);
+ zend_module_entry *module;
+
+ ZEND_HASH_FOREACH_PTR(&module_registry, module) {
+ add_next_index_string(return_value, module->name);
+ } ZEND_HASH_FOREACH_END();
}
}
/* }}} */
@@ -2154,7 +2087,17 @@ ZEND_FUNCTION(get_defined_constants)
efree(module_names);
efree(modules);
} else {
- zend_hash_apply_with_argument(EG(zend_constants), add_constant_info, return_value);
+ zend_constant *constant;
+ zval const_val;
+
+ ZEND_HASH_FOREACH_PTR(EG(zend_constants), constant) {
+ if (!constant->name) {
+ /* skip special constants */
+ continue;
+ }
+ ZVAL_COPY_OR_DUP(&const_val, &constant->value);
+ zend_hash_add_new(Z_ARRVAL_P(return_value), constant->name, &const_val);
+ } ZEND_HASH_FOREACH_END();
}
}
/* }}} */
@@ -2188,10 +2131,11 @@ static void debug_backtrace_get_args(zend_execute_data *call, zval *arg_array) /
if (Z_OPT_REFCOUNTED_P(arg)) {
Z_ADDREF_P(arg);
}
- ZEND_HASH_FILL_ADD(arg);
+ ZEND_HASH_FILL_SET(arg);
} else {
- ZEND_HASH_FILL_ADD(&EG(uninitialized_zval));
+ ZEND_HASH_FILL_SET_NULL();
}
+ ZEND_HASH_FILL_NEXT();
i++;
}
} else {
@@ -2200,10 +2144,11 @@ static void debug_backtrace_get_args(zend_execute_data *call, zval *arg_array) /
if (Z_OPT_REFCOUNTED_P(p)) {
Z_ADDREF_P(p);
}
- ZEND_HASH_FILL_ADD(p);
+ ZEND_HASH_FILL_SET(p);
} else {
- ZEND_HASH_FILL_ADD(&EG(uninitialized_zval));
+ ZEND_HASH_FILL_SET_NULL();
}
+ ZEND_HASH_FILL_NEXT();
p++;
i++;
}
@@ -2216,10 +2161,11 @@ static void debug_backtrace_get_args(zend_execute_data *call, zval *arg_array) /
if (Z_OPT_REFCOUNTED_P(p)) {
Z_ADDREF_P(p);
}
- ZEND_HASH_FILL_ADD(p);
+ ZEND_HASH_FILL_SET(p);
} else {
- ZEND_HASH_FILL_ADD(&EG(uninitialized_zval));
+ ZEND_HASH_FILL_SET_NULL();
}
+ ZEND_HASH_FILL_NEXT();
p++;
i++;
}
@@ -2245,6 +2191,20 @@ void debug_print_backtrace_args(zval *arg_array) /* {{{ */
}
/* }}} */
+static inline zend_bool skip_internal_handler(zend_execute_data *skip) /* {{{ */
+{
+ return !(skip->func && ZEND_USER_CODE(skip->func->common.type))
+ && skip->prev_execute_data
+ && skip->prev_execute_data->func
+ && ZEND_USER_CODE(skip->prev_execute_data->func->common.type)
+ && skip->prev_execute_data->opline->opcode != ZEND_DO_FCALL
+ && skip->prev_execute_data->opline->opcode != ZEND_DO_ICALL
+ && skip->prev_execute_data->opline->opcode != ZEND_DO_UCALL
+ && skip->prev_execute_data->opline->opcode != ZEND_DO_FCALL_BY_NAME
+ && skip->prev_execute_data->opline->opcode != ZEND_INCLUDE_OR_EVAL;
+}
+/* {{{ */
+
/* {{{ proto void debug_print_backtrace([int options[, int limit]]) */
ZEND_FUNCTION(debug_print_backtrace)
{
@@ -2283,15 +2243,7 @@ ZEND_FUNCTION(debug_print_backtrace)
skip = ptr;
/* skip internal handler */
- if ((!skip->func || !ZEND_USER_CODE(skip->func->common.type)) &&
- skip->prev_execute_data &&
- skip->prev_execute_data->func &&
- ZEND_USER_CODE(skip->prev_execute_data->func->common.type) &&
- skip->prev_execute_data->opline->opcode != ZEND_DO_FCALL &&
- skip->prev_execute_data->opline->opcode != ZEND_DO_ICALL &&
- skip->prev_execute_data->opline->opcode != ZEND_DO_UCALL &&
- skip->prev_execute_data->opline->opcode != ZEND_DO_FCALL_BY_NAME &&
- skip->prev_execute_data->opline->opcode != ZEND_INCLUDE_OR_EVAL) {
+ if (skip_internal_handler(skip)) {
skip = skip->prev_execute_data;
}
@@ -2318,16 +2270,16 @@ ZEND_FUNCTION(debug_print_backtrace)
zend_string *zend_function_name;
func = call->func;
- if (func->common.scope && func->common.scope->trait_aliases) {
- zend_function_name = zend_resolve_method_name(object ? object->ce : func->common.scope, func);
- } else {
- zend_function_name = func->common.function_name;
- }
- if (zend_function_name != NULL) {
- function_name = ZSTR_VAL(zend_function_name);
- } else {
- function_name = NULL;
- }
+ if (func->common.scope && func->common.scope->trait_aliases) {
+ zend_function_name = zend_resolve_method_name(object ? object->ce : func->common.scope, func);
+ } else {
+ zend_function_name = func->common.function_name;
+ }
+ if (zend_function_name != NULL) {
+ function_name = ZSTR_VAL(zend_function_name);
+ } else {
+ function_name = NULL;
+ }
} else {
func = NULL;
function_name = NULL;
@@ -2419,7 +2371,7 @@ ZEND_FUNCTION(debug_print_backtrace)
while (prev) {
if (prev_call &&
- prev_call->func &&
+ prev_call->func &&
!ZEND_USER_CODE(prev_call->func->common.type)) {
prev = NULL;
break;
@@ -2492,15 +2444,7 @@ ZEND_API void zend_fetch_debug_backtrace(zval *return_value, int skip_last, int
skip = ptr;
/* skip internal handler */
- if ((!skip->func || !ZEND_USER_CODE(skip->func->common.type)) &&
- skip->prev_execute_data &&
- skip->prev_execute_data->func &&
- ZEND_USER_CODE(skip->prev_execute_data->func->common.type) &&
- skip->prev_execute_data->opline->opcode != ZEND_DO_FCALL &&
- skip->prev_execute_data->opline->opcode != ZEND_DO_ICALL &&
- skip->prev_execute_data->opline->opcode != ZEND_DO_UCALL &&
- skip->prev_execute_data->opline->opcode != ZEND_DO_FCALL_BY_NAME &&
- skip->prev_execute_data->opline->opcode != ZEND_INCLUDE_OR_EVAL) {
+ if (skip_internal_handler(skip)) {
skip = skip->prev_execute_data;
}
@@ -2529,7 +2473,7 @@ ZEND_API void zend_fetch_debug_backtrace(zval *return_value, int skip_last, int
while (prev) {
if (prev_call &&
- prev_call->func &&
+ prev_call->func &&
!ZEND_USER_CODE(prev_call->func->common.type) &&
!(prev_call->func->common.fn_flags & ZEND_ACC_CALL_VIA_TRAMPOLINE)) {
break;
@@ -2553,7 +2497,7 @@ ZEND_API void zend_fetch_debug_backtrace(zval *return_value, int skip_last, int
if (call && call->func) {
func = call->func;
function_name = (func->common.scope &&
- func->common.scope->trait_aliases) ?
+ func->common.scope->trait_aliases) ?
zend_resolve_method_name(
(object ? object->ce : func->common.scope), func) :
func->common.function_name;
@@ -2744,13 +2688,3 @@ ZEND_FUNCTION(get_extension_funcs)
}
}
/* }}} */
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * indent-tabs-mode: t
- * End:
- * vim600: sw=4 ts=4 fdm=marker
- * vim<600: sw=4 ts=4
- */
diff --git a/Zend/zend_builtin_functions.h b/Zend/zend_builtin_functions.h
index 4137f480a0..cfc347ed41 100644
--- a/Zend/zend_builtin_functions.h
+++ b/Zend/zend_builtin_functions.h
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| Zend Engine |
+----------------------------------------------------------------------+
- | Copyright (c) 1998-2018 Zend Technologies Ltd. (http://www.zend.com) |
+ | Copyright (c) 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 |
@@ -27,13 +27,3 @@ ZEND_API void zend_fetch_debug_backtrace(zval *return_value, int skip_last, int
END_EXTERN_C()
#endif /* ZEND_BUILTIN_FUNCTIONS_H */
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * indent-tabs-mode: t
- * End:
- * vim600: sw=4 ts=4 fdm=marker
- * vim<600: sw=4 ts=4
- */
diff --git a/Zend/zend_closures.c b/Zend/zend_closures.c
index b9d8bd1c75..70dc469a48 100644
--- a/Zend/zend_closures.c
+++ b/Zend/zend_closures.c
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| Zend Engine |
+----------------------------------------------------------------------+
- | Copyright (c) 1998-2018 Zend Technologies Ltd. (http://www.zend.com) |
+ | Copyright (c) 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 |
@@ -49,7 +49,7 @@ ZEND_METHOD(Closure, __invoke) /* {{{ */
zend_function *func = EX(func);
zval *arguments = ZEND_CALL_ARG(execute_data, 1);
- if (call_user_function(CG(function_table), NULL, getThis(), return_value, ZEND_NUM_ARGS(), arguments) == FAILURE) {
+ if (call_user_function(CG(function_table), NULL, ZEND_THIS, return_value, ZEND_NUM_ARGS(), arguments) == FAILURE) {
RETVAL_FALSE;
}
@@ -82,10 +82,18 @@ static zend_bool zend_valid_closure_binding(
ZSTR_VAL(Z_OBJCE_P(newthis)->name));
return 0;
}
- } else if (!(func->common.fn_flags & ZEND_ACC_STATIC) && func->common.scope
- && func->type == ZEND_INTERNAL_FUNCTION) {
- zend_error(E_WARNING, "Cannot unbind $this of internal method");
- return 0;
+ } else if (is_fake_closure && func->common.scope
+ && !(func->common.fn_flags & ZEND_ACC_STATIC)) {
+ if (func->type == ZEND_INTERNAL_FUNCTION) {
+ zend_error(E_WARNING, "Cannot unbind $this of internal method");
+ return 0;
+ } else {
+ zend_error(E_DEPRECATED, "Unbinding $this of a method is deprecated");
+ }
+ } else if (!is_fake_closure && !Z_ISUNDEF(closure->this_ptr)
+ && (func->common.fn_flags & ZEND_ACC_USES_THIS)) {
+ // TODO: Only deprecate if it had $this *originally*?
+ zend_error(E_DEPRECATED, "Unbinding $this of closure is deprecated");
}
if (scope && scope != func->common.scope && scope->type == ZEND_INTERNAL_CLASS) {
@@ -108,7 +116,7 @@ static zend_bool zend_valid_closure_binding(
Call closure, binding to a given object with its class as the scope */
ZEND_METHOD(Closure, call)
{
- zval *zclosure, *newthis, closure_result;
+ zval *newthis, closure_result;
zend_closure *closure;
zend_fcall_info fci;
zend_fcall_info_cache fci_cache;
@@ -122,8 +130,7 @@ ZEND_METHOD(Closure, call)
return;
}
- zclosure = getThis();
- closure = (zend_closure *) Z_OBJ_P(zclosure);
+ closure = (zend_closure *) Z_OBJ_P(ZEND_THIS);
newobj = Z_OBJ_P(newthis);
@@ -144,9 +151,17 @@ ZEND_METHOD(Closure, call)
fci_cache.function_handler = &my_function;
/* Runtime cache relies on bound scope to be immutable, hence we need a separate rt cache in case scope changed */
- if (ZEND_USER_CODE(my_function.type) && closure->func.common.scope != Z_OBJCE_P(newthis)) {
- my_function.op_array.run_time_cache = emalloc(my_function.op_array.cache_size);
- memset(my_function.op_array.run_time_cache, 0, my_function.op_array.cache_size);
+ if (ZEND_USER_CODE(my_function.type)
+ && (closure->func.common.scope != Z_OBJCE_P(newthis)
+ || (closure->func.common.fn_flags & ZEND_ACC_HEAP_RT_CACHE))) {
+ void *ptr;
+
+ my_function.op_array.fn_flags |= ZEND_ACC_HEAP_RT_CACHE;
+ ptr = emalloc(sizeof(void*) + my_function.op_array.cache_size);
+ ZEND_MAP_PTR_INIT(my_function.op_array.run_time_cache, ptr);
+ ptr = (char*)ptr + sizeof(void*);
+ ZEND_MAP_PTR_SET(my_function.op_array.run_time_cache, ptr);
+ memset(ptr, 0, my_function.op_array.cache_size);
}
}
@@ -154,7 +169,7 @@ ZEND_METHOD(Closure, call)
fci_cache.object = fci.object = newobj;
fci.size = sizeof(fci);
- ZVAL_COPY_VALUE(&fci.function_name, zclosure);
+ ZVAL_OBJ(&fci.function_name, &closure->std);
fci.retval = &closure_result;
fci.no_separation = 1;
@@ -168,8 +183,9 @@ ZEND_METHOD(Closure, call)
if (fci_cache.function_handler->common.fn_flags & ZEND_ACC_GENERATOR) {
/* copied upon generator creation */
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);
+ } else if (ZEND_USER_CODE(my_function.type)
+ && fci_cache.function_handler->common.fn_flags & ZEND_ACC_HEAP_RT_CACHE) {
+ efree(ZEND_MAP_PTR(my_function.op_array.run_time_cache));
}
}
/* }}} */
@@ -198,7 +214,7 @@ ZEND_METHOD(Closure, bind)
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) {
+ } else if ((ce = zend_lookup_class(class_name)) == NULL) {
zend_error(E_WARNING, "Class '%s' not found", ZSTR_VAL(class_name));
zend_tmp_string_release(tmp_class_name);
RETURN_NULL();
@@ -246,8 +262,7 @@ static ZEND_NAMED_FUNCTION(zend_closure_call_magic) /* {{{ */ {
ZVAL_EMPTY_ARRAY(&fci.params[1]);
}
- fci.object = Z_OBJ(EX(This));
- fcc.object = Z_OBJ(EX(This));
+ fcc.object = fci.object = Z_OBJ_P(ZEND_THIS);
zend_call_function(&fci, &fcc);
@@ -277,6 +292,19 @@ static int zend_create_closure_from_callable(zval *return_value, zval *callable,
return SUCCESS;
}
+ if (!mptr->common.scope) {
+ return FAILURE;
+ }
+ if (mptr->common.fn_flags & ZEND_ACC_STATIC) {
+ if (!mptr->common.scope->__callstatic) {
+ return FAILURE;
+ }
+ } else {
+ if (!mptr->common.scope->__call) {
+ return FAILURE;
+ }
+ }
+
memset(&call, 0, sizeof(zend_internal_function));
call.type = ZEND_INTERNAL_FUNCTION;
call.fn_flags = mptr->common.fn_flags & ZEND_ACC_STATIC;
@@ -323,10 +351,10 @@ ZEND_METHOD(Closure, fromCallable)
if (success == FAILURE || error) {
if (error) {
- zend_throw_exception_ex(zend_ce_type_error, 0, "Failed to create closure from callable: %s", error);
+ zend_type_error("Failed to create closure from callable: %s", error);
efree(error);
} else {
- zend_throw_exception_ex(zend_ce_type_error, 0, "Failed to create closure from callable");
+ zend_type_error("Failed to create closure from callable");
}
}
}
@@ -397,27 +425,28 @@ static zend_function *zend_closure_get_method(zend_object **object, zend_string
}
/* }}} */
-static zval *zend_closure_read_property(zval *object, zval *member, int type, void **cache_slot, zval *rv) /* {{{ */
+static ZEND_COLD zval *zend_closure_read_property(zval *object, zval *member, int type, void **cache_slot, zval *rv) /* {{{ */
{
ZEND_CLOSURE_PROPERTY_ERROR();
return &EG(uninitialized_zval);
}
/* }}} */
-static void zend_closure_write_property(zval *object, zval *member, zval *value, void **cache_slot) /* {{{ */
+static ZEND_COLD zval *zend_closure_write_property(zval *object, zval *member, zval *value, void **cache_slot) /* {{{ */
{
ZEND_CLOSURE_PROPERTY_ERROR();
+ return &EG(error_zval);
}
/* }}} */
-static zval *zend_closure_get_property_ptr_ptr(zval *object, zval *member, int type, void **cache_slot) /* {{{ */
+static ZEND_COLD zval *zend_closure_get_property_ptr_ptr(zval *object, zval *member, int type, void **cache_slot) /* {{{ */
{
ZEND_CLOSURE_PROPERTY_ERROR();
return NULL;
}
/* }}} */
-static int zend_closure_has_property(zval *object, zval *member, int has_set_exists, void **cache_slot) /* {{{ */
+static ZEND_COLD int zend_closure_has_property(zval *object, zval *member, int has_set_exists, void **cache_slot) /* {{{ */
{
if (has_set_exists != ZEND_PROPERTY_EXISTS) {
ZEND_CLOSURE_PROPERTY_ERROR();
@@ -426,7 +455,7 @@ static int zend_closure_has_property(zval *object, zval *member, int has_set_exi
}
/* }}} */
-static void zend_closure_unset_property(zval *object, zval *member, void **cache_slot) /* {{{ */
+static ZEND_COLD void zend_closure_unset_property(zval *object, zval *member, void **cache_slot) /* {{{ */
{
ZEND_CLOSURE_PROPERTY_ERROR();
}
@@ -439,10 +468,6 @@ static void zend_closure_free_storage(zend_object *object) /* {{{ */
zend_object_std_dtor(&closure->std);
if (closure->func.type == ZEND_USER_FUNCTION) {
- if (closure->func.op_array.fn_flags & ZEND_ACC_NO_RT_ARENA) {
- efree(closure->func.op_array.run_time_cache);
- closure->func.op_array.run_time_cache = NULL;
- }
destroy_op_array(&closure->func.op_array);
}
@@ -507,7 +532,8 @@ static HashTable *zend_closure_get_debug_info(zval *object, int *is_temp) /* {{{
if (closure->func.type == ZEND_USER_FUNCTION && closure->func.op_array.static_variables) {
zval *var;
- HashTable *static_variables = closure->func.op_array.static_variables;
+ HashTable *static_variables =
+ ZEND_MAP_PTR_GET(closure->func.op_array.static_variables_ptr);
ZVAL_ARR(&val, zend_array_dup(static_variables));
zend_hash_update(debug_info, ZSTR_KNOWN(ZEND_STR_STATIC), &val);
ZEND_HASH_FOREACH_VAL(Z_ARRVAL(val), var) {
@@ -571,7 +597,7 @@ static HashTable *zend_closure_get_gc(zval *obj, zval **table, int *n) /* {{{ */
*table = Z_TYPE(closure->this_ptr) != IS_NULL ? &closure->this_ptr : NULL;
*n = Z_TYPE(closure->this_ptr) != IS_NULL ? 1 : 0;
return (closure->func.type == ZEND_USER_FUNCTION) ?
- closure->func.op_array.static_variables : NULL;
+ ZEND_MAP_PTR_GET(closure->func.op_array.static_variables_ptr) : NULL;
}
/* }}} */
@@ -666,28 +692,44 @@ 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.fn_flags |= ZEND_ACC_CLOSURE;
+ closure->func.common.fn_flags &= ~ZEND_ACC_IMMUTABLE;
+
if (closure->func.op_array.static_variables) {
closure->func.op_array.static_variables =
zend_array_dup(closure->func.op_array.static_variables);
}
+ ZEND_MAP_PTR_INIT(closure->func.op_array.static_variables_ptr,
+ &closure->func.op_array.static_variables);
/* Runtime cache is scope-dependent, so we cannot reuse it if the scope changed */
- if (!closure->func.op_array.run_time_cache
+ if (!ZEND_MAP_PTR_GET(closure->func.op_array.run_time_cache)
|| func->common.scope != scope
- || (func->common.fn_flags & ZEND_ACC_NO_RT_ARENA)
+ || (func->common.fn_flags & ZEND_ACC_HEAP_RT_CACHE)
) {
- if (!func->op_array.run_time_cache && (func->common.fn_flags & ZEND_ACC_CLOSURE)) {
+ void *ptr;
+
+ if (!ZEND_MAP_PTR_GET(func->op_array.run_time_cache)
+ && (func->common.fn_flags & ZEND_ACC_CLOSURE)
+ && (func->common.scope == scope ||
+ !(func->common.fn_flags & ZEND_ACC_IMMUTABLE))) {
/* If a real closure is used for the first time, we create a shared runtime cache
* and remember which scope it is for. */
- func->common.scope = scope;
- func->op_array.run_time_cache = zend_arena_alloc(&CG(arena), func->op_array.cache_size);
- closure->func.op_array.run_time_cache = func->op_array.run_time_cache;
+ if (func->common.scope != scope) {
+ func->common.scope = scope;
+ }
+ closure->func.op_array.fn_flags &= ~ZEND_ACC_HEAP_RT_CACHE;
+ ptr = zend_arena_alloc(&CG(arena), func->op_array.cache_size);
+ ZEND_MAP_PTR_SET(func->op_array.run_time_cache, ptr);
+ ZEND_MAP_PTR_SET(closure->func.op_array.run_time_cache, ptr);
} else {
/* Otherwise, we use a non-shared runtime cache */
- closure->func.op_array.run_time_cache = emalloc(func->op_array.cache_size);
- closure->func.op_array.fn_flags |= ZEND_ACC_NO_RT_ARENA;
+ closure->func.op_array.fn_flags |= ZEND_ACC_HEAP_RT_CACHE;
+ ptr = emalloc(sizeof(void*) + func->op_array.cache_size);
+ ZEND_MAP_PTR_INIT(closure->func.op_array.run_time_cache, ptr);
+ ptr = (char*)ptr + sizeof(void*);
+ ZEND_MAP_PTR_SET(closure->func.op_array.run_time_cache, ptr);
}
- memset(closure->func.op_array.run_time_cache, 0, func->op_array.cache_size);
+ memset(ptr, 0, func->op_array.cache_size);
}
if (closure->func.op_array.refcount) {
(*closure->func.op_array.refcount)++;
@@ -720,7 +762,8 @@ ZEND_API void zend_create_closure(zval *res, zend_function *func, zend_class_ent
if (scope) {
closure->func.common.fn_flags |= ZEND_ACC_PUBLIC;
if (this_ptr && Z_TYPE_P(this_ptr) == IS_OBJECT && (closure->func.common.fn_flags & ZEND_ACC_STATIC) == 0) {
- ZVAL_COPY(&closure->this_ptr, this_ptr);
+ Z_ADDREF_P(this_ptr);
+ ZVAL_OBJ(&closure->this_ptr, Z_OBJ_P(this_ptr));
}
}
}
@@ -740,7 +783,7 @@ ZEND_API void zend_create_fake_closure(zval *res, zend_function *func, zend_clas
void zend_closure_bind_var(zval *closure_zv, zend_string *var_name, zval *var) /* {{{ */
{
zend_closure *closure = (zend_closure *) Z_OBJ_P(closure_zv);
- HashTable *static_variables = closure->func.op_array.static_variables;
+ HashTable *static_variables = ZEND_MAP_PTR_GET(closure->func.op_array.static_variables_ptr);
zend_hash_update(static_variables, var_name, var);
}
/* }}} */
@@ -748,19 +791,9 @@ 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;
+ HashTable *static_variables = ZEND_MAP_PTR_GET(closure->func.op_array.static_variables_ptr);
zval *var = (zval*)((char*)static_variables->arData + offset);
zval_ptr_dtor(var);
ZVAL_COPY_VALUE(var, val);
}
/* }}} */
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * indent-tabs-mode: t
- * End:
- * vim600: sw=4 ts=4 fdm=marker
- * vim<600: sw=4 ts=4
- */
diff --git a/Zend/zend_closures.h b/Zend/zend_closures.h
index 8847ecb437..6e27ddc8df 100644
--- a/Zend/zend_closures.h
+++ b/Zend/zend_closures.h
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| Zend Engine |
+----------------------------------------------------------------------+
- | Copyright (c) 1998-2018 Zend Technologies Ltd. (http://www.zend.com) |
+ | Copyright (c) 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 |
@@ -41,13 +41,3 @@ ZEND_API zval* zend_get_closure_this_ptr(zval *obj);
END_EXTERN_C()
#endif
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * indent-tabs-mode: t
- * End:
- * vim600: sw=4 ts=4 fdm=marker
- * vim<600: sw=4 ts=4
- */
diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c
index 776ad6ba9e..10ea65f89d 100644
--- a/Zend/zend_compile.c
+++ b/Zend/zend_compile.c
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| Zend Engine |
+----------------------------------------------------------------------+
- | Copyright (c) 1998-2018 Zend Technologies Ltd. (http://www.zend.com) |
+ | Copyright (c) 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 |
@@ -35,7 +35,7 @@
#define SET_NODE(target, src) do { \
target ## _type = (src)->op_type; \
if ((src)->op_type == IS_CONST) { \
- target.constant = zend_add_literal(CG(active_op_array), &(src)->u.constant); \
+ target.constant = zend_add_literal(&(src)->u.constant); \
} else { \
target = (src)->u.op; \
} \
@@ -56,26 +56,18 @@ typedef struct _zend_loop_var {
zend_uchar opcode;
zend_uchar var_type;
uint32_t var_num;
- union {
- uint32_t try_catch_offset;
- uint32_t live_range_offset;
- } u;
+ uint32_t try_catch_offset;
} zend_loop_var;
-static inline uint32_t zend_alloc_cache_slot(void) {
+static inline uint32_t zend_alloc_cache_slots(unsigned count) {
zend_op_array *op_array = CG(active_op_array);
uint32_t ret = op_array->cache_size;
- op_array->cache_size += sizeof(void*);
+ op_array->cache_size += count * sizeof(void*);
return ret;
}
-#define POLYMORPHIC_CACHE_SLOT_SIZE 2
-
-static inline uint32_t zend_alloc_polymorphic_cache_slot(void) {
- zend_op_array *op_array = CG(active_op_array);
- uint32_t ret = op_array->cache_size;
- op_array->cache_size += POLYMORPHIC_CACHE_SLOT_SIZE * sizeof(void*);
- return ret;
+static inline uint32_t zend_alloc_cache_slot(void) {
+ return zend_alloc_cache_slots(1);
}
ZEND_API zend_op_array *(*zend_compile_file)(zend_file_handle *file_handle, int type);
@@ -96,8 +88,14 @@ static void init_op(zend_op *op)
op->lineno = CG(zend_lineno);
}
-static zend_op *get_next_op(zend_op_array *op_array)
+static zend_always_inline uint32_t get_next_op_number(void)
{
+ return CG(active_op_array)->last;
+}
+
+static zend_op *get_next_op(void)
+{
+ zend_op_array *op_array = CG(active_op_array);
uint32_t next_op_num = op_array->last++;
zend_op *next_op;
@@ -124,21 +122,16 @@ static void zend_destroy_property_info_internal(zval *zv) /* {{{ */
{
zend_property_info *property_info = Z_PTR_P(zv);
- zend_string_release_ex(property_info->name, 1);
+ zend_string_release(property_info->name);
free(property_info);
}
/* }}} */
-static zend_string *zend_build_runtime_definition_key(zend_string *name, unsigned char *lex_pos) /* {{{ */
+static zend_string *zend_build_runtime_definition_key(zend_string *name, uint32_t start_lineno) /* {{{ */
{
- zend_string *result;
- char char_pos_buf[32];
- size_t char_pos_len = zend_sprintf(char_pos_buf, "%p", lex_pos);
zend_string *filename = CG(active_op_array)->filename;
-
- /* NULL, name length, filename length, last accepting char position length */
- result = zend_string_alloc(1 + ZSTR_LEN(name) + ZSTR_LEN(filename) + char_pos_len, 0);
- sprintf(ZSTR_VAL(result), "%c%s%s%s", '\0', ZSTR_VAL(name), ZSTR_VAL(filename), char_pos_buf);
+ zend_string *result = zend_strpprintf(0, "%c%s%s:%" PRIu32 "$%" PRIx32,
+ '\0', ZSTR_VAL(name), ZSTR_VAL(filename), start_lineno, CG(rtd_key_counter)++);
return zend_new_interned_string(result);
}
/* }}} */
@@ -247,7 +240,6 @@ void zend_oparray_context_begin(zend_oparray_context *prev_context) /* {{{ */
CG(context).opcodes_size = INITIAL_OP_ARRAY_SIZE;
CG(context).vars_size = 0;
CG(context).literals_size = 0;
- CG(context).backpatch_count = 0;
CG(context).fast_call_var = -1;
CG(context).try_catch_offset = -1;
CG(context).current_brk_cont = -1;
@@ -332,9 +324,11 @@ void zend_init_compiler_data_structures(void) /* {{{ */
zend_stack_init(&CG(delayed_oplines_stack), sizeof(zend_op));
CG(active_class_entry) = NULL;
CG(in_compilation) = 0;
- CG(start_lineno) = 0;
+ CG(skip_shebang) = 0;
CG(encoding_declared) = 0;
+ CG(memoized_exprs) = NULL;
+ CG(memoize_mode) = 0;
}
/* }}} */
@@ -371,6 +365,9 @@ void init_compiler(void) /* {{{ */
zend_hash_init(&CG(filenames_table), 8, NULL, ZVAL_PTR_DTOR, 0);
zend_llist_init(&CG(open_files), sizeof(zend_file_handle), (void (*)(void *)) file_handle_dtor, 0);
CG(unclean_shutdown) = 0;
+
+ CG(delayed_variance_obligations) = NULL;
+ CG(delayed_autoloads) = NULL;
}
/* }}} */
@@ -380,6 +377,17 @@ void shutdown_compiler(void) /* {{{ */
zend_stack_destroy(&CG(delayed_oplines_stack));
zend_hash_destroy(&CG(filenames_table));
zend_arena_destroy(CG(arena));
+
+ if (CG(delayed_variance_obligations)) {
+ zend_hash_destroy(CG(delayed_variance_obligations));
+ FREE_HASHTABLE(CG(delayed_variance_obligations));
+ CG(delayed_variance_obligations) = NULL;
+ }
+ if (CG(delayed_autoloads)) {
+ zend_hash_destroy(CG(delayed_autoloads));
+ FREE_HASHTABLE(CG(delayed_autoloads));
+ CG(delayed_autoloads) = NULL;
+ }
}
/* }}} */
@@ -426,20 +434,20 @@ ZEND_API zend_bool zend_is_compiling(void) /* {{{ */
}
/* }}} */
-static uint32_t get_temporary_variable(zend_op_array *op_array) /* {{{ */
+static zend_always_inline uint32_t get_temporary_variable(void) /* {{{ */
{
- return (uint32_t)op_array->T++;
+ return (uint32_t)CG(active_op_array)->T++;
}
/* }}} */
-static int lookup_cv(zend_op_array *op_array, zend_string *name) /* {{{ */{
+static int lookup_cv(zend_string *name) /* {{{ */{
+ zend_op_array *op_array = CG(active_op_array);
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 &&
- zend_string_equal_content(op_array->vars[i], name))) {
+ if (ZSTR_H(op_array->vars[i]) == hash_value
+ && zend_string_equals(op_array->vars[i], name)) {
return (int)(zend_intptr_t)ZEND_CALL_VAR_NUM(NULL, i);
}
i++;
@@ -492,8 +500,9 @@ static inline void zend_insert_literal(zend_op_array *op_array, zval *zv, int li
/* Is used while compiling a function, using the context to keep track
of an approximate size to avoid to relocate to often.
Literals are truncated to actual size in the second compiler pass (pass_two()). */
-int zend_add_literal(zend_op_array *op_array, zval *zv) /* {{{ */
+static int zend_add_literal(zval *zv) /* {{{ */
{
+ zend_op_array *op_array = CG(active_op_array);
int i = op_array->last_literal;
op_array->last_literal++;
if (i >= CG(context).literals_size) {
@@ -507,71 +516,71 @@ int zend_add_literal(zend_op_array *op_array, zval *zv) /* {{{ */
}
/* }}} */
-static inline int zend_add_literal_string(zend_op_array *op_array, zend_string **str) /* {{{ */
+static inline int zend_add_literal_string(zend_string **str) /* {{{ */
{
int ret;
zval zv;
ZVAL_STR(&zv, *str);
- ret = zend_add_literal(op_array, &zv);
+ ret = zend_add_literal(&zv);
*str = Z_STR(zv);
return ret;
}
/* }}} */
-static int zend_add_func_name_literal(zend_op_array *op_array, zend_string *name) /* {{{ */
+static int zend_add_func_name_literal(zend_string *name) /* {{{ */
{
/* Original name */
- int ret = zend_add_literal_string(op_array, &name);
+ int ret = zend_add_literal_string(&name);
/* Lowercased name */
zend_string *lc_name = zend_string_tolower(name);
- zend_add_literal_string(op_array, &lc_name);
+ zend_add_literal_string(&lc_name);
return ret;
}
/* }}} */
-static int zend_add_ns_func_name_literal(zend_op_array *op_array, zend_string *name) /* {{{ */
+static int zend_add_ns_func_name_literal(zend_string *name) /* {{{ */
{
const char *unqualified_name;
size_t unqualified_name_len;
/* Original name */
- int ret = zend_add_literal_string(op_array, &name);
+ int ret = zend_add_literal_string(&name);
/* Lowercased name */
zend_string *lc_name = zend_string_tolower(name);
- zend_add_literal_string(op_array, &lc_name);
+ zend_add_literal_string(&lc_name);
/* Lowercased unqualfied name */
if (zend_get_unqualified_name(name, &unqualified_name, &unqualified_name_len)) {
lc_name = zend_string_alloc(unqualified_name_len, 0);
zend_str_tolower_copy(ZSTR_VAL(lc_name), unqualified_name, unqualified_name_len);
- zend_add_literal_string(op_array, &lc_name);
+ zend_add_literal_string(&lc_name);
}
return ret;
}
/* }}} */
-static int zend_add_class_name_literal(zend_op_array *op_array, zend_string *name) /* {{{ */
+static int zend_add_class_name_literal(zend_string *name) /* {{{ */
{
/* Original name */
- int ret = zend_add_literal_string(op_array, &name);
+ int ret = zend_add_literal_string(&name);
/* Lowercased name */
zend_string *lc_name = zend_string_tolower(name);
- zend_add_literal_string(op_array, &lc_name);
+ zend_add_literal_string(&lc_name);
return ret;
}
/* }}} */
-static int zend_add_const_name_literal(zend_op_array *op_array, zend_string *name, zend_bool unqualified) /* {{{ */
+static int zend_add_const_name_literal(zend_string *name, zend_bool unqualified) /* {{{ */
{
zend_string *tmp_name;
- int ret = zend_add_literal_string(op_array, &name);
+ int ret = zend_add_literal_string(&name);
size_t ns_len = 0, after_ns_len = ZSTR_LEN(name);
const char *after_ns = zend_memrchr(ZSTR_VAL(name), '\\', ZSTR_LEN(name));
@@ -583,11 +592,11 @@ static int zend_add_const_name_literal(zend_op_array *op_array, zend_string *nam
/* lowercased namespace name & original constant name */
tmp_name = zend_string_init(ZSTR_VAL(name), ZSTR_LEN(name), 0);
zend_str_tolower(ZSTR_VAL(tmp_name), ns_len);
- zend_add_literal_string(op_array, &tmp_name);
+ zend_add_literal_string(&tmp_name);
/* lowercased namespace name & lowercased constant name */
tmp_name = zend_string_tolower(name);
- zend_add_literal_string(op_array, &tmp_name);
+ zend_add_literal_string(&tmp_name);
if (!unqualified) {
return ret;
@@ -598,12 +607,12 @@ static int zend_add_const_name_literal(zend_op_array *op_array, zend_string *nam
/* original unqualified constant name */
tmp_name = zend_string_init(after_ns, after_ns_len, 0);
- zend_add_literal_string(op_array, &tmp_name);
+ zend_add_literal_string(&tmp_name);
/* lowercased unqualified constant name */
tmp_name = zend_string_alloc(after_ns_len, 0);
zend_str_tolower_copy(ZSTR_VAL(tmp_name), after_ns, after_ns_len);
- zend_add_literal_string(op_array, &tmp_name);
+ zend_add_literal_string(&tmp_name);
return ret;
}
@@ -612,7 +621,7 @@ static int zend_add_const_name_literal(zend_op_array *op_array, zend_string *nam
#define LITERAL_STR(op, str) do { \
zval _c; \
ZVAL_STR(&_c, str); \
- op.constant = zend_add_literal(CG(active_op_array), &_c); \
+ op.constant = zend_add_literal(&_c); \
} while (0)
void zend_stop_lexing(void)
@@ -624,31 +633,6 @@ void zend_stop_lexing(void)
LANG_SCNG(yy_cursor) = LANG_SCNG(yy_limit);
}
-static uint32_t zend_start_live_range(zend_op_array *op_array, uint32_t start) /* {{{ */
-{
- zend_live_range *range;
-
- op_array->last_live_range++;
- op_array->live_range = erealloc(op_array->live_range, sizeof(zend_live_range) * op_array->last_live_range);
- range = op_array->live_range + op_array->last_live_range - 1;
- range->start = start;
- return op_array->last_live_range - 1;
-}
-/* }}} */
-
-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;
-
- if (range->start == end && offset == (uint32_t)op_array->last_live_range - 1) {
- op_array->last_live_range--;
- } else {
- range->end = end;
- range->var = (var * sizeof(zval)) | kind;
- }
-}
-/* }}} */
-
static inline void zend_begin_loop(
zend_uchar free_opcode, const znode *loop_var, zend_bool is_switch) /* {{{ */
{
@@ -662,12 +646,11 @@ static inline void zend_begin_loop(
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));
+ uint32_t start = get_next_op_number();
info.opcode = free_opcode;
info.var_type = loop_var->op_type;
info.var_num = loop_var->u.op.var;
- info.u.live_range_offset = zend_start_live_range(CG(active_op_array), start);
brk_cont_element->start = start;
} else {
info.opcode = ZEND_NOP;
@@ -682,20 +665,13 @@ static inline void zend_begin_loop(
static inline void zend_end_loop(int cont_addr, const znode *var_node) /* {{{ */
{
- uint32_t end = get_next_op_number(CG(active_op_array));
+ uint32_t end = get_next_op_number();
zend_brk_cont_element *brk_cont_element
= &CG(context).brk_cont_array[CG(context).current_brk_cont];
brk_cont_element->cont = cont_addr;
brk_cont_element->brk = end;
CG(context).current_brk_cont = brk_cont_element->parent;
- if (brk_cont_element->start != -1) {
- zend_loop_var *loop_var = zend_stack_top(&CG(loop_var_stack));
- zend_end_live_range(CG(active_op_array), loop_var->u.live_range_offset, end,
- loop_var->opcode == ZEND_FE_FREE ? ZEND_LIVE_LOOP : ZEND_LIVE_TMPVAR,
- var_node->u.op.var);
- }
-
zend_stack_del_top(&CG(loop_var_stack));
}
/* }}} */
@@ -1024,7 +1000,16 @@ ZEND_API void function_add_ref(zend_function *function) /* {{{ */
GC_ADDREF(op_array->static_variables);
}
}
- op_array->run_time_cache = NULL;
+
+ if (CG(compiler_options) & ZEND_COMPILE_PRELOAD) {
+ ZEND_ASSERT(op_array->fn_flags & ZEND_ACC_PRELOADED);
+ ZEND_MAP_PTR_NEW(op_array->run_time_cache);
+ ZEND_MAP_PTR_NEW(op_array->static_variables_ptr);
+ } else {
+ ZEND_MAP_PTR_INIT(op_array->static_variables_ptr, &op_array->static_variables);
+ ZEND_MAP_PTR_INIT(op_array->run_time_cache, zend_arena_alloc(&CG(arena), sizeof(void*)));
+ ZEND_MAP_PTR_SET(op_array->run_time_cache, NULL);
+ }
} else if (function->type == ZEND_INTERNAL_FUNCTION) {
if (function->common.function_name) {
zend_string_addref(function->common.function_name);
@@ -1033,197 +1018,93 @@ 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) /* {{{ */
+static zend_never_inline ZEND_COLD ZEND_NORETURN void do_bind_function_error(zend_string *lcname, zend_op_array *op_array, zend_bool compile_time) /* {{{ */
{
- zend_function *function, *new_function;
- 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(opline, opline->op1);
- rtd_key = lcname + 1;
- }
+ zval *zv = zend_hash_find_ex(compile_time ? CG(function_table) : EG(function_table), lcname, 1);
+ int error_level = compile_time ? E_COMPILE_ERROR : E_ERROR;
+ zend_function *old_function;
- 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;
-
- 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),
- ZSTR_VAL(old_function->op_array.filename),
- old_function->op_array.opcodes[0].lineno);
- } else {
- zend_error_noreturn(error_level, "Cannot redeclare %s()", ZSTR_VAL(function->common.function_name));
- }
- return FAILURE;
+ 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)",
+ op_array ? ZSTR_VAL(op_array->function_name) : ZSTR_VAL(old_function->common.function_name),
+ ZSTR_VAL(old_function->op_array.filename),
+ old_function->op_array.opcodes[0].lineno);
} else {
- if (function->op_array.refcount) {
- (*function->op_array.refcount)++;
- }
- if (!(function->op_array.fn_flags & ZEND_ACC_IMMUTABLE)) {
- function->op_array.static_variables = NULL; /* NULL out the unbound function */
- }
- return SUCCESS;
+ zend_error_noreturn(error_level, "Cannot redeclare %s()",
+ op_array ? ZSTR_VAL(op_array->function_name) : ZSTR_VAL(old_function->common.function_name));
}
}
-/* }}} */
-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 int do_bind_function(zval *lcname) /* {{{ */
{
- zend_class_entry *ce;
- zval *lcname, *rtd_key, *zv;
+ zend_function *function;
+ zval *rtd_key, *zv;
- if (compile_time) {
- lcname = CT_CONSTANT_EX(op_array, opline->op1.constant);
- rtd_key = lcname + 1;
- } else {
- lcname = RT_CONSTANT(opline, opline->op1);
- rtd_key = lcname + 1;
+ rtd_key = lcname + 1;
+ zv = zend_hash_find_ex(EG(function_table), Z_STR_P(rtd_key), 1);
+ if (UNEXPECTED(!zv)) {
+ do_bind_function_error(Z_STR_P(lcname), NULL, 0);
+ return FAILURE;
}
- 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--;
- 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,
- * so we shut up about it. This allows the if (!defined('FOO')) { return; }
- * approach to work.
- */
- 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));
- }
- return NULL;
- } else {
- if (!(ce->ce_flags & (ZEND_ACC_INTERFACE|ZEND_ACC_IMPLEMENT_INTERFACES|ZEND_ACC_IMPLEMENT_TRAITS))) {
- zend_verify_abstract_class(ce);
- }
- return ce;
+ function = (zend_function*)Z_PTR_P(zv);
+ zv = zend_hash_set_bucket_key(EG(function_table), (Bucket*)zv, Z_STR_P(lcname));
+ if (UNEXPECTED(!zv)) {
+ do_bind_function_error(Z_STR_P(lcname), &function->op_array, 0);
+ return FAILURE;
}
+ return SUCCESS;
}
/* }}} */
-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 int do_bind_class(zval *lcname, zend_string *lc_parent_name) /* {{{ */
{
zend_class_entry *ce;
- zval *lcname, *rtd_key, *zv;
+ zval *rtd_key, *zv;
- if (compile_time) {
- lcname = CT_CONSTANT_EX(op_array, opline->op1.constant);
- rtd_key = lcname + 1;
- } else {
- lcname = RT_CONSTANT(opline, opline->op1);
- rtd_key = lcname + 1;
- }
+ rtd_key = lcname + 1;
- zv = zend_hash_find_ex(class_table, Z_STR_P(rtd_key), 1);
+ zv = zend_hash_find_ex(EG(class_table), Z_STR_P(rtd_key), 1);
- 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,
- * so we shut up about it. This allows the if (!defined('FOO')) { return; }
- * approach to work.
- */
- zend_error_noreturn(E_COMPILE_ERROR, "Cannot declare %s, because the name is already in use", zend_get_object_type(Z_OBJCE_P(lcname)));
+ if (UNEXPECTED(!zv)) {
+ ce = zend_hash_find_ptr(EG(class_table), Z_STR_P(lcname));
+ if (ce) {
+ 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));
+ return FAILURE;
+ } else {
+ do {
+ ZEND_ASSERT(EG(current_execute_data)->func->op_array.fn_flags & ZEND_ACC_PRELOADED);
+ if (zend_preload_autoload
+ && zend_preload_autoload(EG(current_execute_data)->func->op_array.filename) == SUCCESS) {
+ zv = zend_hash_find_ex(EG(class_table), Z_STR_P(rtd_key), 1);
+ if (EXPECTED(zv != NULL)) {
+ break;
+ }
+ }
+ zend_error_noreturn(E_ERROR, "Class %s wasn't preloaded", Z_STRVAL_P(lcname));
+ return FAILURE;
+ } while (0);
}
- 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));
- }
-
- zend_do_inheritance(ce, parent_ce);
-
- ce->refcount++;
-
/* Register the derived class */
- if (zend_hash_add_ptr(class_table, Z_STR_P(lcname), ce) == NULL) {
+ ce = (zend_class_entry*)Z_PTR_P(zv);
+ zv = zend_hash_set_bucket_key(EG(class_table), (Bucket*)zv, Z_STR_P(lcname));
+ if (UNEXPECTED(!zv)) {
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));
- }
- return ce;
-}
-/* }}} */
-
-void zend_do_early_binding(void) /* {{{ */
-{
- zend_op *opline = &CG(active_op_array)->opcodes[CG(active_op_array)->last-1];
- HashTable *table;
-
- while (opline->opcode == ZEND_TICKS && opline > CG(active_op_array)->opcodes) {
- opline--;
+ return FAILURE;
}
- switch (opline->opcode) {
- case ZEND_DECLARE_FUNCTION:
- if (do_bind_function(CG(active_op_array), opline, CG(function_table), 1) == FAILURE) {
- return;
- }
- table = CG(function_table);
- break;
- case ZEND_DECLARE_CLASS:
- if (do_bind_class(CG(active_op_array), opline, CG(class_table), 1) == NULL) {
- return;
- }
- table = CG(class_table);
- break;
- case ZEND_DECLARE_INHERITED_CLASS:
- {
- zval *parent_name;
- zend_class_entry *ce;
-
- 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) {
- 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;
- }
- return;
- }
- if (do_bind_inherited_class(CG(active_op_array), opline, CG(class_table), ce, 1) == NULL) {
- return;
- }
- 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;
- }
- case ZEND_VERIFY_ABSTRACT_CLASS:
- case ZEND_ADD_INTERFACE:
- case ZEND_ADD_TRAIT:
- case ZEND_BIND_TRAITS:
- /* We currently don't early-bind classes that implement interfaces */
- /* Classes with traits are handled exactly the same, no early-bind here */
- return;
- default:
- zend_error_noreturn(E_COMPILE_ERROR, "Invalid binding type");
- return;
+ if (zend_do_link_class(ce, lc_parent_name) == FAILURE) {
+ /* Reload bucket pointer, the hash table may have been reallocated */
+ zv = zend_hash_find(EG(class_table), Z_STR_P(lcname));
+ zend_hash_set_bucket_key(EG(class_table), (Bucket *) zv, Z_STR_P(rtd_key));
+ return FAILURE;
}
- zend_hash_del(table, Z_STR_P(CT_CONSTANT(opline->op1)+1));
- zend_del_literal(CG(active_op_array), opline->op1.constant+1);
- zend_del_literal(CG(active_op_array), opline->op1.constant);
- MAKE_NOP(opline);
+ return SUCCESS;
}
/* }}} */
@@ -1265,7 +1146,7 @@ ZEND_API uint32_t zend_build_delayed_early_binding_list(const zend_op_array *op_
zend_op *end = opline + op_array->last;
while (opline < end) {
- if (opline->opcode == ZEND_DECLARE_INHERITED_CLASS_DELAYED) {
+ if (opline->opcode == ZEND_DECLARE_CLASS_DELAYED) {
*prev_opline_num = opline - op_array->opcodes;
prev_opline_num = &opline->result.opline_num;
}
@@ -1278,19 +1159,42 @@ ZEND_API uint32_t zend_build_delayed_early_binding_list(const zend_op_array *op_
}
/* }}} */
-ZEND_API void zend_do_delayed_early_binding(const zend_op_array *op_array, uint32_t first_early_binding_opline) /* {{{ */
+ZEND_API void zend_do_delayed_early_binding(zend_op_array *op_array, uint32_t first_early_binding_opline) /* {{{ */
{
if (first_early_binding_opline != (uint32_t)-1) {
zend_bool orig_in_compilation = CG(in_compilation);
uint32_t opline_num = first_early_binding_opline;
- zend_class_entry *ce;
+ void **run_time_cache;
+
+ if (!ZEND_MAP_PTR(op_array->run_time_cache)) {
+ void *ptr;
+
+ ZEND_ASSERT(op_array->fn_flags & ZEND_ACC_HEAP_RT_CACHE);
+ ptr = emalloc(op_array->cache_size + sizeof(void*));
+ ZEND_MAP_PTR_INIT(op_array->run_time_cache, ptr);
+ ptr = (char*)ptr + sizeof(void*);
+ ZEND_MAP_PTR_SET(op_array->run_time_cache, ptr);
+ memset(ptr, 0, op_array->cache_size);
+ }
+ run_time_cache = RUN_TIME_CACHE(op_array);
CG(in_compilation) = 1;
while (opline_num != (uint32_t)-1) {
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);
+ zval *lcname = RT_CONSTANT(opline, opline->op1);
+ zval *zv = zend_hash_find_ex(EG(class_table), Z_STR_P(lcname + 1), 1);
+
+ if (zv) {
+ zend_class_entry *ce = Z_CE_P(zv);
+ zend_string *lc_parent_name = Z_STR_P(RT_CONSTANT(opline, opline->op2));
+ zend_class_entry *parent_ce = zend_hash_find_ex_ptr(EG(class_table), lc_parent_name, 1);
+
+ if (parent_ce) {
+ if (zend_try_early_bind(ce, parent_ce, Z_STR_P(lcname), zv)) {
+ /* Store in run-time cache */
+ ((void**)((char*)run_time_cache + opline->extended_value))[0] = ce;
+ }
+ }
}
opline_num = op_array->opcodes[opline_num].result.opline_num;
}
@@ -1469,30 +1373,27 @@ static uint32_t zend_get_class_fetch_type_ast(zend_ast *name_ast) /* {{{ */
static void zend_ensure_valid_class_fetch_type(uint32_t fetch_type) /* {{{ */
{
- if (fetch_type != ZEND_FETCH_CLASS_DEFAULT && !CG(active_class_entry) && zend_is_scope_known()) {
- zend_error_noreturn(E_COMPILE_ERROR, "Cannot use \"%s\" when no class scope is active",
- fetch_type == ZEND_FETCH_CLASS_SELF ? "self" :
- fetch_type == ZEND_FETCH_CLASS_PARENT ? "parent" : "static");
+ if (fetch_type != ZEND_FETCH_CLASS_DEFAULT && zend_is_scope_known()) {
+ zend_class_entry *ce = CG(active_class_entry);
+ if (!ce) {
+ zend_error_noreturn(E_COMPILE_ERROR, "Cannot use \"%s\" when no class scope is active",
+ fetch_type == ZEND_FETCH_CLASS_SELF ? "self" :
+ fetch_type == ZEND_FETCH_CLASS_PARENT ? "parent" : "static");
+ } else if (fetch_type == ZEND_FETCH_CLASS_PARENT && !ce->parent_name) {
+ zend_error(E_DEPRECATED,
+ "Cannot use \"parent\" when current class scope has no parent");
+ }
}
}
/* }}} */
-static zend_bool zend_try_compile_const_expr_resolve_class_name(zval *zv, zend_ast *class_ast, zend_ast *name_ast, zend_bool constant) /* {{{ */
+static zend_bool zend_try_compile_const_expr_resolve_class_name(zval *zv, zend_ast *class_ast) /* {{{ */
{
uint32_t fetch_type;
zval *class_name;
- if (name_ast->kind != ZEND_AST_ZVAL) {
- return 0;
- }
-
- if (!zend_string_equals_literal_ci(zend_ast_get_str(name_ast), "class")) {
- return 0;
- }
-
if (class_ast->kind != ZEND_AST_ZVAL) {
- zend_error_noreturn(E_COMPILE_ERROR,
- "Dynamic class names are not allowed in compile-time ::class fetch");
+ zend_error_noreturn(E_COMPILE_ERROR, "Cannot use ::class with dynamic class name");
}
class_name = zend_ast_get_zval(class_ast);
@@ -1508,21 +1409,18 @@ static zend_bool zend_try_compile_const_expr_resolve_class_name(zval *zv, zend_a
case ZEND_FETCH_CLASS_SELF:
if (CG(active_class_entry) && zend_is_scope_known()) {
ZVAL_STR_COPY(zv, CG(active_class_entry)->name);
- } else {
- ZVAL_NULL(zv);
+ return 1;
}
- return 1;
- case ZEND_FETCH_CLASS_STATIC:
+ return 0;
case ZEND_FETCH_CLASS_PARENT:
- if (constant) {
- zend_error_noreturn(E_COMPILE_ERROR,
- "%s::class cannot be used for compile-time class name resolution",
- fetch_type == ZEND_FETCH_CLASS_STATIC ? "static" : "parent"
- );
- } else {
- ZVAL_NULL(zv);
+ if (CG(active_class_entry) && CG(active_class_entry)->parent_name
+ && zend_is_scope_known()) {
+ ZVAL_STR_COPY(zv, CG(active_class_entry)->parent_name);
+ return 1;
}
- return 1;
+ return 0;
+ case ZEND_FETCH_CLASS_STATIC:
+ return 0;
case ZEND_FETCH_CLASS_DEFAULT:
ZVAL_STR(zv, zend_resolve_class_name_ast(class_ast));
return 1;
@@ -1531,6 +1429,36 @@ static zend_bool zend_try_compile_const_expr_resolve_class_name(zval *zv, zend_a
}
/* }}} */
+/* We don't use zend_verify_const_access because we need to deal with unlinked classes. */
+static zend_bool zend_verify_ct_const_access(zend_class_constant *c, zend_class_entry *scope)
+{
+ if (Z_ACCESS_FLAGS(c->value) & ZEND_ACC_PUBLIC) {
+ return 1;
+ } else if (Z_ACCESS_FLAGS(c->value) & ZEND_ACC_PRIVATE) {
+ return c->ce == scope;
+ } else {
+ zend_class_entry *ce = c->ce;
+ while (1) {
+ if (ce == scope) {
+ return 1;
+ }
+ if (!ce->parent) {
+ break;
+ }
+ if (ce->ce_flags & ZEND_ACC_RESOLVED_PARENT) {
+ ce = ce->parent;
+ } else {
+ ce = zend_hash_find_ptr_lc(CG(class_table), ZSTR_VAL(ce->parent_name), ZSTR_LEN(ce->parent_name));
+ if (!ce) {
+ break;
+ }
+ }
+ }
+ /* Reverse case cannot be true during compilation */
+ return 0;
+ }
+}
+
static zend_bool zend_try_ct_eval_class_const(zval *zv, zend_string *class_name, zend_string *name) /* {{{ */
{
uint32_t fetch_type = zend_get_class_fetch_type(class_name);
@@ -1554,7 +1482,7 @@ static zend_bool zend_try_ct_eval_class_const(zval *zv, zend_string *class_name,
return 0;
}
- if (!cc || !zend_verify_const_access(cc, CG(active_class_entry))) {
+ if (!cc || !zend_verify_ct_const_access(cc, CG(active_class_entry))) {
return 0;
}
@@ -1590,15 +1518,15 @@ static void zend_add_to_list(void *result, void *item) /* {{{ */
}
/* }}} */
-void zend_do_extended_info(void) /* {{{ */
+void zend_do_extended_stmt(void) /* {{{ */
{
zend_op *opline;
- if (!(CG(compiler_options) & ZEND_COMPILE_EXTENDED_INFO)) {
+ if (!(CG(compiler_options) & ZEND_COMPILE_EXTENDED_STMT)) {
return;
}
- opline = get_next_op(CG(active_op_array));
+ opline = get_next_op();
opline->opcode = ZEND_EXT_STMT;
}
@@ -1608,11 +1536,11 @@ void zend_do_extended_fcall_begin(void) /* {{{ */
{
zend_op *opline;
- if (!(CG(compiler_options) & ZEND_COMPILE_EXTENDED_INFO)) {
+ if (!(CG(compiler_options) & ZEND_COMPILE_EXTENDED_FCALL)) {
return;
}
- opline = get_next_op(CG(active_op_array));
+ opline = get_next_op();
opline->opcode = ZEND_EXT_FCALL_BEGIN;
}
@@ -1622,11 +1550,11 @@ void zend_do_extended_fcall_end(void) /* {{{ */
{
zend_op *opline;
- if (!(CG(compiler_options) & ZEND_COMPILE_EXTENDED_INFO)) {
+ if (!(CG(compiler_options) & ZEND_COMPILE_EXTENDED_FCALL)) {
return;
}
- opline = get_next_op(CG(active_op_array));
+ opline = get_next_op();
opline->opcode = ZEND_EXT_FCALL_END;
}
@@ -1709,7 +1637,7 @@ int ZEND_FASTCALL zendlex(zend_parser_stack_elem *elem) /* {{{ */
ZEND_API void zend_initialize_class_data(zend_class_entry *ce, zend_bool nullify_handlers) /* {{{ */
{
- zend_bool persistent_hashes = (ce->type == ZEND_INTERNAL_CLASS) ? 1 : 0;
+ zend_bool persistent_hashes = ce->type == ZEND_INTERNAL_CLASS;
ce->refcount = 1;
ce->ce_flags = ZEND_ACC_CONSTANTS_UPDATED;
@@ -1725,26 +1653,15 @@ ZEND_API void zend_initialize_class_data(zend_class_entry *ce, zend_bool nullify
zend_hash_init_ex(&ce->function_table, 8, NULL, ZEND_FUNCTION_DTOR, persistent_hashes, 0);
if (ce->type == ZEND_INTERNAL_CLASS) {
-#ifdef ZTS
- int n = zend_hash_num_elements(CG(class_table));
-
- if (CG(static_members_table) && n >= CG(last_static_member)) {
- /* Support for run-time declaration: dl() */
- CG(last_static_member) = n+1;
- CG(static_members_table) = realloc(CG(static_members_table), (n+1)*sizeof(zval*));
- CG(static_members_table)[n] = NULL;
- }
- ce->static_members_table = (zval*)(zend_intptr_t)n;
-#else
- ce->static_members_table = NULL;
-#endif
+ ZEND_MAP_PTR_INIT(ce->static_members_table, NULL);
} else {
- ce->static_members_table = ce->default_static_members_table;
+ ZEND_MAP_PTR_INIT(ce->static_members_table, &ce->default_static_members_table);
ce->info.user.doc_comment = NULL;
}
ce->default_properties_count = 0;
ce->default_static_members_count = 0;
+ ce->properties_info_table = NULL;
if (nullify_handlers) {
ce->constructor = NULL;
@@ -1762,10 +1679,11 @@ ZEND_API void zend_initialize_class_data(zend_class_entry *ce, zend_bool nullify
ce->iterator_funcs_ptr = NULL;
ce->get_static_method = NULL;
ce->parent = NULL;
+ ce->parent_name = NULL;
ce->num_interfaces = 0;
ce->interfaces = NULL;
ce->num_traits = 0;
- ce->traits = NULL;
+ ce->trait_names = NULL;
ce->trait_aliases = NULL;
ce->trait_precedences = NULL;
ce->serialize = NULL;
@@ -1939,7 +1857,7 @@ static void zend_adjust_for_fetch_type(zend_op *opline, znode *result, uint32_t
static inline void zend_make_var_result(znode *result, zend_op *opline) /* {{{ */
{
opline->result_type = IS_VAR;
- opline->result.var = get_temporary_variable(CG(active_op_array));
+ opline->result.var = get_temporary_variable();
GET_NODE(result, opline->result);
}
/* }}} */
@@ -1947,174 +1865,14 @@ static inline void zend_make_var_result(znode *result, zend_op *opline) /* {{{ *
static inline void zend_make_tmp_result(znode *result, zend_op *opline) /* {{{ */
{
opline->result_type = IS_TMP_VAR;
- opline->result.var = get_temporary_variable(CG(active_op_array));
+ opline->result.var = get_temporary_variable();
GET_NODE(result, opline->result);
}
/* }}} */
-static void zend_find_live_range(zend_op *opline, zend_uchar type, uint32_t var) /* {{{ */
-{
- zend_op *def = opline;
-
- while (def != CG(active_op_array)->opcodes) {
- def--;
- if (def->result_type == type && def->result.var == var) {
- if (def->opcode == ZEND_ADD_ARRAY_ELEMENT ||
- def->opcode == ZEND_ROPE_ADD) {
- /* not a real definition */
- continue;
- } else if (def->opcode == ZEND_JMPZ_EX ||
- def->opcode == ZEND_JMPNZ_EX ||
- def->opcode == ZEND_BOOL ||
- def->opcode == ZEND_BOOL_NOT) {
- /* result IS_BOOL, it does't have to be destroyed */
- break;
- } else if (def->opcode == ZEND_DECLARE_CLASS ||
- def->opcode == ZEND_DECLARE_INHERITED_CLASS ||
- def->opcode == ZEND_DECLARE_INHERITED_CLASS_DELAYED ||
- def->opcode == ZEND_DECLARE_ANON_CLASS ||
- def->opcode == ZEND_DECLARE_ANON_INHERITED_CLASS) {
- /* classes don't have to be destroyed */
- break;
- } else if (def->opcode == ZEND_FAST_CALL) {
- /* fast_calls don't have to be destroyed */
- break;
- } else if (def->opcode == ZEND_NEW) {
- /* Objects created via ZEND_NEW are only fully initialized
- * after the DO_FCALL (constructor call) */
- 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(CG(active_op_array),
- def + 1 - CG(active_op_array)->opcodes),
- opline - CG(active_op_array)->opcodes,
- ZEND_LIVE_TMPVAR, var);
- break;
- }
- }
-}
-/* }}} */
-
-static zend_always_inline int zend_is_def_range(zend_op *opline, zend_uchar type, uint32_t var) /* {{{ */
-{
- while (1) {
- if (opline->result_type == type && opline->result.var == var) {
- return opline->opcode != ZEND_ADD_ARRAY_ELEMENT &&
- opline->opcode != ZEND_ROPE_ADD;
- } else if (opline->opcode == ZEND_OP_DATA) {
- return (opline-1)->result_type == type &&
- (opline-1)->result.var == var;
- } else if (opline->opcode == ZEND_END_SILENCE ||
- opline->opcode == ZEND_NOP ||
- opline->opcode == ZEND_EXT_NOP ||
- opline->opcode == ZEND_EXT_STMT ||
- opline->opcode == ZEND_EXT_FCALL_BEGIN ||
- opline->opcode == ZEND_EXT_FCALL_END ||
- opline->opcode == ZEND_TICKS) {
- opline--;
- } else {
- return 0;
- }
- }
-}
-/* }}} */
-
-static void zend_check_live_ranges(zend_op *opline) /* {{{ */
-{
- if ((opline->op1_type & (IS_VAR|IS_TMP_VAR)) &&
- !zend_is_def_range(opline - 1, opline->op1_type, opline->op1.var)) {
-
- if (opline->opcode == ZEND_OP_DATA) {
- if (!zend_is_def_range(opline - 2, opline->op1_type, opline->op1.var)) {
- zend_find_live_range(opline - 1, opline->op1_type, opline->op1.var);
- }
- } else if (opline->opcode == ZEND_INIT_STATIC_METHOD_CALL ||
- opline->opcode == ZEND_NEW ||
- opline->opcode == ZEND_FETCH_CLASS_CONSTANT ||
- opline->opcode == ZEND_ADD_INTERFACE ||
- opline->opcode == ZEND_ADD_TRAIT ||
- opline->opcode == ZEND_BIND_TRAITS ||
- opline->opcode == ZEND_VERIFY_ABSTRACT_CLASS) {
- /* classes don't have to be destroyed */
- } else if (opline->opcode == ZEND_FAST_RET) {
- /* fast_calls don't have to be destroyed */
- } else if (opline->opcode == ZEND_CASE ||
- opline->opcode == ZEND_SWITCH_LONG ||
- opline->opcode == ZEND_SWITCH_STRING ||
- opline->opcode == ZEND_FE_FETCH_R ||
- opline->opcode == ZEND_FE_FETCH_RW ||
- opline->opcode == ZEND_FE_FREE ||
- opline->opcode == ZEND_ROPE_ADD ||
- opline->opcode == ZEND_ROPE_END ||
- opline->opcode == ZEND_END_SILENCE ||
- 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 */
- } else {
- zend_find_live_range(opline, opline->op1_type, opline->op1.var);
- }
- }
-
- if ((opline->op2_type & (IS_VAR|IS_TMP_VAR)) &&
- !zend_is_def_range(opline - 1, opline->op2_type, opline->op2.var)) {
-
- if (opline->opcode == ZEND_OP_DATA) {
- if (!zend_is_def_range(opline - 2, opline->op2_type, opline->op2.var)) {
- zend_find_live_range(opline-1, opline->op2_type, opline->op2.var);
- }
- } else if (opline->opcode == ZEND_FETCH_STATIC_PROP_R ||
- opline->opcode == ZEND_FETCH_STATIC_PROP_W ||
- opline->opcode == ZEND_FETCH_STATIC_PROP_RW ||
- opline->opcode == ZEND_FETCH_STATIC_PROP_IS ||
- opline->opcode == ZEND_FETCH_STATIC_PROP_FUNC_ARG ||
- opline->opcode == ZEND_FETCH_STATIC_PROP_UNSET ||
- opline->opcode == ZEND_UNSET_STATIC_PROP ||
- opline->opcode == ZEND_ISSET_ISEMPTY_STATIC_PROP ||
- opline->opcode == ZEND_INSTANCEOF) {
- /* classes don't have to be destroyed */
- } else {
- zend_find_live_range(opline, opline->op2_type, opline->op2.var);
- }
- }
-}
-/* }}} */
-
static zend_op *zend_emit_op(znode *result, zend_uchar opcode, znode *op1, znode *op2) /* {{{ */
{
- zend_op *opline = get_next_op(CG(active_op_array));
+ zend_op *opline = get_next_op();
opline->opcode = opcode;
if (op1 != NULL) {
@@ -2125,8 +1883,6 @@ static zend_op *zend_emit_op(znode *result, zend_uchar opcode, znode *op1, znode
SET_NODE(opline->op2, op2);
}
- zend_check_live_ranges(opline);
-
if (result) {
zend_make_var_result(result, opline);
}
@@ -2136,7 +1892,7 @@ static zend_op *zend_emit_op(znode *result, zend_uchar opcode, znode *op1, znode
static zend_op *zend_emit_op_tmp(znode *result, zend_uchar opcode, znode *op1, znode *op2) /* {{{ */
{
- zend_op *opline = get_next_op(CG(active_op_array));
+ zend_op *opline = get_next_op();
opline->opcode = opcode;
if (op1 != NULL) {
@@ -2147,8 +1903,6 @@ static zend_op *zend_emit_op_tmp(znode *result, zend_uchar opcode, znode *op1, z
SET_NODE(opline->op2, op2);
}
- zend_check_live_ranges(opline);
-
if (result) {
zend_make_tmp_result(result, opline);
}
@@ -2166,7 +1920,7 @@ static void zend_emit_tick(void) /* {{{ */
return;
}
- opline = get_next_op(CG(active_op_array));
+ opline = get_next_op();
opline->opcode = ZEND_TICKS;
opline->extended_value = FC(declarables).ticks;
@@ -2181,7 +1935,7 @@ static inline zend_op *zend_emit_op_data(znode *value) /* {{{ */
static inline uint32_t zend_emit_jump(uint32_t opnum_target) /* {{{ */
{
- uint32_t opnum = get_next_op_number(CG(active_op_array));
+ uint32_t opnum = get_next_op_number();
zend_op *opline = zend_emit_op(NULL, ZEND_JMP, NULL, NULL);
opline->op1.opline_num = opnum_target;
return opnum;
@@ -2207,6 +1961,7 @@ ZEND_API int zend_is_smart_branch(zend_op *opline) /* {{{ */
case ZEND_TYPE_CHECK:
case ZEND_DEFINED:
case ZEND_IN_ARRAY:
+ case ZEND_ARRAY_KEY_EXISTS:
return 1;
default:
return 0;
@@ -2216,7 +1971,7 @@ ZEND_API int zend_is_smart_branch(zend_op *opline) /* {{{ */
static inline uint32_t zend_emit_cond_jump(zend_uchar opcode, znode *cond, uint32_t opnum_target) /* {{{ */
{
- uint32_t opnum = get_next_op_number(CG(active_op_array));
+ uint32_t opnum = get_next_op_number();
zend_op *opline;
if ((cond->op_type & (IS_CV|IS_CONST))
@@ -2224,7 +1979,7 @@ static inline uint32_t zend_emit_cond_jump(zend_uchar opcode, znode *cond, uint3
&& zend_is_smart_branch(CG(active_op_array)->opcodes + opnum - 1)) {
/* emit extra NOP to avoid incorrect SMART_BRANCH in very rare cases */
zend_emit_op(NULL, ZEND_NOP, NULL, NULL);
- opnum = get_next_op_number(CG(active_op_array));
+ opnum = get_next_op_number();
}
opline = zend_emit_op(NULL, opcode, cond, NULL);
opline->op2.opline_num = opnum_target;
@@ -2244,6 +1999,7 @@ static inline void zend_update_jump_target(uint32_t opnum_jump, uint32_t opnum_t
case ZEND_JMPZ_EX:
case ZEND_JMPNZ_EX:
case ZEND_JMP_SET:
+ case ZEND_COALESCE:
opline->op2.opline_num = opnum_target;
break;
EMPTY_SWITCH_DEFAULT_CASE()
@@ -2253,7 +2009,7 @@ static inline void zend_update_jump_target(uint32_t opnum_jump, uint32_t opnum_t
static inline void zend_update_jump_target_to_next(uint32_t opnum_jump) /* {{{ */
{
- zend_update_jump_target(opnum_jump, get_next_op_number(CG(active_op_array)));
+ zend_update_jump_target(opnum_jump, get_next_op_number());
}
/* }}} */
@@ -2292,15 +2048,54 @@ static zend_op *zend_delayed_compile_end(uint32_t offset) /* {{{ */
ZEND_ASSERT(count >= offset);
for (i = offset; i < count; ++i) {
- opline = get_next_op(CG(active_op_array));
+ opline = get_next_op();
memcpy(opline, &oplines[i], sizeof(zend_op));
- zend_check_live_ranges(opline);
}
CG(delayed_oplines_stack).top = offset;
return opline;
}
/* }}} */
+#define ZEND_MEMOIZE_NONE 0
+#define ZEND_MEMOIZE_COMPILE 1
+#define ZEND_MEMOIZE_FETCH 2
+
+static void zend_compile_memoized_expr(znode *result, zend_ast *expr) /* {{{ */
+{
+ int memoize_mode = CG(memoize_mode);
+ if (memoize_mode == ZEND_MEMOIZE_COMPILE) {
+ znode memoized_result;
+
+ /* Go through normal compilation */
+ CG(memoize_mode) = ZEND_MEMOIZE_NONE;
+ zend_compile_expr(result, expr);
+ CG(memoize_mode) = ZEND_MEMOIZE_COMPILE;
+
+ if (result->op_type == IS_VAR) {
+ zend_emit_op(&memoized_result, ZEND_COPY_TMP, result, NULL);
+ } else if (result->op_type == IS_TMP_VAR) {
+ zend_emit_op_tmp(&memoized_result, ZEND_COPY_TMP, result, NULL);
+ } else {
+ if (result->op_type == IS_CONST) {
+ Z_TRY_ADDREF(result->u.constant);
+ }
+ memoized_result = *result;
+ }
+
+ zend_hash_index_update_mem(
+ CG(memoized_exprs), (uintptr_t) expr, &memoized_result, sizeof(znode));
+ } else if (memoize_mode == ZEND_MEMOIZE_FETCH) {
+ znode *memoized_result = zend_hash_index_find_ptr(CG(memoized_exprs), (uintptr_t) expr);
+ *result = *memoized_result;
+ if (result->op_type == IS_CONST) {
+ Z_TRY_ADDREF(result->u.constant);
+ }
+ } else {
+ ZEND_ASSERT(0);
+ }
+}
+/* }}} */
+
static void zend_emit_return_type_check(
znode *expr, zend_arg_info *return_info, zend_bool implicit) /* {{{ */
{
@@ -2348,7 +2143,7 @@ static void zend_emit_return_type_check(
opline = zend_emit_op(NULL, ZEND_VERIFY_RETURN_TYPE, expr, NULL);
if (expr && expr->op_type == IS_CONST) {
opline->result_type = expr->op_type = IS_TMP_VAR;
- opline->result.var = expr->u.op.var = get_temporary_variable(CG(active_op_array));
+ opline->result.var = expr->u.op.var = get_temporary_variable();
}
if (ZEND_TYPE_IS_CLASS(return_info->type)) {
opline->op2.num = CG(active_op_array)->cache_size;
@@ -2386,9 +2181,7 @@ void zend_emit_final_return(int return_one) /* {{{ */
static inline zend_bool zend_is_variable(zend_ast *ast) /* {{{ */
{
return ast->kind == ZEND_AST_VAR || ast->kind == ZEND_AST_DIM
- || ast->kind == ZEND_AST_PROP || ast->kind == ZEND_AST_STATIC_PROP
- || ast->kind == ZEND_AST_CALL || ast->kind == ZEND_AST_METHOD_CALL
- || ast->kind == ZEND_AST_STATIC_CALL;
+ || ast->kind == ZEND_AST_PROP || ast->kind == ZEND_AST_STATIC_PROP;
}
/* }}} */
@@ -2400,6 +2193,12 @@ static inline zend_bool zend_is_call(zend_ast *ast) /* {{{ */
}
/* }}} */
+static inline zend_bool zend_is_variable_or_call(zend_ast *ast) /* {{{ */
+{
+ return zend_is_variable(ast) || zend_is_call(ast);
+}
+/* }}} */
+
static inline zend_bool zend_is_unticked_stmt(zend_ast *ast) /* {{{ */
{
return ast->kind == ZEND_AST_STMT_LIST || ast->kind == ZEND_AST_LABEL
@@ -2414,7 +2213,7 @@ static inline zend_bool zend_can_write_to_variable(zend_ast *ast) /* {{{ */
ast = ast->child[0];
}
- return zend_is_variable(ast);
+ return zend_is_variable_or_call(ast);
}
/* }}} */
@@ -2447,10 +2246,10 @@ static inline void zend_handle_numeric_dim(zend_op *opline, znode *dim_node) /*
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
+ /* For numeric indexes 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);
+ int c = zend_add_literal(&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;
@@ -2465,14 +2264,14 @@ static inline void zend_set_class_name_op1(zend_op *opline, znode *class_node) /
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));
+ Z_STR(class_node->u.constant));
} else {
SET_NODE(opline->op1, class_node);
}
}
/* }}} */
-static void zend_compile_class_ref_ex(znode *result, zend_ast *name_ast, uint32_t fetch_flags) /* {{{ */
+static void zend_compile_class_ref(znode *result, zend_ast *name_ast, uint32_t fetch_flags) /* {{{ */
{
uint32_t fetch_type;
@@ -2545,7 +2344,7 @@ static int zend_try_compile_cv(znode *result, zend_ast *ast) /* {{{ */
}
result->op_type = IS_CV;
- result->u.op.var = lookup_cv(CG(active_op_array), name);
+ result->u.op.var = lookup_cv(name);
if (UNEXPECTED(Z_TYPE_P(zv) != IS_STRING)) {
zend_string_release_ex(name, 0);
@@ -2599,7 +2398,7 @@ static zend_bool is_this_fetch(zend_ast *ast) /* {{{ */
}
/* }}} */
-static void zend_compile_simple_var(znode *result, zend_ast *ast, uint32_t type, int delayed) /* {{{ */
+static zend_op *zend_compile_simple_var(znode *result, zend_ast *ast, uint32_t type, int delayed) /* {{{ */
{
if (is_this_fetch(ast)) {
zend_op *opline = zend_emit_op(result, ZEND_FETCH_THIS, NULL, NULL);
@@ -2607,9 +2406,12 @@ static void zend_compile_simple_var(znode *result, zend_ast *ast, uint32_t type,
opline->result_type = IS_TMP_VAR;
result->op_type = IS_TMP_VAR;
}
+ CG(active_op_array)->fn_flags |= ZEND_ACC_USES_THIS;
+ return opline;
} else if (zend_try_compile_cv(result, ast) == FAILURE) {
- zend_compile_simple_var_no_cv(result, ast, type, delayed);
+ return zend_compile_simple_var_no_cv(result, ast, type, delayed);
}
+ return NULL;
}
/* }}} */
@@ -2627,7 +2429,7 @@ static void zend_separate_if_call_and_write(znode *node, zend_ast *ast, uint32_t
}
/* }}} */
-void zend_delayed_compile_var(znode *result, zend_ast *ast, uint32_t type);
+zend_op *zend_delayed_compile_var(znode *result, zend_ast *ast, uint32_t type, zend_bool by_ref);
void zend_compile_assign(znode *result, zend_ast *ast);
static inline void zend_emit_assign_znode(zend_ast *var_ast, znode *value_node) /* {{{ */
@@ -2642,13 +2444,21 @@ static inline void zend_emit_assign_znode(zend_ast *var_ast, znode *value_node)
static zend_op *zend_delayed_compile_dim(znode *result, zend_ast *ast, uint32_t type) /* {{{ */
{
+ if (ast->attr == ZEND_DIM_ALTERNATIVE_SYNTAX) {
+ zend_error(E_DEPRECATED, "Array and string offset access syntax with curly braces is deprecated");
+ }
+
zend_ast *var_ast = ast->child[0];
zend_ast *dim_ast = ast->child[1];
zend_op *opline;
znode var_node, dim_node;
- zend_delayed_compile_var(&var_node, var_ast, type);
+ opline = zend_delayed_compile_var(&var_node, var_ast, type, 0);
+ if (opline && type == BP_VAR_W && (opline->opcode == ZEND_FETCH_STATIC_PROP_W || opline->opcode == ZEND_FETCH_OBJ_W)) {
+ opline->extended_value |= ZEND_FETCH_DIM_WRITE;
+ }
+
zend_separate_if_call_and_write(&var_node, var_ast, type);
if (dim_ast == NULL) {
@@ -2691,8 +2501,13 @@ static zend_op *zend_delayed_compile_prop(znode *result, zend_ast *ast, uint32_t
if (is_this_fetch(obj_ast)) {
obj_node.op_type = IS_UNUSED;
+ CG(active_op_array)->fn_flags |= ZEND_ACC_USES_THIS;
} else {
- zend_delayed_compile_var(&obj_node, obj_ast, type);
+ opline = zend_delayed_compile_var(&obj_node, obj_ast, type, 0);
+ if (opline && type == BP_VAR_W && (opline->opcode == ZEND_FETCH_STATIC_PROP_W || opline->opcode == ZEND_FETCH_OBJ_W)) {
+ opline->extended_value |= ZEND_FETCH_OBJ_WRITE;
+ }
+
zend_separate_if_call_and_write(&obj_node, obj_ast, type);
}
zend_compile_expr(&prop_node, prop_ast);
@@ -2700,7 +2515,7 @@ static zend_op *zend_delayed_compile_prop(znode *result, zend_ast *ast, uint32_t
opline = zend_delayed_emit_op(result, ZEND_FETCH_OBJ_R, &obj_node, &prop_node);
if (opline->op2_type == IS_CONST) {
convert_to_string(CT_CONSTANT(opline->op2));
- opline->extended_value = zend_alloc_polymorphic_cache_slot();
+ opline->extended_value = zend_alloc_cache_slots(3);
}
zend_adjust_for_fetch_type(opline, result, type);
@@ -2708,15 +2523,18 @@ static zend_op *zend_delayed_compile_prop(znode *result, zend_ast *ast, uint32_t
}
/* }}} */
-static zend_op *zend_compile_prop(znode *result, zend_ast *ast, uint32_t type) /* {{{ */
+static zend_op *zend_compile_prop(znode *result, zend_ast *ast, uint32_t type, int by_ref) /* {{{ */
{
uint32_t offset = zend_delayed_compile_begin();
- zend_delayed_compile_prop(result, ast, type);
+ zend_op *opline = zend_delayed_compile_prop(result, ast, type);
+ if (by_ref) { /* shared with cache_slot */
+ opline->extended_value |= ZEND_FETCH_REF;
+ }
return zend_delayed_compile_end(offset);
}
/* }}} */
-zend_op *zend_compile_static_prop(znode *result, zend_ast *ast, uint32_t type, int delayed) /* {{{ */
+zend_op *zend_compile_static_prop(znode *result, zend_ast *ast, uint32_t type, int by_ref, int delayed) /* {{{ */
{
zend_ast *class_ast = ast->child[0];
zend_ast *prop_ast = ast->child[1];
@@ -2724,7 +2542,7 @@ zend_op *zend_compile_static_prop(znode *result, zend_ast *ast, uint32_t type, i
znode class_node, prop_node;
zend_op *opline;
- zend_compile_class_ref_ex(&class_node, class_ast, ZEND_FETCH_CLASS_EXCEPTION);
+ zend_compile_class_ref(&class_node, class_ast, ZEND_FETCH_CLASS_EXCEPTION);
zend_compile_expr(&prop_node, prop_ast);
@@ -2735,12 +2553,12 @@ zend_op *zend_compile_static_prop(znode *result, zend_ast *ast, uint32_t type, i
}
if (opline->op1_type == IS_CONST) {
convert_to_string(CT_CONSTANT(opline->op1));
- opline->extended_value = zend_alloc_polymorphic_cache_slot();
+ opline->extended_value = zend_alloc_cache_slots(3);
}
if (class_node.op_type == IS_CONST) {
opline->op2_type = IS_CONST;
opline->op2.constant = zend_add_class_name_literal(
- CG(active_op_array), Z_STR(class_node.u.constant));
+ Z_STR(class_node.u.constant));
if (opline->op1_type != IS_CONST) {
opline->extended_value = zend_alloc_cache_slot();
}
@@ -2748,6 +2566,10 @@ zend_op *zend_compile_static_prop(znode *result, zend_ast *ast, uint32_t type, i
SET_NODE(opline->op2, &class_node);
}
+ if (by_ref && (type == BP_VAR_W || type == BP_VAR_FUNC_ARG)) { /* shared with cache_slot */
+ opline->extended_value |= ZEND_FETCH_REF;
+ }
+
zend_adjust_for_fetch_type(opline, result, type);
return opline;
}
@@ -2819,6 +2641,11 @@ static void zend_compile_list_assign(
}
}
+ if (elem_ast->kind == ZEND_AST_UNPACK) {
+ zend_error(E_COMPILE_ERROR,
+ "Spread operator is not supported in assignments");
+ }
+
var_ast = elem_ast->child[0];
key_ast = elem_ast->child[1];
has_elems = 1;
@@ -2914,53 +2741,6 @@ zend_bool zend_is_assign_to_self(zend_ast *var_ast, zend_ast *expr_ast) /* {{{ *
}
/* }}} */
-/* Detects if list($a, $b, $c) contains variable with given name */
-zend_bool zend_list_has_assign_to(zend_ast *list_ast, zend_string *name) /* {{{ */
-{
- zend_ast_list *list = zend_ast_get_list(list_ast);
- uint32_t i;
- for (i = 0; i < list->children; i++) {
- zend_ast *elem_ast = list->child[i];
- zend_ast *var_ast;
-
- if (!elem_ast) {
- continue;
- }
- var_ast = elem_ast->child[0];
-
- /* Recursively check nested list()s */
- if (var_ast->kind == ZEND_AST_ARRAY && zend_list_has_assign_to(var_ast, name)) {
- return 1;
- }
-
- 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_ex(var_name, 0);
- if (result) {
- return 1;
- }
- }
- }
-
- return 0;
-}
-/* }}} */
-
-/* Detects patterns like list($a, $b, $c) = $a */
-zend_bool zend_list_has_assign_to_self(zend_ast *list_ast, zend_ast *expr_ast) /* {{{ */
-{
- /* Only check simple variables on the RHS, as only CVs cause issues with this. */
- 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_ex(name, 0);
- return result;
- }
- return 0;
-}
-/* }}} */
-
void zend_compile_assign(znode *result, zend_ast *ast) /* {{{ */
{
zend_ast *var_ast = ast->child[0];
@@ -2978,13 +2758,22 @@ void zend_compile_assign(znode *result, zend_ast *ast) /* {{{ */
switch (var_ast->kind) {
case ZEND_AST_VAR:
- case ZEND_AST_STATIC_PROP:
offset = zend_delayed_compile_begin();
- zend_delayed_compile_var(&var_node, var_ast, BP_VAR_W);
+ zend_delayed_compile_var(&var_node, var_ast, BP_VAR_W, 0);
zend_compile_expr(&expr_node, expr_ast);
zend_delayed_compile_end(offset);
zend_emit_op(result, ZEND_ASSIGN, &var_node, &expr_node);
return;
+ case ZEND_AST_STATIC_PROP:
+ offset = zend_delayed_compile_begin();
+ zend_delayed_compile_var(result, var_ast, BP_VAR_W, 0);
+ zend_compile_expr(&expr_node, expr_ast);
+
+ opline = zend_delayed_compile_end(offset);
+ opline->opcode = ZEND_ASSIGN_STATIC_PROP;
+
+ zend_emit_op_data(&expr_node);
+ return;
case ZEND_AST_DIM:
offset = zend_delayed_compile_begin();
zend_delayed_compile_dim(result, var_ast, BP_VAR_W);
@@ -2997,7 +2786,7 @@ void zend_compile_assign(znode *result, zend_ast *ast) /* {{{ */
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);
+ zend_emit_op_tmp(&expr_node, ZEND_QM_ASSIGN, &cv_node, NULL);
}
} else {
zend_compile_expr(&expr_node, expr_ast);
@@ -3020,27 +2809,24 @@ void zend_compile_assign(znode *result, zend_ast *ast) /* {{{ */
return;
case ZEND_AST_ARRAY:
if (zend_propagate_list_refs(var_ast)) {
- if (!zend_is_variable(expr_ast)) {
+ if (!zend_is_variable_or_call(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);
+ zend_compile_var(&expr_node, expr_ast, BP_VAR_W, 1);
/* MAKE_REF is usually not necessary for CVs. However, if there are
* self-assignments, this forces the RHS to evaluate first. */
- if (expr_node.op_type != IS_CV
- || zend_list_has_assign_to_self(var_ast, expr_ast)) {
- zend_emit_op(&expr_node, ZEND_MAKE_REF, &expr_node, NULL);
- }
+ zend_emit_op(&expr_node, ZEND_MAKE_REF, &expr_node, NULL);
} else {
- if (zend_list_has_assign_to_self(var_ast, expr_ast)) {
+ if (expr_ast->kind == ZEND_AST_VAR) {
/* 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);
+ zend_emit_op_tmp(&expr_node, ZEND_QM_ASSIGN, &cv_node, NULL);
}
} else {
zend_compile_expr(&expr_node, expr_ast);
@@ -3061,7 +2847,7 @@ void zend_compile_assign_ref(znode *result, zend_ast *ast) /* {{{ */
znode target_node, source_node;
zend_op *opline;
- uint32_t offset;
+ uint32_t offset, flags;
if (is_this_fetch(target_ast)) {
zend_error_noreturn(E_COMPILE_ERROR, "Cannot re-assign $this");
@@ -3069,8 +2855,8 @@ void zend_compile_assign_ref(znode *result, zend_ast *ast) /* {{{ */
zend_ensure_writable_variable(target_ast);
offset = zend_delayed_compile_begin();
- zend_delayed_compile_var(&target_node, target_ast, BP_VAR_W);
- zend_compile_var(&source_node, source_ast, BP_VAR_W);
+ zend_delayed_compile_var(&target_node, target_ast, BP_VAR_W, 1);
+ zend_compile_var(&source_node, source_ast, BP_VAR_W, 1);
if ((target_ast->kind != ZEND_AST_VAR
|| target_ast->child[0]->kind != ZEND_AST_ZVAL)
@@ -3084,16 +2870,33 @@ void zend_compile_assign_ref(znode *result, zend_ast *ast) /* {{{ */
zend_emit_op(&source_node, ZEND_MAKE_REF, &source_node, NULL);
}
- zend_delayed_compile_end(offset);
+ opline = zend_delayed_compile_end(offset);
if (source_node.op_type != IS_VAR && zend_is_call(source_ast)) {
zend_error_noreturn(E_COMPILE_ERROR, "Cannot use result of built-in function in write context");
}
- opline = zend_emit_op(result, ZEND_ASSIGN_REF, &target_node, &source_node);
+ flags = zend_is_call(source_ast) ? ZEND_RETURNS_FUNCTION : 0;
- if (zend_is_call(source_ast)) {
- opline->extended_value = ZEND_RETURNS_FUNCTION;
+ if (opline && opline->opcode == ZEND_FETCH_OBJ_W) {
+ opline->opcode = ZEND_ASSIGN_OBJ_REF;
+ opline->extended_value &= ~ZEND_FETCH_REF;
+ opline->extended_value |= flags;
+ zend_emit_op_data(&source_node);
+ if (result != NULL) {
+ *result = target_node;
+ }
+ } else if (opline && opline->opcode == ZEND_FETCH_STATIC_PROP_W) {
+ opline->opcode = ZEND_ASSIGN_STATIC_PROP_REF;
+ opline->extended_value &= ~ZEND_FETCH_REF;
+ opline->extended_value |= flags;
+ zend_emit_op_data(&source_node);
+ if (result != NULL) {
+ *result = target_node;
+ }
+ } else {
+ opline = zend_emit_op(result, ZEND_ASSIGN_REF, &target_node, &source_node);
+ opline->extended_value = flags;
}
}
/* }}} */
@@ -3120,12 +2923,25 @@ void zend_compile_compound_assign(znode *result, zend_ast *ast) /* {{{ */
switch (var_ast->kind) {
case ZEND_AST_VAR:
- case ZEND_AST_STATIC_PROP:
offset = zend_delayed_compile_begin();
- zend_delayed_compile_var(&var_node, var_ast, BP_VAR_RW);
+ zend_delayed_compile_var(&var_node, var_ast, BP_VAR_RW, 0);
zend_compile_expr(&expr_node, expr_ast);
zend_delayed_compile_end(offset);
- zend_emit_op(result, opcode, &var_node, &expr_node);
+ opline = zend_emit_op(result, ZEND_ASSIGN_OP, &var_node, &expr_node);
+ opline->extended_value = opcode;
+ return;
+ case ZEND_AST_STATIC_PROP:
+ offset = zend_delayed_compile_begin();
+ zend_delayed_compile_var(result, var_ast, BP_VAR_RW, 0);
+ zend_compile_expr(&expr_node, expr_ast);
+
+ opline = zend_delayed_compile_end(offset);
+ cache_slot = opline->extended_value;
+ opline->opcode = ZEND_ASSIGN_STATIC_PROP_OP;
+ opline->extended_value = opcode;
+
+ opline = zend_emit_op_data(&expr_node);
+ opline->extended_value = cache_slot;
return;
case ZEND_AST_DIM:
offset = zend_delayed_compile_begin();
@@ -3133,10 +2949,10 @@ void zend_compile_compound_assign(znode *result, zend_ast *ast) /* {{{ */
zend_compile_expr(&expr_node, expr_ast);
opline = zend_delayed_compile_end(offset);
- opline->opcode = opcode;
- opline->extended_value = ZEND_ASSIGN_DIM;
+ opline->opcode = ZEND_ASSIGN_DIM_OP;
+ opline->extended_value = opcode;
- opline = zend_emit_op_data(&expr_node);
+ zend_emit_op_data(&expr_node);
return;
case ZEND_AST_PROP:
offset = zend_delayed_compile_begin();
@@ -3145,8 +2961,8 @@ void zend_compile_compound_assign(znode *result, zend_ast *ast) /* {{{ */
opline = zend_delayed_compile_end(offset);
cache_slot = opline->extended_value;
- opline->opcode = opcode;
- opline->extended_value = ZEND_ASSIGN_OBJ;
+ opline->opcode = ZEND_ASSIGN_OBJ_OP;
+ opline->extended_value = opcode;
opline = zend_emit_op_data(&expr_node);
opline->extended_value = cache_slot;
@@ -3188,12 +3004,16 @@ uint32_t zend_compile_args(zend_ast *ast, zend_function *fbc) /* {{{ */
}
arg_count++;
- if (zend_is_variable(arg)) {
+ if (zend_is_variable_or_call(arg)) {
if (zend_is_call(arg)) {
- zend_compile_var(&arg_node, arg, BP_VAR_R);
+ zend_compile_var(&arg_node, arg, BP_VAR_R, 0);
if (arg_node.op_type & (IS_CONST|IS_TMP_VAR)) {
/* Function call was converted into builtin instruction */
- opcode = ZEND_SEND_VAL;
+ if (!fbc || ARG_MUST_BE_SENT_BY_REF(fbc, arg_num)) {
+ opcode = ZEND_SEND_VAL_EX;
+ } else {
+ opcode = ZEND_SEND_VAL;
+ }
} else {
if (fbc) {
if (ARG_MUST_BE_SENT_BY_REF(fbc, arg_num)) {
@@ -3209,10 +3029,10 @@ uint32_t zend_compile_args(zend_ast *ast, zend_function *fbc) /* {{{ */
}
} else if (fbc) {
if (ARG_SHOULD_BE_SENT_BY_REF(fbc, arg_num)) {
- zend_compile_var(&arg_node, arg, BP_VAR_W);
+ zend_compile_var(&arg_node, arg, BP_VAR_W, 1);
opcode = ZEND_SEND_REF;
} else {
- zend_compile_var(&arg_node, arg, BP_VAR_R);
+ zend_compile_var(&arg_node, arg, BP_VAR_R, 0);
opcode = (arg_node.op_type == IS_TMP_VAR) ? ZEND_SEND_VAL : ZEND_SEND_VAR;
}
} else {
@@ -3222,6 +3042,7 @@ uint32_t zend_compile_args(zend_ast *ast, zend_function *fbc) /* {{{ */
if (is_this_fetch(arg)) {
zend_emit_op(&arg_node, ZEND_FETCH_THIS, NULL, NULL);
opcode = ZEND_SEND_VAR_EX;
+ CG(active_op_array)->fn_flags |= ZEND_ACC_USES_THIS;
break;
} else if (zend_try_compile_cv(&arg_node, arg) == SUCCESS) {
opcode = ZEND_SEND_VAR_EX;
@@ -3230,7 +3051,7 @@ uint32_t zend_compile_args(zend_ast *ast, zend_function *fbc) /* {{{ */
}
opline = zend_emit_op(NULL, ZEND_CHECK_FUNC_ARG, NULL, NULL);
opline->op2.num = arg_num;
- zend_compile_var(&arg_node, arg, BP_VAR_FUNC_ARG);
+ zend_compile_var(&arg_node, arg, BP_VAR_FUNC_ARG, 1);
opcode = ZEND_SEND_FUNC_ARG;
} while (0);
}
@@ -3283,7 +3104,7 @@ uint32_t zend_compile_args(zend_ast *ast, zend_function *fbc) /* {{{ */
ZEND_API zend_uchar zend_get_call_op(const zend_op *init_op, zend_function *fbc) /* {{{ */
{
if (fbc) {
- if (fbc->type == ZEND_INTERNAL_FUNCTION) {
+ if (fbc->type == ZEND_INTERNAL_FUNCTION && !(CG(compiler_options) & ZEND_COMPILE_IGNORE_INTERNAL_FUNCTIONS)) {
if (init_op->opcode == ZEND_INIT_FCALL && !zend_execute_internal) {
if (!(fbc->common.fn_flags & (ZEND_ACC_ABSTRACT|ZEND_ACC_DEPRECATED|ZEND_ACC_HAS_TYPE_HINTS|ZEND_ACC_RETURN_REFERENCE))) {
return ZEND_DO_ICALL;
@@ -3291,7 +3112,7 @@ ZEND_API zend_uchar zend_get_call_op(const zend_op *init_op, zend_function *fbc)
return ZEND_DO_FCALL_BY_NAME;
}
}
- } else {
+ } else if (!(CG(compiler_options) & ZEND_COMPILE_IGNORE_USER_FUNCTIONS)){
if (zend_execute_ex == execute_ex && !(fbc->common.fn_flags & ZEND_ACC_ABSTRACT)) {
return ZEND_DO_UCALL;
}
@@ -3309,14 +3130,13 @@ ZEND_API zend_uchar zend_get_call_op(const zend_op *init_op, zend_function *fbc)
void zend_compile_call_common(znode *result, zend_ast *args_ast, zend_function *fbc) /* {{{ */
{
zend_op *opline;
- uint32_t opnum_init = get_next_op_number(CG(active_op_array)) - 1;
+ uint32_t opnum_init = get_next_op_number() - 1;
uint32_t arg_count;
- uint32_t call_flags;
-
- zend_do_extended_fcall_begin();
arg_count = zend_compile_args(args_ast, fbc);
+ zend_do_extended_fcall_begin();
+
opline = &CG(active_op_array)->opcodes[opnum_init];
opline->extended_value = arg_count;
@@ -3324,10 +3144,7 @@ void zend_compile_call_common(znode *result, zend_ast *args_ast, zend_function *
opline->op1.num = zend_vm_calc_used_stack(arg_count, fbc);
}
- call_flags = (opline->opcode == ZEND_NEW ? ZEND_CALL_CTOR : 0);
opline = zend_emit_op(result, zend_get_call_op(opline, fbc), NULL, NULL);
- opline->op1.num = call_flags;
-
zend_do_extended_fcall_end();
}
/* }}} */
@@ -3347,11 +3164,11 @@ zend_bool zend_compile_function_name(znode *name_node, zend_ast *name_ast) /* {{
void zend_compile_ns_call(znode *result, znode *name_node, zend_ast *args_ast) /* {{{ */
{
- zend_op *opline = get_next_op(CG(active_op_array));
+ zend_op *opline = get_next_op();
opline->opcode = ZEND_INIT_NS_FCALL_BY_NAME;
opline->op2_type = IS_CONST;
opline->op2.constant = zend_add_ns_func_name_literal(
- CG(active_op_array), Z_STR(name_node->u.constant));
+ Z_STR(name_node->u.constant));
opline->result.num = zend_alloc_cache_slot();
zend_compile_call_common(result, args_ast, NULL);
@@ -3366,22 +3183,22 @@ void zend_compile_dynamic_call(znode *result, znode *name_node, zend_ast *args_a
if ((colon = zend_memrchr(ZSTR_VAL(str), ':', ZSTR_LEN(str))) != NULL && colon > ZSTR_VAL(str) && *(colon - 1) == ':') {
zend_string *class = zend_string_init(ZSTR_VAL(str), colon - ZSTR_VAL(str) - 1, 0);
zend_string *method = zend_string_init(colon + 1, ZSTR_LEN(str) - (colon - ZSTR_VAL(str)) - 1, 0);
- zend_op *opline = get_next_op(CG(active_op_array));
+ zend_op *opline = get_next_op();
opline->opcode = ZEND_INIT_STATIC_METHOD_CALL;
opline->op1_type = IS_CONST;
- opline->op1.constant = zend_add_class_name_literal(CG(active_op_array), class);
+ opline->op1.constant = zend_add_class_name_literal(class);
opline->op2_type = IS_CONST;
- opline->op2.constant = zend_add_func_name_literal(CG(active_op_array), method);
+ opline->op2.constant = zend_add_func_name_literal(method);
/* 2 slots, for class and method */
- opline->result.num = zend_alloc_polymorphic_cache_slot();
+ opline->result.num = zend_alloc_cache_slots(2);
zval_ptr_dtor(&name_node->u.constant);
} else {
- zend_op *opline = get_next_op(CG(active_op_array));
+ zend_op *opline = get_next_op();
opline->opcode = ZEND_INIT_FCALL_BY_NAME;
opline->op2_type = IS_CONST;
- opline->op2.constant = zend_add_func_name_literal(CG(active_op_array), str);
+ opline->op2.constant = zend_add_func_name_literal(str);
opline->result.num = zend_alloc_cache_slot();
}
} else {
@@ -3392,7 +3209,7 @@ void zend_compile_dynamic_call(znode *result, znode *name_node, zend_ast *args_a
}
/* }}} */
-static zend_bool zend_args_contain_unpack(zend_ast_list *args) /* {{{ */
+static inline zend_bool zend_args_contain_unpack(zend_ast_list *args) /* {{{ */
{
uint32_t i;
for (i = 0; i < args->children; ++i) {
@@ -3409,7 +3226,7 @@ int zend_compile_func_strlen(znode *result, zend_ast_list *args) /* {{{ */
znode arg_node;
if ((CG(compiler_options) & ZEND_COMPILE_NO_BUILTIN_STRLEN)
- || args->children != 1 || args->child[0]->kind == ZEND_AST_UNPACK
+ || args->children != 1
) {
return FAILURE;
}
@@ -3431,7 +3248,7 @@ int zend_compile_func_typecheck(znode *result, zend_ast_list *args, uint32_t typ
znode arg_node;
zend_op *opline;
- if (args->children != 1 || args->child[0]->kind == ZEND_AST_UNPACK) {
+ if (args->children != 1) {
return FAILURE;
}
@@ -3451,7 +3268,7 @@ int zend_compile_func_cast(znode *result, zend_ast_list *args, uint32_t type) /*
znode arg_node;
zend_op *opline;
- if (args->children != 1 || args->child[0]->kind == ZEND_AST_UNPACK) {
+ if (args->children != 1) {
return FAILURE;
}
@@ -3495,7 +3312,7 @@ int zend_compile_func_defined(znode *result, zend_ast_list *args) /* {{{ */
zval c;
zend_string *lcname = zend_string_tolower(name);
ZVAL_NEW_STR(&c, lcname);
- zend_add_literal(CG(active_op_array), &c);
+ zend_add_literal(&c);
}
return SUCCESS;
}
@@ -3534,6 +3351,12 @@ int zend_compile_func_ord(znode *result, zend_ast_list *args) /* {{{ */
}
/* }}} */
+/* We can only calculate the stack size for functions that have been fully compiled, otherwise
+ * additional CV or TMP slots may still be added. This prevents the use of INIT_FCALL for
+ * directly or indirectly recursive function calls. */
+static zend_bool fbc_is_finalized(zend_function *fbc) {
+ return !ZEND_USER_CODE(fbc->type) || (fbc->common.fn_flags & ZEND_ACC_DONE_PASS_TWO);
+}
static int zend_try_compile_ct_bound_init_user_func(zend_ast *name_ast, uint32_t num_args) /* {{{ */
{
@@ -3549,9 +3372,10 @@ static int zend_try_compile_ct_bound_init_user_func(zend_ast *name_ast, uint32_t
lcname = zend_string_tolower(name);
fbc = zend_hash_find_ptr(CG(function_table), lcname);
- if (!fbc
+ if (!fbc || !fbc_is_finalized(fbc)
|| (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))
+ || (fbc->type == ZEND_USER_FUNCTION && (CG(compiler_options) & ZEND_COMPILE_IGNORE_OTHER_FILES) && fbc->op_array.filename != CG(active_op_array)->filename)
) {
zend_string_release_ex(lcname, 0);
return FAILURE;
@@ -3591,7 +3415,7 @@ int zend_compile_func_cufa(znode *result, zend_ast_list *args, zend_string *lcna
{
znode arg_node;
- if (args->children != 2 || zend_args_contain_unpack(args)) {
+ if (args->children != 2) {
return FAILURE;
}
@@ -3640,7 +3464,7 @@ int zend_compile_func_cuf(znode *result, zend_ast_list *args, zend_string *lcnam
{
uint32_t i;
- if (args->children < 1 || zend_args_contain_unpack(args)) {
+ if (args->children < 1) {
return FAILURE;
}
@@ -3667,11 +3491,11 @@ static void zend_compile_assert(znode *result, zend_ast_list *args, zend_string
if (EG(assertions) >= 0) {
znode name_node;
zend_op *opline;
- uint32_t check_op_number = get_next_op_number(CG(active_op_array));
+ uint32_t check_op_number = get_next_op_number();
zend_emit_op(NULL, ZEND_ASSERT_CHECK, NULL, NULL);
- if (fbc) {
+ if (fbc && fbc_is_finalized(fbc)) {
name_node.op_type = IS_CONST;
ZVAL_STR_COPY(&name_node.u.constant, name);
@@ -3679,8 +3503,7 @@ static void zend_compile_assert(znode *result, zend_ast_list *args, zend_string
} else {
opline = zend_emit_op(NULL, ZEND_INIT_NS_FCALL_BY_NAME, NULL, NULL);
opline->op2_type = IS_CONST;
- opline->op2.constant = zend_add_ns_func_name_literal(
- CG(active_op_array), name);
+ opline->op2.constant = zend_add_ns_func_name_literal(name);
}
opline->result.num = zend_alloc_cache_slot();
@@ -3696,7 +3519,7 @@ static void zend_compile_assert(znode *result, zend_ast_list *args, zend_string
zend_compile_call_common(result, (zend_ast*)args, fbc);
opline = &CG(active_op_array)->opcodes[check_op_number];
- opline->op2.opline_num = get_next_op_number(CG(active_op_array));
+ opline->op2.opline_num = get_next_op_number();
SET_NODE(opline->result, result);
} else {
if (!fbc) {
@@ -3793,16 +3616,19 @@ static int zend_compile_func_in_array(znode *result, zend_ast_list *args) /* {{{
}
/* }}} */
-int zend_compile_func_count(znode *result, zend_ast_list *args) /* {{{ */
+int zend_compile_func_count(znode *result, zend_ast_list *args, zend_string *lcname) /* {{{ */
{
znode arg_node;
+ zend_op *opline;
- if (args->children != 1 || args->child[0]->kind == ZEND_AST_UNPACK) {
+ if (args->children != 1) {
return FAILURE;
}
zend_compile_expr(&arg_node, args->child[0]);
- zend_emit_op_tmp(result, ZEND_COUNT, &arg_node, NULL);
+ opline = zend_emit_op_tmp(result, ZEND_COUNT, &arg_node, NULL);
+ opline->extended_value = zend_string_equals_literal(lcname, "sizeof");
+
return SUCCESS;
}
/* }}} */
@@ -3814,7 +3640,7 @@ int zend_compile_func_get_class(znode *result, zend_ast_list *args) /* {{{ */
} else {
znode arg_node;
- if (args->children != 1 || args->child[0]->kind == ZEND_AST_UNPACK) {
+ if (args->children != 1) {
return FAILURE;
}
@@ -3840,7 +3666,7 @@ int zend_compile_func_gettype(znode *result, zend_ast_list *args) /* {{{ */
{
znode arg_node;
- if (args->children != 1 || args->child[0]->kind == ZEND_AST_UNPACK) {
+ if (args->children != 1) {
return FAILURE;
}
@@ -3872,6 +3698,22 @@ int zend_compile_func_get_args(znode *result, zend_ast_list *args) /* {{{ */
}
/* }}} */
+int zend_compile_func_array_key_exists(znode *result, zend_ast_list *args) /* {{{ */
+{
+ znode subject, needle;
+
+ if (args->children != 2) {
+ return FAILURE;
+ }
+
+ zend_compile_expr(&needle, args->child[0]);
+ zend_compile_expr(&subject, args->child[1]);
+
+ zend_emit_op_tmp(result, ZEND_ARRAY_KEY_EXISTS, &needle, &subject);
+ return SUCCESS;
+}
+/* }}} */
+
int zend_compile_func_array_slice(znode *result, zend_ast_list *args) /* {{{ */
{
if (CG(active_op_array)->function_name
@@ -3915,6 +3757,10 @@ int zend_try_compile_special_func(znode *result, zend_string *lcname, zend_ast_l
return FAILURE;
}
+ if (zend_args_contain_unpack(args)) {
+ return FAILURE;
+ }
+
if (zend_string_equals_literal(lcname, "strlen")) {
return zend_compile_func_strlen(result, args);
} else if (zend_string_equals_literal(lcname, "is_null")) {
@@ -3928,7 +3774,6 @@ int zend_try_compile_special_func(znode *result, zend_string *lcname, zend_ast_l
return zend_compile_func_typecheck(result, args, IS_LONG);
} else if (zend_string_equals_literal(lcname, "is_float")
|| zend_string_equals_literal(lcname, "is_double")
- || zend_string_equals_literal(lcname, "is_real")
) {
return zend_compile_func_typecheck(result, args, IS_DOUBLE);
} else if (zend_string_equals_literal(lcname, "is_string")) {
@@ -3961,8 +3806,9 @@ int zend_try_compile_special_func(znode *result, zend_string *lcname, zend_ast_l
return zend_compile_func_cuf(result, args, lcname);
} else if (zend_string_equals_literal(lcname, "in_array")) {
return zend_compile_func_in_array(result, args);
- } else if (zend_string_equals_literal(lcname, "count")) {
- return zend_compile_func_count(result, args);
+ } else if (zend_string_equals_literal(lcname, "count")
+ || zend_string_equals_literal(lcname, "sizeof")) {
+ return zend_compile_func_count(result, args, lcname);
} else if (zend_string_equals_literal(lcname, "get_class")) {
return zend_compile_func_get_class(result, args);
} else if (zend_string_equals_literal(lcname, "get_called_class")) {
@@ -3975,6 +3821,8 @@ int zend_try_compile_special_func(znode *result, zend_string *lcname, zend_ast_l
return zend_compile_func_get_args(result, args);
} else if (zend_string_equals_literal(lcname, "array_slice")) {
return zend_compile_func_array_slice(result, args);
+ } else if (zend_string_equals_literal(lcname, "array_key_exists")) {
+ return zend_compile_func_array_key_exists(result, args);
} else {
return FAILURE;
}
@@ -4023,9 +3871,10 @@ void zend_compile_call(znode *result, zend_ast *ast, uint32_t type) /* {{{ */
return;
}
- if (!fbc
+ if (!fbc || !fbc_is_finalized(fbc)
|| (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))
+ || (fbc->type == ZEND_USER_FUNCTION && (CG(compiler_options) & ZEND_COMPILE_IGNORE_OTHER_FILES) && fbc->op_array.filename != CG(active_op_array)->filename)
) {
zend_string_release_ex(lcname, 0);
zend_compile_dynamic_call(result, &name_node, args_ast);
@@ -4063,6 +3912,7 @@ void zend_compile_method_call(znode *result, zend_ast *ast, uint32_t type) /* {{
if (is_this_fetch(obj_ast)) {
obj_node.op_type = IS_UNUSED;
+ CG(active_op_array)->fn_flags |= ZEND_ACC_USES_THIS;
} else {
zend_compile_expr(&obj_node, obj_ast);
}
@@ -4076,9 +3926,9 @@ 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),
+ opline->op2.constant = zend_add_func_name_literal(
Z_STR(method_node.u.constant));
- opline->result.num = zend_alloc_polymorphic_cache_slot();
+ opline->result.num = zend_alloc_cache_slots(2);
} else {
SET_NODE(opline->op2, &method_node);
}
@@ -4116,7 +3966,7 @@ void zend_compile_static_call(znode *result, zend_ast *ast, uint32_t type) /* {{
zend_op *opline;
zend_function *fbc = NULL;
- zend_compile_class_ref_ex(&class_node, class_ast, ZEND_FETCH_CLASS_EXCEPTION);
+ zend_compile_class_ref(&class_node, class_ast, ZEND_FETCH_CLASS_EXCEPTION);
zend_compile_expr(&method_node, method_ast);
if (method_node.op_type == IS_CONST) {
@@ -4130,23 +3980,22 @@ void zend_compile_static_call(znode *result, zend_ast *ast, uint32_t type) /* {{
}
}
- opline = get_next_op(CG(active_op_array));
+ opline = get_next_op();
opline->opcode = ZEND_INIT_STATIC_METHOD_CALL;
zend_set_class_name_op1(opline, &class_node);
if (method_node.op_type == IS_CONST) {
opline->op2_type = IS_CONST;
- opline->op2.constant = zend_add_func_name_literal(CG(active_op_array),
+ opline->op2.constant = zend_add_func_name_literal(
Z_STR(method_node.u.constant));
- opline->result.num = zend_alloc_polymorphic_cache_slot();
+ opline->result.num = zend_alloc_cache_slots(2);
} else {
if (opline->op1_type == IS_CONST) {
opline->result.num = zend_alloc_cache_slot();
}
SET_NODE(opline->op2, &method_node);
}
- zend_check_live_ranges(opline);
/* Check if we already know which method we're calling */
if (opline->op2_type == IS_CONST) {
@@ -4168,7 +4017,10 @@ void zend_compile_static_call(znode *result, zend_ast *ast, uint32_t type) /* {{
fbc = zend_hash_find_ptr(&ce->function_table, lcname);
if (fbc && !(fbc->common.fn_flags & ZEND_ACC_PUBLIC)) {
if (ce != CG(active_class_entry)
- &&((fbc->common.fn_flags & ZEND_ACC_PRIVATE)
+ && ((fbc->common.fn_flags & ZEND_ACC_PRIVATE)
+ || !(fbc->common.scope->ce_flags & ZEND_ACC_LINKED)
+ || (CG(active_class_entry)
+ && !(CG(active_class_entry)->ce_flags & ZEND_ACC_LINKED))
|| !zend_check_protected(zend_get_function_root_class(fbc), CG(active_class_entry)))) {
/* incompatibe function */
fbc = NULL;
@@ -4181,7 +4033,7 @@ void zend_compile_static_call(znode *result, zend_ast *ast, uint32_t type) /* {{
}
/* }}} */
-void zend_compile_class_decl(zend_ast *ast);
+zend_op *zend_compile_class_decl(zend_ast *ast, zend_bool toplevel);
void zend_compile_new(znode *result, zend_ast *ast) /* {{{ */
{
@@ -4192,18 +4044,12 @@ void zend_compile_new(znode *result, zend_ast *ast) /* {{{ */
zend_op *opline;
if (class_ast->kind == ZEND_AST_CLASS) {
- uint32_t dcl_opnum = get_next_op_number(CG(active_op_array));
- zend_compile_class_decl(class_ast);
- /* jump over anon class declaration */
- opline = &CG(active_op_array)->opcodes[dcl_opnum];
- if (opline->opcode == ZEND_FETCH_CLASS) {
- opline++;
- }
+ /* anon class declaration */
+ opline = zend_compile_class_decl(class_ast, 0);
class_node.op_type = opline->result_type;
class_node.u.op.var = opline->result.var;
- opline->extended_value = get_next_op_number(CG(active_op_array));
} else {
- zend_compile_class_ref_ex(&class_node, class_ast, ZEND_FETCH_CLASS_EXCEPTION);
+ zend_compile_class_ref(&class_node, class_ast, ZEND_FETCH_CLASS_EXCEPTION);
}
opline = zend_emit_op(result, ZEND_NEW, NULL, NULL);
@@ -4211,7 +4057,7 @@ void zend_compile_new(znode *result, zend_ast *ast) /* {{{ */
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));
+ Z_STR(class_node.u.constant));
opline->op2.num = zend_alloc_cache_slot();
} else {
SET_NODE(opline->op1, &class_node);
@@ -4269,20 +4115,9 @@ void zend_compile_global_var(zend_ast *ast) /* {{{ */
}
/* }}} */
-static void zend_compile_static_var_common(zend_ast *var_ast, zval *value, uint32_t by_ref) /* {{{ */
+static void zend_compile_static_var_common(zend_string *var_name, zval *value, uint32_t mode) /* {{{ */
{
- znode var_node;
zend_op *opline;
- zend_string *var_name;
-
- 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;
@@ -4290,22 +4125,16 @@ static void zend_compile_static_var_common(zend_ast *var_ast, zval *value, uint3
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_DELREF(CG(active_op_array)->static_variables);
- }
- CG(active_op_array)->static_variables = zend_array_dup(CG(active_op_array)->static_variables);
- }
value = zend_hash_update(CG(active_op_array)->static_variables, var_name, value);
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 = zend_emit_op(NULL, ZEND_BIND_STATIC, NULL, NULL);
opline->op1_type = IS_CV;
- 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;
+ opline->op1.var = lookup_cv(var_name);
+ opline->extended_value = (uint32_t)((char*)value - (char*)CG(active_op_array)->static_variables->arData) | mode;
}
/* }}} */
@@ -4321,7 +4150,7 @@ void zend_compile_static_var(zend_ast *ast) /* {{{ */
ZVAL_NULL(&value_zv);
}
- zend_compile_static_var_common(var_ast, &value_zv, ZEND_BIND_REF);
+ zend_compile_static_var_common(zend_ast_get_str(var_ast), &value_zv, ZEND_BIND_REF);
}
/* }}} */
@@ -4349,11 +4178,11 @@ void zend_compile_unset(zend_ast *ast) /* {{{ */
opline->opcode = ZEND_UNSET_DIM;
return;
case ZEND_AST_PROP:
- opline = zend_compile_prop(NULL, var_ast, BP_VAR_UNSET);
+ opline = zend_compile_prop(NULL, var_ast, BP_VAR_UNSET, 0);
opline->opcode = ZEND_UNSET_OBJ;
return;
case ZEND_AST_STATIC_PROP:
- opline = zend_compile_static_prop(NULL, var_ast, BP_VAR_UNSET, 0);
+ opline = zend_compile_static_prop(NULL, var_ast, BP_VAR_UNSET, 0, 0);
opline->opcode = ZEND_UNSET_STATIC_PROP;
return;
EMPTY_SWITCH_DEFAULT_CASE()
@@ -4372,7 +4201,7 @@ static int zend_handle_loops_and_finally_ex(zend_long depth, znode *return_value
base = zend_stack_base(&CG(loop_var_stack));
for (; loop_var >= base; loop_var--) {
if (loop_var->opcode == ZEND_FAST_CALL) {
- zend_op *opline = get_next_op(CG(active_op_array));
+ zend_op *opline = get_next_op();
opline->opcode = ZEND_FAST_CALL;
opline->result_type = IS_TMP_VAR;
@@ -4380,9 +4209,9 @@ static int zend_handle_loops_and_finally_ex(zend_long depth, znode *return_value
if (return_value) {
SET_NODE(opline->op2, return_value);
}
- opline->op1.num = loop_var->u.try_catch_offset;
+ opline->op1.num = loop_var->try_catch_offset;
} else if (loop_var->opcode == ZEND_DISCARD_EXCEPTION) {
- zend_op *opline = get_next_op(CG(active_op_array));
+ zend_op *opline = get_next_op();
opline->opcode = ZEND_DISCARD_EXCEPTION;
opline->op1_type = IS_TMP_VAR;
opline->op1.var = loop_var->var_num;
@@ -4398,7 +4227,7 @@ static int zend_handle_loops_and_finally_ex(zend_long depth, znode *return_value
zend_op *opline;
ZEND_ASSERT(loop_var->var_type & (IS_VAR|IS_TMP_VAR));
- opline = get_next_op(CG(active_op_array));
+ opline = get_next_op();
opline->opcode = loop_var->opcode;
opline->op1_type = loop_var->var_type;
opline->op1.var = loop_var->var_num;
@@ -4465,8 +4294,8 @@ void zend_compile_return(zend_ast *ast) /* {{{ */
if (!expr_ast) {
expr_node.op_type = IS_CONST;
ZVAL_NULL(&expr_node.u.constant);
- } else if (by_ref && zend_is_variable(expr_ast) && !zend_is_call(expr_ast)) {
- zend_compile_var(&expr_node, expr_ast, BP_VAR_W);
+ } else if (by_ref && zend_is_variable(expr_ast)) {
+ zend_compile_var(&expr_node, expr_ast, BP_VAR_W, 1);
} else {
zend_compile_expr(&expr_node, expr_ast);
}
@@ -4659,14 +4488,14 @@ void zend_compile_goto(zend_ast *ast) /* {{{ */
zend_ast *label_ast = ast->child[0];
znode label_node;
zend_op *opline;
- uint32_t opnum_start = get_next_op_number(CG(active_op_array));
+ uint32_t opnum_start = get_next_op_number();
zend_compile_expr(&label_node, label_ast);
/* Label resolution and unwinding adjustments happen in pass two. */
zend_handle_loops_and_finally(NULL);
opline = zend_emit_op(NULL, ZEND_GOTO, NULL, &label_node);
- opline->op1.num = get_next_op_number(CG(active_op_array)) - opnum_start - 1;
+ opline->op1.num = get_next_op_number() - opnum_start - 1;
opline->extended_value = CG(context).current_brk_cont;
}
/* }}} */
@@ -4682,7 +4511,7 @@ void zend_compile_label(zend_ast *ast) /* {{{ */
}
dest.brk_cont = CG(context).current_brk_cont;
- dest.opline_num = get_next_op_number(CG(active_op_array));
+ dest.opline_num = get_next_op_number();
if (!zend_hash_add_mem(CG(context).labels, label, &dest, sizeof(zend_label))) {
zend_error_noreturn(E_COMPILE_ERROR, "Label '%s' already defined", ZSTR_VAL(label));
@@ -4701,10 +4530,10 @@ void zend_compile_while(zend_ast *ast) /* {{{ */
zend_begin_loop(ZEND_NOP, NULL, 0);
- opnum_start = get_next_op_number(CG(active_op_array));
+ opnum_start = get_next_op_number();
zend_compile_stmt(stmt_ast);
- opnum_cond = get_next_op_number(CG(active_op_array));
+ opnum_cond = get_next_op_number();
zend_update_jump_target(opnum_jmp, opnum_cond);
zend_compile_expr(&cond_node, cond_ast);
@@ -4724,10 +4553,10 @@ void zend_compile_do_while(zend_ast *ast) /* {{{ */
zend_begin_loop(ZEND_NOP, NULL, 0);
- opnum_start = get_next_op_number(CG(active_op_array));
+ opnum_start = get_next_op_number();
zend_compile_stmt(stmt_ast);
- opnum_cond = get_next_op_number(CG(active_op_array));
+ opnum_cond = get_next_op_number();
zend_compile_expr(&cond_node, cond_ast);
zend_emit_cond_jump(ZEND_JMPNZ, &cond_node, opnum_start);
@@ -4775,16 +4604,16 @@ void zend_compile_for(zend_ast *ast) /* {{{ */
zend_begin_loop(ZEND_NOP, NULL, 0);
- opnum_start = get_next_op_number(CG(active_op_array));
+ opnum_start = get_next_op_number();
zend_compile_stmt(stmt_ast);
- opnum_loop = get_next_op_number(CG(active_op_array));
+ opnum_loop = get_next_op_number();
zend_compile_expr_list(&result, loop_ast);
zend_do_free(&result);
zend_update_jump_target_to_next(opnum_jmp);
zend_compile_expr_list(&result, cond_ast);
- zend_do_extended_info();
+ zend_do_extended_stmt();
zend_emit_cond_jump(ZEND_JMPNZ, &result, opnum_start);
@@ -4799,8 +4628,7 @@ void zend_compile_foreach(zend_ast *ast) /* {{{ */
zend_ast *key_ast = ast->child[2];
zend_ast *stmt_ast = ast->child[3];
zend_bool by_ref = value_ast->kind == ZEND_AST_REF;
- zend_bool is_variable = zend_is_variable(expr_ast) && !zend_is_call(expr_ast)
- && zend_can_write_to_variable(expr_ast);
+ zend_bool is_variable = zend_is_variable(expr_ast) && zend_can_write_to_variable(expr_ast);
znode expr_node, reset_node, value_node, key_node;
zend_op *opline;
@@ -4824,7 +4652,7 @@ void zend_compile_foreach(zend_ast *ast) /* {{{ */
}
if (by_ref && is_variable) {
- zend_compile_var(&expr_node, expr_ast, BP_VAR_W);
+ zend_compile_var(&expr_node, expr_ast, BP_VAR_W, 1);
} else {
zend_compile_expr(&expr_node, expr_ast);
}
@@ -4833,12 +4661,12 @@ void zend_compile_foreach(zend_ast *ast) /* {{{ */
zend_separate_if_call_and_write(&expr_node, expr_ast, BP_VAR_W);
}
- opnum_reset = get_next_op_number(CG(active_op_array));
+ opnum_reset = get_next_op_number();
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, 0);
- opnum_fetch = get_next_op_number(CG(active_op_array));
+ opnum_fetch = get_next_op_number();
opline = zend_emit_op(NULL, by_ref ? ZEND_FE_FETCH_RW : ZEND_FE_FETCH_R, &reset_node, NULL);
if (is_this_fetch(value_ast)) {
@@ -4848,7 +4676,7 @@ void zend_compile_foreach(zend_ast *ast) /* {{{ */
SET_NODE(opline->op2, &value_node);
} else {
opline->op2_type = IS_VAR;
- opline->op2.var = get_temporary_variable(CG(active_op_array));
+ opline->op2.var = get_temporary_variable();
GET_NODE(&value_node, opline->op2);
if (value_ast->kind == ZEND_AST_ARRAY) {
zend_compile_list_assign(NULL, value_ast, &value_node, value_ast->attr);
@@ -4874,10 +4702,10 @@ void zend_compile_foreach(zend_ast *ast) /* {{{ */
zend_emit_jump(opnum_fetch);
opline = &CG(active_op_array)->opcodes[opnum_reset];
- opline->op2.opline_num = get_next_op_number(CG(active_op_array));
+ opline->op2.opline_num = get_next_op_number();
opline = &CG(active_op_array)->opcodes[opnum_fetch];
- opline->extended_value = get_next_op_number(CG(active_op_array));
+ opline->extended_value = get_next_op_number();
zend_end_loop(opnum_fetch, &reset_node);
@@ -4900,21 +4728,22 @@ void zend_compile_if(zend_ast *ast) /* {{{ */
zend_ast *cond_ast = elem_ast->child[0];
zend_ast *stmt_ast = elem_ast->child[1];
- znode cond_node;
- uint32_t opnum_jmpz;
if (cond_ast) {
+ znode cond_node;
+ uint32_t opnum_jmpz;
zend_compile_expr(&cond_node, cond_ast);
opnum_jmpz = zend_emit_cond_jump(ZEND_JMPZ, &cond_node, 0);
- }
- zend_compile_stmt(stmt_ast);
-
- if (i != list->children - 1) {
- jmp_opnums[i] = zend_emit_jump(0);
- }
+ zend_compile_stmt(stmt_ast);
- if (cond_ast) {
+ if (i != list->children - 1) {
+ jmp_opnums[i] = zend_emit_jump(0);
+ }
zend_update_jump_target_to_next(opnum_jmpz);
+ } else {
+ /* "else" can only occur as last element. */
+ ZEND_ASSERT(i == list->children - 1);
+ zend_compile_stmt(stmt_ast);
}
}
@@ -4993,7 +4822,7 @@ void zend_compile_switch(zend_ast *ast) /* {{{ */
znode expr_node, case_node;
zend_op *opline;
- uint32_t *jmpnz_opnums, opnum_default_jmp, opnum_switch;
+ uint32_t *jmpnz_opnums, opnum_default_jmp, opnum_switch = (uint32_t)-1;
zend_uchar jumptable_type;
HashTable *jumptable = NULL;
@@ -5002,7 +4831,7 @@ void zend_compile_switch(zend_ast *ast) /* {{{ */
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));
+ case_node.u.op.var = get_temporary_variable();
jumptable_type = determine_switch_jumptable_type(cases);
if (jumptable_type != IS_UNDEF && should_use_jumptable(cases, jumptable_type)) {
@@ -5072,7 +4901,7 @@ void zend_compile_switch(zend_ast *ast) /* {{{ */
if (jumptable) {
zval *cond_zv = zend_ast_get_zval(cond_ast);
zval jmp_target;
- ZVAL_LONG(&jmp_target, get_next_op_number(CG(active_op_array)));
+ ZVAL_LONG(&jmp_target, get_next_op_number());
ZEND_ASSERT(Z_TYPE_P(cond_zv) == jumptable_type);
if (Z_TYPE_P(cond_zv) == IS_LONG) {
@@ -5086,8 +4915,9 @@ void zend_compile_switch(zend_ast *ast) /* {{{ */
zend_update_jump_target_to_next(opnum_default_jmp);
if (jumptable) {
+ ZEND_ASSERT(opnum_switch != (uint32_t)-1);
opline = &CG(active_op_array)->opcodes[opnum_switch];
- opline->extended_value = get_next_op_number(CG(active_op_array));
+ opline->extended_value = get_next_op_number();
}
}
@@ -5099,17 +4929,15 @@ void zend_compile_switch(zend_ast *ast) /* {{{ */
if (jumptable) {
opline = &CG(active_op_array)->opcodes[opnum_switch];
- opline->extended_value = get_next_op_number(CG(active_op_array));
+ opline->extended_value = get_next_op_number();
}
}
- zend_end_loop(get_next_op_number(CG(active_op_array)), &expr_node);
+ zend_end_loop(get_next_op_number(), &expr_node);
if (expr_node.op_type & (IS_VAR|IS_TMP_VAR)) {
- /* don't use emit_op() to prevent automatic live-range construction */
- opline = get_next_op(CG(active_op_array));
- opline->opcode = ZEND_FREE;
- SET_NODE(opline->op1, &expr_node);
+ opline = zend_emit_op(NULL, ZEND_FREE, &expr_node, NULL);
+ opline->extended_value = ZEND_FREE_SWITCH;
} else if (expr_node.op_type == IS_CONST) {
zval_ptr_dtor_nogc(&expr_node.u.constant);
}
@@ -5139,27 +4967,27 @@ void zend_compile_try(zend_ast *ast) /* {{{ */
if (CG(context).labels) {
zend_label *label;
ZEND_HASH_REVERSE_FOREACH_PTR(CG(context).labels, label) {
- if (label->opline_num == get_next_op_number(CG(active_op_array))) {
+ if (label->opline_num == get_next_op_number()) {
zend_emit_op(NULL, ZEND_NOP, NULL, NULL);
}
break;
} ZEND_HASH_FOREACH_END();
}
- try_catch_offset = zend_add_try_element(get_next_op_number(CG(active_op_array)));
+ try_catch_offset = zend_add_try_element(get_next_op_number());
if (finally_ast) {
zend_loop_var fast_call;
if (!(CG(active_op_array)->fn_flags & ZEND_ACC_HAS_FINALLY_BLOCK)) {
CG(active_op_array)->fn_flags |= ZEND_ACC_HAS_FINALLY_BLOCK;
}
- CG(context).fast_call_var = get_temporary_variable(CG(active_op_array));
+ CG(context).fast_call_var = get_temporary_variable();
/* Push FAST_CALL on unwind stack */
fast_call.opcode = ZEND_FAST_CALL;
fast_call.var_type = IS_TMP_VAR;
fast_call.var_num = CG(context).fast_call_var;
- fast_call.u.try_catch_offset = try_catch_offset;
+ fast_call.try_catch_offset = try_catch_offset;
zend_stack_push(&CG(loop_var_stack), &fast_call);
}
@@ -5180,12 +5008,11 @@ void zend_compile_try(zend_ast *ast) /* {{{ */
zend_bool is_last_catch = (i + 1 == catches->children);
uint32_t *jmp_multicatch = safe_emalloc(sizeof(uint32_t), classes->children - 1, 0);
- uint32_t opnum_catch;
+ uint32_t opnum_catch = (uint32_t)-1;
CG(zend_lineno) = catch_ast->lineno;
for (j = 0; j < classes->children; j++) {
-
zend_ast *class_ast = classes->child[j];
zend_bool is_last_class = (j + 1 == classes->children);
@@ -5193,15 +5020,15 @@ void zend_compile_try(zend_ast *ast) /* {{{ */
zend_error_noreturn(E_COMPILE_ERROR, "Bad class name in the catch statement");
}
- opnum_catch = get_next_op_number(CG(active_op_array));
+ opnum_catch = get_next_op_number();
if (i == 0 && j == 0) {
CG(active_op_array)->try_catch_array[try_catch_offset].catch_op = opnum_catch;
}
- opline = get_next_op(CG(active_op_array));
+ opline = get_next_op();
opline->opcode = ZEND_CATCH;
opline->op1_type = IS_CONST;
- opline->op1.constant = zend_add_class_name_literal(CG(active_op_array),
+ opline->op1.constant = zend_add_class_name_literal(
zend_resolve_class_name_ast(class_ast));
opline->extended_value = zend_alloc_cache_slot();
@@ -5210,7 +5037,7 @@ void zend_compile_try(zend_ast *ast) /* {{{ */
}
opline->result_type = IS_CV;
- opline->result.var = lookup_cv(CG(active_op_array), var_name);
+ opline->result.var = lookup_cv(var_name);
if (is_last_catch && is_last_class) {
opline->extended_value |= ZEND_LAST_CATCH;
@@ -5219,7 +5046,7 @@ void zend_compile_try(zend_ast *ast) /* {{{ */
if (!is_last_class) {
jmp_multicatch[j] = zend_emit_jump(0);
opline = &CG(active_op_array)->opcodes[opnum_catch];
- opline->op2.opline_num = get_next_op_number(CG(active_op_array));
+ opline->op2.opline_num = get_next_op_number();
}
}
@@ -5235,9 +5062,10 @@ void zend_compile_try(zend_ast *ast) /* {{{ */
jmp_opnums[i + 1] = zend_emit_jump(0);
}
+ ZEND_ASSERT(opnum_catch != (uint32_t)-1 && "Should have at least one class");
opline = &CG(active_op_array)->opcodes[opnum_catch];
if (!is_last_catch) {
- opline->op2.opline_num = get_next_op_number(CG(active_op_array));
+ opline->op2.opline_num = get_next_op_number();
}
}
@@ -5247,7 +5075,7 @@ void zend_compile_try(zend_ast *ast) /* {{{ */
if (finally_ast) {
zend_loop_var discard_exception;
- uint32_t opnum_jmp = get_next_op_number(CG(active_op_array)) + 1;
+ uint32_t opnum_jmp = get_next_op_number() + 1;
/* Pop FAST_CALL from unwind stack */
zend_stack_del_top(&CG(loop_var_stack));
@@ -5271,7 +5099,7 @@ void zend_compile_try(zend_ast *ast) /* {{{ */
CG(active_op_array)->try_catch_array[try_catch_offset].finally_op = opnum_jmp + 1;
CG(active_op_array)->try_catch_array[try_catch_offset].finally_end
- = get_next_op_number(CG(active_op_array));
+ = get_next_op_number();
opline = zend_emit_op(NULL, ZEND_FAST_RET, NULL, NULL);
opline->op1_type = IS_TMP_VAR;
@@ -5465,21 +5293,29 @@ ZEND_API void zend_set_function_arg_flags(zend_function *func) /* {{{ */
}
/* }}} */
-static void zend_compile_typename(zend_ast *ast, zend_arg_info *arg_info, zend_bool allow_null) /* {{{ */
+static zend_type zend_compile_typename(zend_ast *ast, zend_bool force_allow_null) /* {{{ */
{
+ zend_bool allow_null = force_allow_null;
+ zend_ast_attr orig_ast_attr = ast->attr;
+ zend_type type;
+ if (ast->attr & ZEND_TYPE_NULLABLE) {
+ allow_null = 1;
+ ast->attr &= ~ZEND_TYPE_NULLABLE;
+ }
+
if (ast->kind == ZEND_AST_TYPE) {
- arg_info->type = ZEND_TYPE_ENCODE(ast->attr, allow_null);
+ return ZEND_TYPE_ENCODE(ast->attr, allow_null);
} else {
zend_string *class_name = zend_ast_get_str(ast);
- zend_uchar type = zend_lookup_builtin_type_by_name(class_name);
+ zend_uchar type_code = zend_lookup_builtin_type_by_name(class_name);
- if (type != 0) {
+ if (type_code != 0) {
if ((ast->attr & ZEND_NAME_NOT_FQ) != ZEND_NAME_NOT_FQ) {
zend_error_noreturn(E_COMPILE_ERROR,
"Type declaration '%s' must be unqualified",
ZSTR_VAL(zend_string_tolower(class_name)));
}
- arg_info->type = ZEND_TYPE_ENCODE(type, allow_null);
+ type = ZEND_TYPE_ENCODE(type_code, allow_null);
} else {
uint32_t fetch_type = zend_get_class_fetch_type_ast(ast);
if (fetch_type == ZEND_FETCH_CLASS_DEFAULT) {
@@ -5490,9 +5326,12 @@ static void zend_compile_typename(zend_ast *ast, zend_arg_info *arg_info, zend_b
zend_string_addref(class_name);
}
- arg_info->type = ZEND_TYPE_ENCODE_CLASS(class_name, allow_null);
+ type = ZEND_TYPE_ENCODE_CLASS(class_name, allow_null);
}
}
+
+ ast->attr = orig_ast_attr;
+ return type;
}
/* }}} */
@@ -5504,21 +5343,12 @@ void zend_compile_params(zend_ast *ast, zend_ast *return_type_ast) /* {{{ */
zend_arg_info *arg_infos;
if (return_type_ast) {
- zend_bool allow_null = 0;
-
/* Use op_array->arg_info[-1] for return type */
arg_infos = safe_emalloc(sizeof(zend_arg_info), list->children + 1, 0);
arg_infos->name = NULL;
arg_infos->pass_by_reference = (op_array->fn_flags & ZEND_ACC_RETURN_REFERENCE) != 0;
arg_infos->is_variadic = 0;
- arg_infos->type = 0;
-
- if (return_type_ast->attr & ZEND_TYPE_NULLABLE) {
- allow_null = 1;
- return_type_ast->attr &= ~ZEND_TYPE_NULLABLE;
- }
-
- zend_compile_typename(return_type_ast, arg_infos, allow_null);
+ arg_infos->type = zend_compile_typename(return_type_ast, 0);
if (ZEND_TYPE_CODE(arg_infos->type) == IS_VOID && ZEND_TYPE_ALLOW_NULL(arg_infos->type)) {
zend_error_noreturn(E_COMPILE_ERROR, "Void type cannot be nullable");
@@ -5553,7 +5383,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), name);
+ var_node.u.op.var = lookup_cv(name);
if (EX_VAR_TO_NUM(var_node.u.op.var) != i) {
zend_error_noreturn(E_COMPILE_ERROR, "Redefinition of parameter $%s",
@@ -5589,10 +5419,6 @@ void zend_compile_params(zend_ast *ast, zend_ast *return_type_ast) /* {{{ */
op_array->required_num_args = i + 1;
}
- opline = zend_emit_op(NULL, opcode, NULL, &default_node);
- SET_NODE(opline->result, &var_node);
- opline->op1.num = i + 1;
-
arg_info = &arg_infos[i];
arg_info->name = zend_string_copy(name);
arg_info->pass_by_reference = is_ref;
@@ -5601,19 +5427,14 @@ void zend_compile_params(zend_ast *ast, zend_ast *return_type_ast) /* {{{ */
arg_info->type = ZEND_TYPE_ENCODE(0, 1);
if (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_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;
- allow_null = has_null_default || is_explicitly_nullable;
-
- type_ast->attr &= ~ZEND_TYPE_NULLABLE;
- zend_compile_typename(type_ast, arg_info, allow_null);
+ arg_info->type = zend_compile_typename(type_ast, has_null_default);
if (ZEND_TYPE_CODE(arg_info->type) == IS_VOID) {
zend_error_noreturn(E_COMPILE_ERROR, "void cannot be used as a parameter type");
@@ -5645,6 +5466,7 @@ void zend_compile_params(zend_ast *ast, zend_ast *return_type_ast) /* {{{ */
zend_error_noreturn(E_COMPILE_ERROR, "Default value for parameters "
"with a float type can only be float, integer, or NULL");
}
+ convert_to_double(&default_node.u.constant);
break;
case IS_ITERABLE:
@@ -5669,7 +5491,13 @@ void zend_compile_params(zend_ast *ast, zend_ast *return_type_ast) /* {{{ */
}
}
}
+ }
+
+ opline = zend_emit_op(NULL, opcode, NULL, &default_node);
+ SET_NODE(opline->result, &var_node);
+ opline->op1.num = i + 1;
+ if (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)) {
@@ -5715,17 +5543,10 @@ static void zend_compile_closure_binding(znode *closure, zend_op_array *op_array
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 = zval_make_interned_string(zend_ast_get_zval(var_name_ast));
- uint32_t by_ref = var_name_ast->attr;
+ uint32_t mode = var_name_ast->attr;
zend_op *opline;
zval *value;
@@ -5743,15 +5564,119 @@ static void zend_compile_closure_binding(znode *closure, zend_op_array *op_array
"Cannot use variable $%s twice", ZSTR_VAL(var_name));
}
+ CG(zend_lineno) = zend_ast_get_lineno(var_name_ast);
+
opline = zend_emit_op(NULL, ZEND_BIND_LEXICAL, closure, NULL);
opline->op2_type = IS_CV;
- 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;
+ opline->op2.var = lookup_cv(var_name);
+ opline->extended_value =
+ (uint32_t)((char*)value - (char*)op_array->static_variables->arData) | mode;
}
}
/* }}} */
-void zend_compile_closure_uses(zend_ast *ast) /* {{{ */
+typedef struct {
+ HashTable uses;
+ zend_bool varvars_used;
+} closure_info;
+
+static void find_implicit_binds_recursively(closure_info *info, zend_ast *ast) {
+ if (!ast) {
+ return;
+ }
+
+ if (ast->kind == ZEND_AST_VAR) {
+ zend_ast *name_ast = ast->child[0];
+ if (name_ast->kind == ZEND_AST_ZVAL && Z_TYPE_P(zend_ast_get_zval(name_ast)) == IS_STRING) {
+ zend_string *name = zend_ast_get_str(name_ast);
+ if (zend_is_auto_global(name)) {
+ /* These is no need to explicitly import auto-globals. */
+ return;
+ }
+
+ if (zend_string_equals_literal(name, "this")) {
+ /* $this does not need to be explicitly imported. */
+ return;
+ }
+
+ zend_hash_add_empty_element(&info->uses, name);
+ } else {
+ info->varvars_used = 1;
+ find_implicit_binds_recursively(info, name_ast);
+ }
+ } else 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++) {
+ find_implicit_binds_recursively(info, list->child[i]);
+ }
+ } else if (ast->kind == ZEND_AST_CLOSURE) {
+ /* For normal closures add the use() list. */
+ zend_ast_decl *closure_ast = (zend_ast_decl *) ast;
+ zend_ast *uses_ast = closure_ast->child[1];
+ if (uses_ast) {
+ zend_ast_list *uses_list = zend_ast_get_list(uses_ast);
+ uint32_t i;
+ for (i = 0; i < uses_list->children; i++) {
+ zend_hash_add_empty_element(&info->uses, zend_ast_get_str(uses_list->child[i]));
+ }
+ }
+ } else if (ast->kind == ZEND_AST_ARROW_FUNC) {
+ /* For arrow functions recursively check the expression. */
+ zend_ast_decl *closure_ast = (zend_ast_decl *) ast;
+ find_implicit_binds_recursively(info, closure_ast->child[2]);
+ } else if (!zend_ast_is_special(ast)) {
+ uint32_t i, children = zend_ast_get_num_children(ast);
+ for (i = 0; i < children; i++) {
+ find_implicit_binds_recursively(info, ast->child[i]);
+ }
+ }
+}
+
+static void find_implicit_binds(closure_info *info, zend_ast *params_ast, zend_ast *stmt_ast)
+{
+ zend_ast_list *param_list = zend_ast_get_list(params_ast);
+ uint32_t i;
+
+ zend_hash_init(&info->uses, param_list->children, NULL, NULL, 0);
+
+ find_implicit_binds_recursively(info, stmt_ast);
+
+ /* Remove variables that are parameters */
+ for (i = 0; i < param_list->children; i++) {
+ zend_ast *param_ast = param_list->child[i];
+ zend_hash_del(&info->uses, zend_ast_get_str(param_ast->child[1]));
+ }
+}
+
+static void compile_implicit_lexical_binds(
+ closure_info *info, znode *closure, zend_op_array *op_array)
+{
+ zend_string *var_name;
+ zend_op *opline;
+
+ /* TODO We might want to use a special binding mode if varvars_used is set. */
+ if (zend_hash_num_elements(&info->uses) == 0) {
+ return;
+ }
+
+ if (!op_array->static_variables) {
+ op_array->static_variables = zend_new_array(8);
+ }
+
+ ZEND_HASH_FOREACH_STR_KEY(&info->uses, var_name)
+ zval *value = zend_hash_add(
+ op_array->static_variables, var_name, &EG(uninitialized_zval));
+ uint32_t offset = (uint32_t)((char*)value - (char*)op_array->static_variables->arData);
+
+ opline = zend_emit_op(NULL, ZEND_BIND_LEXICAL, closure, NULL);
+ opline->op2_type = IS_CV;
+ opline->op2.var = lookup_cv(var_name);
+ opline->extended_value = offset | ZEND_BIND_IMPLICIT;
+ ZEND_HASH_FOREACH_END();
+}
+
+static void zend_compile_closure_uses(zend_ast *ast) /* {{{ */
{
zend_op_array *op_array = CG(active_op_array);
zend_ast_list *list = zend_ast_get_list(ast);
@@ -5760,7 +5685,6 @@ 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);
- uint32_t by_ref = var_ast->attr;
zval zv;
ZVAL_NULL(&zv);
@@ -5774,11 +5698,23 @@ void zend_compile_closure_uses(zend_ast *ast) /* {{{ */
}
}
- zend_compile_static_var_common(var_ast, &zv, by_ref);
+ CG(zend_lineno) = zend_ast_get_lineno(var_ast);
+
+ zend_compile_static_var_common(var_name, &zv, var_ast->attr ? ZEND_BIND_REF : 0);
}
}
/* }}} */
+static void zend_compile_implicit_closure_uses(closure_info *info)
+{
+ zend_string *var_name;
+ ZEND_HASH_FOREACH_STR_KEY(&info->uses, var_name)
+ zval zv;
+ ZVAL_NULL(&zv);
+ zend_compile_static_var_common(var_name, &zv, ZEND_BIND_IMPLICIT);
+ ZEND_HASH_FOREACH_END();
+}
+
void zend_begin_method_decl(zend_op_array *op_array, zend_string *name, zend_bool has_body) /* {{{ */
{
zend_class_entry *ce = CG(active_class_entry);
@@ -5879,6 +5815,16 @@ 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 (zend_string_equals_literal(lcname, "serialize")) {
+ ce->serialize_func = (zend_function *) op_array;
+ if (!is_static) {
+ op_array->fn_flags |= ZEND_ACC_ALLOW_STATIC;
+ }
+ } else if (zend_string_equals_literal(lcname, "unserialize")) {
+ ce->unserialize_func = (zend_function *) op_array;
+ if (!is_static) {
+ op_array->fn_flags |= ZEND_ACC_ALLOW_STATIC;
+ }
} else if (ZSTR_VAL(lcname)[0] != '_' || ZSTR_VAL(lcname)[1] != '_') {
if (!is_static) {
op_array->fn_flags |= ZEND_ACC_ALLOW_STATIC;
@@ -5955,7 +5901,7 @@ void zend_begin_method_decl(zend_op_array *op_array, zend_string *name, zend_boo
}
/* }}} */
-static void zend_begin_func_decl(znode *result, zend_op_array *op_array, zend_ast_decl *decl) /* {{{ */
+static void zend_begin_func_decl(znode *result, zend_op_array *op_array, zend_ast_decl *decl, zend_bool toplevel) /* {{{ */
{
zend_ast *params_ast = decl->child[0];
zend_string *unqualified_name, *name, *lcname, *key;
@@ -5989,28 +5935,40 @@ static void zend_begin_func_decl(znode *result, zend_op_array *op_array, zend_as
"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);
+ if (toplevel) {
+ if (UNEXPECTED(zend_hash_add_ptr(CG(function_table), lcname, op_array) == NULL)) {
+ do_bind_function_error(lcname, op_array, 1);
+ }
+ zend_string_release_ex(lcname, 0);
+ return;
+ }
+
+ /* Generate RTD keys until we find one that isn't in use yet. */
+ key = NULL;
+ do {
+ zend_tmp_string_release(key);
+ key = zend_build_runtime_definition_key(lcname, decl->start_lineno);
+ } while (!zend_hash_add_ptr(CG(function_table), key, op_array));
if (op_array->fn_flags & ZEND_ACC_CLOSURE) {
opline = zend_emit_op_tmp(result, ZEND_DECLARE_LAMBDA_FUNCTION, NULL, NULL);
+ opline->extended_value = zend_alloc_cache_slot();
opline->op1_type = IS_CONST;
LITERAL_STR(opline->op1, key);
} else {
- opline = get_next_op(CG(active_op_array));
+ opline = get_next_op();
opline->opcode = ZEND_DECLARE_FUNCTION;
opline->op1_type = IS_CONST;
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);
+ zend_add_literal_string(&key);
}
-
zend_string_release_ex(lcname, 0);
}
/* }}} */
-void zend_compile_func_decl(znode *result, zend_ast *ast) /* {{{ */
+void zend_compile_func_decl(znode *result, zend_ast *ast, zend_bool toplevel) /* {{{ */
{
zend_ast_decl *decl = (zend_ast_decl *) ast;
zend_ast *params_ast = decl->child[0];
@@ -6019,12 +5977,24 @@ void zend_compile_func_decl(znode *result, zend_ast *ast) /* {{{ */
zend_ast *return_type_ast = decl->child[3];
zend_bool is_method = decl->kind == ZEND_AST_METHOD;
+ zend_class_entry *orig_class_entry = CG(active_class_entry);
zend_op_array *orig_op_array = CG(active_op_array);
zend_op_array *op_array = zend_arena_alloc(&CG(arena), sizeof(zend_op_array));
zend_oparray_context orig_oparray_context;
+ closure_info info;
+ memset(&info, 0, sizeof(closure_info));
init_op_array(op_array, ZEND_USER_FUNCTION, INITIAL_OP_ARRAY_SIZE);
+ if (CG(compiler_options) & ZEND_COMPILE_PRELOAD) {
+ op_array->fn_flags |= ZEND_ACC_PRELOADED;
+ ZEND_MAP_PTR_NEW(op_array->run_time_cache);
+ ZEND_MAP_PTR_NEW(op_array->static_variables_ptr);
+ } else {
+ ZEND_MAP_PTR_INIT(op_array->run_time_cache, zend_arena_alloc(&CG(arena), sizeof(void*)));
+ ZEND_MAP_PTR_SET(op_array->run_time_cache, NULL);
+ }
+
op_array->fn_flags |= (orig_op_array->fn_flags & ZEND_ACC_STRICT_TYPES);
op_array->fn_flags |= decl->flags;
op_array->line_start = decl->start_lineno;
@@ -6032,7 +6002,7 @@ void zend_compile_func_decl(znode *result, zend_ast *ast) /* {{{ */
if (decl->doc_comment) {
op_array->doc_comment = zend_string_copy(decl->doc_comment);
}
- if (decl->kind == ZEND_AST_CLOSURE) {
+ if (decl->kind == ZEND_AST_CLOSURE || decl->kind == ZEND_AST_ARROW_FUNC) {
op_array->fn_flags |= ZEND_ACC_CLOSURE;
}
@@ -6040,17 +6010,31 @@ void zend_compile_func_decl(znode *result, zend_ast *ast) /* {{{ */
zend_bool has_body = stmt_ast != NULL;
zend_begin_method_decl(op_array, decl->name, has_body);
} else {
- zend_begin_func_decl(result, op_array, decl);
- if (uses_ast) {
+ zend_begin_func_decl(result, op_array, decl, toplevel);
+ if (decl->kind == ZEND_AST_ARROW_FUNC) {
+ find_implicit_binds(&info, params_ast, stmt_ast);
+ compile_implicit_lexical_binds(&info, result, op_array);
+ } else if (uses_ast) {
zend_compile_closure_binding(result, op_array, uses_ast);
}
}
CG(active_op_array) = op_array;
+ /* Do not leak the class scope into free standing functions, even if they are dynamically
+ * defined inside a class method. This is necessary for correct handling of magic constants.
+ * For example __CLASS__ should always be "" inside a free standing function. */
+ if (decl->kind == ZEND_AST_FUNC_DECL) {
+ CG(active_class_entry) = NULL;
+ }
+
+ if (toplevel) {
+ op_array->fn_flags |= ZEND_ACC_TOP_LEVEL;
+ }
+
zend_oparray_context_begin(&orig_oparray_context);
- if (CG(compiler_options) & ZEND_COMPILE_EXTENDED_INFO) {
+ if (CG(compiler_options) & ZEND_COMPILE_EXTENDED_STMT) {
zend_op *opline_ext = zend_emit_op(NULL, ZEND_EXT_NOP, NULL, NULL);
opline_ext->lineno = decl->start_lineno;
}
@@ -6068,7 +6052,10 @@ void zend_compile_func_decl(znode *result, zend_ast *ast) /* {{{ */
zend_mark_function_as_generator();
zend_emit_op(NULL, ZEND_GENERATOR_CREATE, NULL, NULL);
}
- if (uses_ast) {
+ if (decl->kind == ZEND_AST_ARROW_FUNC) {
+ zend_compile_implicit_closure_uses(&info);
+ zend_hash_destroy(&info.uses);
+ } else if (uses_ast) {
zend_compile_closure_uses(uses_ast);
}
zend_compile_stmt(stmt_ast);
@@ -6081,7 +6068,7 @@ void zend_compile_func_decl(znode *result, zend_ast *ast) /* {{{ */
/* put the implicit return on the really last line */
CG(zend_lineno) = decl->end_lineno;
- zend_do_extended_info();
+ zend_do_extended_stmt();
zend_emit_final_return(0);
pass_two(CG(active_op_array));
@@ -6091,13 +6078,13 @@ void zend_compile_func_decl(znode *result, zend_ast *ast) /* {{{ */
zend_stack_del_top(&CG(loop_var_stack));
CG(active_op_array) = orig_op_array;
+ CG(active_class_entry) = orig_class_entry;
}
/* }}} */
-void zend_compile_prop_decl(zend_ast *ast) /* {{{ */
+void zend_compile_prop_decl(zend_ast *ast, zend_ast *type_ast, uint32_t flags) /* {{{ */
{
zend_ast_list *list = zend_ast_get_list(ast);
- uint32_t flags = list->attr;
zend_class_entry *ce = CG(active_class_entry);
uint32_t i, children = list->children;
@@ -6117,6 +6104,19 @@ void zend_compile_prop_decl(zend_ast *ast) /* {{{ */
zend_string *name = zval_make_interned_string(zend_ast_get_zval(name_ast));
zend_string *doc_comment = NULL;
zval value_zv;
+ zend_type type = 0;
+
+ if (type_ast) {
+ type = zend_compile_typename(type_ast, 0);
+
+ if (ZEND_TYPE_CODE(type) == IS_VOID || ZEND_TYPE_CODE(type) == IS_CALLABLE) {
+ zend_error_noreturn(E_COMPILE_ERROR,
+ "Property %s::$%s cannot have type %s",
+ ZSTR_VAL(ce->name),
+ ZSTR_VAL(name),
+ zend_get_type_by_const(ZEND_TYPE_CODE(type)));
+ }
+ }
/* Doc comment has been appended as last element in ZEND_AST_PROP_ELEM ast */
if (doc_comment_ast) {
@@ -6136,15 +6136,59 @@ void zend_compile_prop_decl(zend_ast *ast) /* {{{ */
if (value_ast) {
zend_const_expr_to_zval(&value_zv, value_ast);
- } else {
+
+ if (ZEND_TYPE_IS_SET(type) && !Z_CONSTANT(value_zv)) {
+ if (Z_TYPE(value_zv) == IS_NULL) {
+ if (!ZEND_TYPE_ALLOW_NULL(type)) {
+ const char *name = ZEND_TYPE_IS_CLASS(type)
+ ? ZSTR_VAL(ZEND_TYPE_NAME(type)) : zend_get_type_by_const(ZEND_TYPE_CODE(type));
+ zend_error_noreturn(E_COMPILE_ERROR,
+ "Default value for property of type %s may not be null. "
+ "Use the nullable type ?%s to allow null default value",
+ name, name);
+ }
+ } else if (ZEND_TYPE_IS_CLASS(type)) {
+ zend_error_noreturn(E_COMPILE_ERROR,
+ "Property of type %s may not have default value", ZSTR_VAL(ZEND_TYPE_NAME(type)));
+ } else if (ZEND_TYPE_CODE(type) == IS_ARRAY || ZEND_TYPE_CODE(type) == IS_ITERABLE) {
+ if (Z_TYPE(value_zv) != IS_ARRAY) {
+ zend_error_noreturn(E_COMPILE_ERROR,
+ "Default value for property of type %s can only be an array",
+ zend_get_type_by_const(ZEND_TYPE_CODE(type)));
+ }
+ } else if (ZEND_TYPE_CODE(type) == IS_DOUBLE) {
+ if (Z_TYPE(value_zv) != IS_DOUBLE && Z_TYPE(value_zv) != IS_LONG) {
+ zend_error_noreturn(E_COMPILE_ERROR,
+ "Default value for property of type float can only be float or int");
+ }
+ convert_to_double(&value_zv);
+ } else if (!ZEND_SAME_FAKE_TYPE(ZEND_TYPE_CODE(type), Z_TYPE(value_zv))) {
+ zend_error_noreturn(E_COMPILE_ERROR,
+ "Default value for property of type %s can only be %s",
+ zend_get_type_by_const(ZEND_TYPE_CODE(type)),
+ zend_get_type_by_const(ZEND_TYPE_CODE(type)));
+ }
+ }
+ } else if (!ZEND_TYPE_IS_SET(type)) {
ZVAL_NULL(&value_zv);
+ } else {
+ ZVAL_UNDEF(&value_zv);
}
- zend_declare_property_ex(ce, name, &value_zv, flags, doc_comment);
+ zend_declare_typed_property(ce, name, &value_zv, flags, doc_comment, type);
}
}
/* }}} */
+void zend_compile_prop_group(zend_ast *list) /* {{{ */
+{
+ zend_ast *type_ast = list->child[0];
+ zend_ast *prop_ast = list->child[1];
+
+ zend_compile_prop_decl(prop_ast, type_ast, list->attr);
+}
+/* }}} */
+
void zend_compile_class_const_decl(zend_ast *ast) /* {{{ */
{
zend_ast_list *list = zend_ast_get_list(ast);
@@ -6251,9 +6295,11 @@ void zend_compile_use_trait(zend_ast *ast) /* {{{ */
zend_ast_list *traits = zend_ast_get_list(ast->child[0]);
zend_ast_list *adaptations = ast->child[1] ? zend_ast_get_list(ast->child[1]) : NULL;
zend_class_entry *ce = CG(active_class_entry);
- zend_op *opline;
uint32_t i;
+ ce->ce_flags |= ZEND_ACC_IMPLEMENT_TRAITS;
+ ce->trait_names = erealloc(ce->trait_names, sizeof(zend_class_name) * (ce->num_traits + traits->children));
+
for (i = 0; i < traits->children; ++i) {
zend_ast *trait_ast = traits->child[i];
zend_string *name = zend_ast_get_str(trait_ast);
@@ -6272,13 +6318,8 @@ void zend_compile_use_trait(zend_ast *ast) /* {{{ */
break;
}
- opline = get_next_op(CG(active_op_array));
- opline->opcode = ZEND_ADD_TRAIT;
- SET_NODE(opline->op1, &FC(implementing_class));
- opline->op2_type = IS_CONST;
- opline->op2.constant = zend_add_class_name_literal(CG(active_op_array),
- zend_resolve_class_name_ast(trait_ast));
-
+ ce->trait_names[ce->num_traits].name = zend_resolve_class_name_ast(trait_ast);
+ ce->trait_names[ce->num_traits].lc_name = zend_string_tolower(ce->trait_names[ce->num_traits].name);
ce->num_traits++;
}
@@ -6301,46 +6342,45 @@ void zend_compile_use_trait(zend_ast *ast) /* {{{ */
}
/* }}} */
-void zend_compile_implements(znode *class_node, zend_ast *ast) /* {{{ */
+void zend_compile_implements(zend_ast *ast) /* {{{ */
{
zend_ast_list *list = zend_ast_get_list(ast);
+ zend_class_entry *ce = CG(active_class_entry);
+ zend_class_name *interface_names;
uint32_t i;
+
+ interface_names = emalloc(sizeof(zend_class_name) * list->children);
+
for (i = 0; i < list->children; ++i) {
zend_ast *class_ast = list->child[i];
zend_string *name = zend_ast_get_str(class_ast);
- zend_op *opline;
-
if (!zend_is_const_default_class_ref(class_ast)) {
+ efree(interface_names);
zend_error_noreturn(E_COMPILE_ERROR,
"Cannot use '%s' as interface name as it is reserved", ZSTR_VAL(name));
}
- opline = zend_emit_op(NULL, ZEND_ADD_INTERFACE, class_node, NULL);
- opline->op2_type = IS_CONST;
- opline->op2.constant = zend_add_class_name_literal(CG(active_op_array),
- zend_resolve_class_name_ast(class_ast));
-
- CG(active_class_entry)->num_interfaces++;
+ interface_names[i].name = zend_resolve_class_name_ast(class_ast);
+ interface_names[i].lc_name = zend_string_tolower(interface_names[i].name);
}
+
+ ce->ce_flags |= ZEND_ACC_IMPLEMENT_INTERFACES;
+ ce->num_interfaces = list->children;
+ ce->interface_names = interface_names;
}
/* }}} */
-static zend_string *zend_generate_anon_class_name(unsigned char *lex_pos) /* {{{ */
+static zend_string *zend_generate_anon_class_name(uint32_t start_lineno) /* {{{ */
{
- zend_string *result;
- char char_pos_buf[32];
- size_t char_pos_len = zend_sprintf(char_pos_buf, "%p", lex_pos);
zend_string *filename = CG(active_op_array)->filename;
-
- /* NULL, name length, filename length, last accepting char position length */
- result = zend_string_alloc(sizeof("class@anonymous") + ZSTR_LEN(filename) + char_pos_len, 0);
- sprintf(ZSTR_VAL(result), "class@anonymous%c%s%s", '\0', ZSTR_VAL(filename), char_pos_buf);
+ zend_string *result = zend_strpprintf(0, "class@anonymous%c%s:%" PRIu32 "$%" PRIx32,
+ '\0', ZSTR_VAL(filename), start_lineno, CG(rtd_key_counter)++);
return zend_new_interned_string(result);
}
/* }}} */
-void zend_compile_class_decl(zend_ast *ast) /* {{{ */
+zend_op *zend_compile_class_decl(zend_ast *ast, zend_bool toplevel) /* {{{ */
{
zend_ast_decl *decl = (zend_ast_decl *) ast;
zend_ast *extends_ast = decl->child[0];
@@ -6349,11 +6389,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;
- int extends_const;
zend_class_entry *original_ce = CG(active_class_entry);
- znode original_implementing_class = FC(implementing_class);
if (EXPECTED((decl->flags & ZEND_ACC_ANON_CLASS) == 0)) {
zend_string *unqualified_name = decl->name;
@@ -6378,8 +6415,15 @@ void zend_compile_class_decl(zend_ast *ast) /* {{{ */
zend_register_seen_symbol(lcname, ZEND_SYMBOL_CLASS);
} else {
- name = zend_generate_anon_class_name(decl->lex_pos);
- lcname = zend_string_tolower(name);
+ /* Find an anon class name that is not in use yet. */
+ name = NULL;
+ lcname = NULL;
+ do {
+ zend_tmp_string_release(name);
+ zend_tmp_string_release(lcname);
+ name = zend_generate_anon_class_name(decl->start_lineno);
+ lcname = zend_string_tolower(name);
+ } while (zend_hash_exists(CG(class_table), lcname));
}
lcname = zend_new_interned_string(lcname);
@@ -6387,6 +6431,11 @@ void zend_compile_class_decl(zend_ast *ast) /* {{{ */
ce->name = name;
zend_initialize_class_data(ce, 1);
+ if (CG(compiler_options) & ZEND_COMPILE_PRELOAD) {
+ ce->ce_flags |= ZEND_ACC_PRELOADED;
+ ZEND_MAP_PTR_NEW(ce->static_members_table);
+ }
+
ce->ce_flags |= decl->flags;
ce->info.user.filename = zend_get_compiled_filename();
ce->info.user.line_start = decl->start_lineno;
@@ -6417,79 +6466,12 @@ void zend_compile_class_decl(zend_ast *ast) /* {{{ */
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));
+ ce->parent_name = 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;
}
- opline = get_next_op(CG(active_op_array));
- zend_make_var_result(&declare_node, opline);
-
- GET_NODE(&FC(implementing_class), opline->result);
-
- opline->op1_type = IS_CONST;
- LITERAL_STR(opline->op1, lcname);
-
- if (decl->flags & ZEND_ACC_ANON_CLASS) {
- if (extends_ast) {
- opline->opcode = ZEND_DECLARE_ANON_INHERITED_CLASS;
- opline->op2_type = IS_CONST;
- opline->op2.constant = extends_const;
- } else {
- opline->opcode = ZEND_DECLARE_ANON_CLASS;
- }
-
- if (!zend_hash_exists(CG(class_table), lcname)) {
- zend_hash_add_ptr(CG(class_table), lcname, ce);
- } else {
- /* This anonymous class has been included, reuse the existing definition.
- * NB: This behavior is buggy, and this should always result in a separate
- * class declaration. However, until the problem of RTD key collisions is
- * solved, this gives a behavior close to what is expected. */
- zval zv;
- ZVAL_PTR(&zv, ce);
- destroy_zend_class(&zv);
- ce = zend_hash_find_ptr(CG(class_table), lcname);
-
- /* Manually replicate emission of necessary inheritance opcodes here. We cannot
- * reuse the general code, as we only want to emit the opcodes, without modifying
- * the reused class definition. */
- if (ce->ce_flags & ZEND_ACC_IMPLEMENT_TRAITS) {
- zend_emit_op(NULL, ZEND_BIND_TRAITS, &declare_node, NULL);
- }
- if (implements_ast) {
- zend_ast_list *iface_list = zend_ast_get_list(implements_ast);
- uint32_t i;
- for (i = 0; i < iface_list->children; i++) {
- opline = zend_emit_op(NULL, ZEND_ADD_INTERFACE, &declare_node, NULL);
- opline->op2_type = IS_CONST;
- opline->op2.constant = zend_add_class_name_literal(CG(active_op_array),
- zend_resolve_class_name_ast(iface_list->child[i]));
- }
- zend_emit_op(NULL, ZEND_VERIFY_ABSTRACT_CLASS, &declare_node, NULL);
- }
- return;
- }
- } else {
- zend_string *key;
-
- if (extends_ast) {
- opline->opcode = ZEND_DECLARE_INHERITED_CLASS;
- opline->op2_type = IS_CONST;
- opline->op2.constant = extends_const;
- } else {
- opline->opcode = ZEND_DECLARE_CLASS;
- }
-
- key = zend_build_runtime_definition_key(lcname, decl->lex_pos);
- /* RTD key is placed after lcname literal in op1 */
- zend_add_literal_string(CG(active_op_array), &key);
-
- zend_hash_update_ptr(CG(class_table), key, ce);
- }
-
CG(active_class_entry) = ce;
zend_compile_stmt(stmt_ast);
@@ -6497,7 +6479,7 @@ void zend_compile_class_decl(zend_ast *ast) /* {{{ */
/* Reset lineno for final opcodes and errors */
CG(zend_lineno) = ast->lineno;
- if (ce->num_traits == 0) {
+ if (!(ce->ce_flags & ZEND_ACC_IMPLEMENT_TRAITS)) {
/* For traits this check is delayed until after trait binding */
zend_check_deprecated_constructor(ce);
}
@@ -6531,47 +6513,102 @@ void zend_compile_class_decl(zend_ast *ast) /* {{{ */
ZSTR_VAL(ce->name), ZSTR_VAL(ce->clone->common.function_name));
} else if (ce->clone->common.fn_flags & ZEND_ACC_HAS_RETURN_TYPE) {
zend_error_noreturn(E_COMPILE_ERROR,
- "%s::%s() cannot declare a return type",
+ "Clone method %s::%s() cannot declare a return type",
ZSTR_VAL(ce->name), ZSTR_VAL(ce->clone->common.function_name));
}
}
- /* Check for traits and proceed like with interfaces.
- * The only difference will be a combined handling of them in the end.
- * Thus, we need another opcode here. */
- if (ce->num_traits > 0) {
- ce->traits = NULL;
- ce->num_traits = 0;
- ce->ce_flags |= ZEND_ACC_IMPLEMENT_TRAITS;
+ if (implements_ast) {
+ zend_compile_implements(implements_ast);
+ }
- zend_emit_op(NULL, ZEND_BIND_TRAITS, &declare_node, NULL);
+ if ((ce->ce_flags & (ZEND_ACC_IMPLICIT_ABSTRACT_CLASS|ZEND_ACC_INTERFACE|ZEND_ACC_TRAIT|ZEND_ACC_EXPLICIT_ABSTRACT_CLASS)) == ZEND_ACC_IMPLICIT_ABSTRACT_CLASS) {
+ zend_verify_abstract_class(ce);
}
- if (implements_ast) {
- zend_compile_implements(&declare_node, implements_ast);
+ CG(active_class_entry) = original_ce;
+
+ if (toplevel) {
+ ce->ce_flags |= ZEND_ACC_TOP_LEVEL;
}
- if (!(ce->ce_flags & (ZEND_ACC_INTERFACE|ZEND_ACC_EXPLICIT_ABSTRACT_CLASS))
- && (extends_ast || implements_ast)
- ) {
- zend_verify_abstract_class(ce);
- if (implements_ast) {
- zend_emit_op(NULL, ZEND_VERIFY_ABSTRACT_CLASS, &declare_node, NULL);
+ if (toplevel
+ /* We currently don't early-bind classes that implement interfaces or use traits */
+ && !(ce->ce_flags & (ZEND_ACC_IMPLEMENT_INTERFACES|ZEND_ACC_IMPLEMENT_TRAITS))
+ && !(CG(compiler_options) & ZEND_COMPILE_PRELOAD)) {
+ if (extends_ast) {
+ zend_class_entry *parent_ce = zend_lookup_class_ex(
+ ce->parent_name, NULL, ZEND_FETCH_CLASS_NO_AUTOLOAD);
+
+ if (parent_ce
+ && ((parent_ce->type != ZEND_INTERNAL_CLASS) || !(CG(compiler_options) & ZEND_COMPILE_IGNORE_INTERNAL_CLASSES))
+ && ((parent_ce->type != ZEND_USER_CLASS) || !(CG(compiler_options) & ZEND_COMPILE_IGNORE_OTHER_FILES) || (parent_ce->info.user.filename == ce->info.user.filename))) {
+
+ CG(zend_lineno) = decl->end_lineno;
+ if (zend_try_early_bind(ce, parent_ce, lcname, NULL)) {
+ CG(zend_lineno) = ast->lineno;
+ zend_string_release(lcname);
+ return NULL;
+ }
+ CG(zend_lineno) = ast->lineno;
+ }
+ } else {
+ if (EXPECTED(zend_hash_add_ptr(CG(class_table), lcname, ce) != NULL)) {
+ zend_string_release(lcname);
+ zend_build_properties_info_table(ce);
+ ce->ce_flags |= ZEND_ACC_LINKED;
+ return NULL;
+ }
}
}
- /* Inherit interfaces; reset number to zero, we need it for above check and
- * will restore it during actual implementation.
- * The ZEND_ACC_IMPLEMENT_INTERFACES flag disables double call to
- * zend_verify_abstract_class() */
- if (ce->num_interfaces > 0) {
- ce->interfaces = NULL;
- ce->num_interfaces = 0;
- ce->ce_flags |= ZEND_ACC_IMPLEMENT_INTERFACES;
+ opline = get_next_op();
+
+ if (ce->parent_name) {
+ /* Lowercased parent name */
+ zend_string *lc_parent_name = zend_string_tolower(ce->parent_name);
+ opline->op2_type = IS_CONST;
+ LITERAL_STR(opline->op2, lc_parent_name);
}
- FC(implementing_class) = original_implementing_class;
- CG(active_class_entry) = original_ce;
+ opline->op1_type = IS_CONST;
+ LITERAL_STR(opline->op1, lcname);
+
+ if (decl->flags & ZEND_ACC_ANON_CLASS) {
+ opline->opcode = ZEND_DECLARE_ANON_CLASS;
+ opline->extended_value = zend_alloc_cache_slot();
+ opline->result_type = IS_VAR;
+ opline->result.var = get_temporary_variable();
+ if (!zend_hash_add_ptr(CG(class_table), lcname, ce)) {
+ /* We checked above that the class name is not used. This really shouldn't happen. */
+ zend_error_noreturn(E_ERROR,
+ "Runtime definition key collision for %s. This is a bug", ZSTR_VAL(name));
+ }
+ } else {
+ /* Generate RTD keys until we find one that isn't in use yet. */
+ zend_string *key = NULL;
+ do {
+ zend_tmp_string_release(key);
+ key = zend_build_runtime_definition_key(lcname, decl->start_lineno);
+ } while (!zend_hash_add_ptr(CG(class_table), key, ce));
+
+ /* RTD key is placed after lcname literal in op1 */
+ zend_add_literal_string(&key);
+
+ opline->opcode = ZEND_DECLARE_CLASS;
+ if (extends_ast && toplevel
+ && (CG(compiler_options) & ZEND_COMPILE_DELAYED_BINDING)
+ /* We currently don't early-bind classes that implement interfaces or use traits */
+ && !(ce->ce_flags & (ZEND_ACC_IMPLEMENT_INTERFACES|ZEND_ACC_IMPLEMENT_TRAITS))
+ ) {
+ CG(active_op_array)->fn_flags |= ZEND_ACC_EARLY_BINDING;
+ opline->opcode = ZEND_DECLARE_CLASS_DELAYED;
+ opline->extended_value = zend_alloc_cache_slot();
+ opline->result_type = IS_UNUSED;
+ opline->result.opline_num = -1;
+ }
+ }
+ return opline;
}
/* }}} */
@@ -6910,17 +6947,20 @@ static zend_bool zend_try_ct_eval_magic_const(zval *zv, zend_ast *ast) /* {{{ */
}
break;
case T_METHOD_C:
- if ((op_array && !op_array->scope && op_array->function_name) || (op_array->fn_flags & ZEND_ACC_CLOSURE)) {
- ZVAL_STR_COPY(zv, op_array->function_name);
- } else if (ce) {
- if (op_array && op_array->function_name) {
- ZVAL_NEW_STR(zv, zend_concat3(ZSTR_VAL(ce->name), ZSTR_LEN(ce->name), "::", 2,
+ /* Detect whether we are directly inside a class (e.g. a class constant) and treat
+ * this as not being inside a function. */
+ if (op_array && ce && !op_array->scope && !(op_array->fn_flags & ZEND_ACC_CLOSURE)) {
+ op_array = NULL;
+ }
+ if (op_array && op_array->function_name) {
+ if (op_array->scope) {
+ ZVAL_NEW_STR(zv, zend_concat3(
+ ZSTR_VAL(op_array->scope->name), ZSTR_LEN(op_array->scope->name),
+ "::", 2,
ZSTR_VAL(op_array->function_name), ZSTR_LEN(op_array->function_name)));
} else {
- ZVAL_STR_COPY(zv, ce->name);
+ ZVAL_STR_COPY(zv, op_array->function_name);
}
- } else if (op_array && op_array->function_name) {
- ZVAL_STR_COPY(zv, op_array->function_name);
} else {
ZVAL_EMPTY_STRING(zv);
}
@@ -6986,6 +7026,16 @@ ZEND_API zend_bool zend_binary_op_produces_numeric_string_error(uint32_t opcode,
}
/* }}} */
+ZEND_API zend_bool zend_binary_op_produces_array_conversion_error(uint32_t opcode, zval *op1, zval *op2) /* {{{ */
+{
+ if (opcode == ZEND_CONCAT && (Z_TYPE_P(op1) == IS_ARRAY || Z_TYPE_P(op2) == IS_ARRAY)) {
+ return 1;
+ }
+
+ return 0;
+}
+/* }}} */
+
static inline zend_bool zend_try_ct_eval_binary_op(zval *result, uint32_t opcode, zval *op1, zval *op2) /* {{{ */
{
binary_op_type fn = get_binary_op(opcode);
@@ -7003,6 +7053,10 @@ static inline zend_bool zend_try_ct_eval_binary_op(zval *result, uint32_t opcode
if (zend_binary_op_produces_numeric_string_error(opcode, op1, op2)) {
return 0;
}
+ /* don't evaluate array to string conversions at compile-time */
+ if (zend_binary_op_produces_array_conversion_error(opcode, op1, op2)) {
+ return 0;
+ }
fn(result, op1, op2);
return 1;
@@ -7055,13 +7109,21 @@ static zend_bool zend_try_ct_eval_array(zval *result, zend_ast *ast) /* {{{ */
zend_error(E_COMPILE_ERROR, "Cannot use empty array elements in arrays");
}
- zend_eval_const_expr(&elem_ast->child[0]);
- zend_eval_const_expr(&elem_ast->child[1]);
+ if (elem_ast->kind != ZEND_AST_UNPACK) {
+ zend_eval_const_expr(&elem_ast->child[0]);
+ zend_eval_const_expr(&elem_ast->child[1]);
- if (elem_ast->attr /* by_ref */ || elem_ast->child[0]->kind != ZEND_AST_ZVAL
- || (elem_ast->child[1] && elem_ast->child[1]->kind != ZEND_AST_ZVAL)
- ) {
- is_constant = 0;
+ if (elem_ast->attr /* by_ref */ || elem_ast->child[0]->kind != ZEND_AST_ZVAL
+ || (elem_ast->child[1] && elem_ast->child[1]->kind != ZEND_AST_ZVAL)
+ ) {
+ is_constant = 0;
+ }
+ } else {
+ zend_eval_const_expr(&elem_ast->child[0]);
+
+ if (elem_ast->child[0]->kind != ZEND_AST_ZVAL) {
+ is_constant = 0;
+ }
}
last_elem_ast = elem_ast;
@@ -7080,11 +7142,35 @@ static zend_bool zend_try_ct_eval_array(zval *result, zend_ast *ast) /* {{{ */
for (i = 0; i < list->children; ++i) {
zend_ast *elem_ast = list->child[i];
zend_ast *value_ast = elem_ast->child[0];
- zend_ast *key_ast = elem_ast->child[1];
+ zend_ast *key_ast;
zval *value = zend_ast_get_zval(value_ast);
+ if (elem_ast->kind == ZEND_AST_UNPACK) {
+ if (Z_TYPE_P(value) == IS_ARRAY) {
+ HashTable *ht = Z_ARRVAL_P(value);
+ zval *val;
+ zend_string *key;
+
+ ZEND_HASH_FOREACH_STR_KEY_VAL(ht, key, val) {
+ if (key) {
+ zend_error_noreturn(E_COMPILE_ERROR, "Cannot unpack array with string keys");
+ }
+ if (!zend_hash_next_index_insert(Z_ARRVAL_P(result), val)) {
+ zval_ptr_dtor(result);
+ return 0;
+ }
+ Z_TRY_ADDREF_P(val);
+ } ZEND_HASH_FOREACH_END();
+
+ continue;
+ } else {
+ zend_error_noreturn(E_COMPILE_ERROR, "Only arrays and Traversables can be unpacked");
+ }
+ }
+
Z_TRY_ADDREF_P(value);
+ key_ast = elem_ast->child[1];
if (key_ast) {
zval *key = zend_ast_get_zval(key_ast);
switch (Z_TYPE_P(key)) {
@@ -7130,6 +7216,16 @@ void zend_compile_binary_op(znode *result, zend_ast *ast) /* {{{ */
zend_ast *right_ast = ast->child[1];
uint32_t opcode = ast->attr;
+ if ((opcode == ZEND_ADD || opcode == ZEND_SUB) && left_ast->kind == ZEND_AST_BINARY_OP && left_ast->attr == ZEND_CONCAT) {
+ zend_error(E_DEPRECATED, "The behavior of unparenthesized expressions containing both '.' and '+'/'-' will change in PHP 8: '+'/'-' will take a higher precedence");
+ }
+ if ((opcode == ZEND_SL || opcode == ZEND_SR) && ((left_ast->kind == ZEND_AST_BINARY_OP && left_ast->attr == ZEND_CONCAT) || (right_ast->kind == ZEND_AST_BINARY_OP && right_ast->attr == ZEND_CONCAT))) {
+ zend_error(E_DEPRECATED, "The behavior of unparenthesized expressions containing both '.' and '>>'/'<<' will change in PHP 8: '<<'/'>>' will take a higher precedence");
+ }
+ if (opcode == ZEND_PARENTHESIZED_CONCAT) {
+ opcode = ZEND_CONCAT;
+ }
+
znode left_node, right_node;
zend_compile_expr(&left_node, left_ast);
zend_compile_expr(&right_node, right_ast);
@@ -7172,10 +7268,18 @@ void zend_compile_binary_op(znode *result, zend_ast *ast) /* {{{ */
if (opcode == ZEND_CONCAT) {
/* convert constant operands to strings at compile-time */
if (left_node.op_type == IS_CONST) {
- convert_to_string(&left_node.u.constant);
+ if (Z_TYPE(left_node.u.constant) == IS_ARRAY) {
+ zend_emit_op_tmp(&left_node, ZEND_CAST, &left_node, NULL)->extended_value = IS_STRING;
+ } else {
+ convert_to_string(&left_node.u.constant);
+ }
}
if (right_node.op_type == IS_CONST) {
- convert_to_string(&right_node.u.constant);
+ if (Z_TYPE(right_node.u.constant) == IS_ARRAY) {
+ zend_emit_op_tmp(&right_node, ZEND_CAST, &right_node, NULL)->extended_value = IS_STRING;
+ } else {
+ convert_to_string(&right_node.u.constant);
+ }
}
if (left_node.op_type == IS_CONST && right_node.op_type == IS_CONST) {
opcode = ZEND_FAST_CONCAT;
@@ -7293,14 +7397,14 @@ void zend_compile_short_circuiting(znode *result, zend_ast *ast) /* {{{ */
return;
}
- opnum_jmpz = get_next_op_number(CG(active_op_array));
+ opnum_jmpz = get_next_op_number();
opline_jmpz = zend_emit_op(NULL, ast->kind == ZEND_AST_AND ? ZEND_JMPZ_EX : ZEND_JMPNZ_EX,
&left_node, NULL);
if (left_node.op_type == IS_TMP_VAR) {
SET_NODE(opline_jmpz->result, &left_node);
} else {
- opline_jmpz->result.var = get_temporary_variable(CG(active_op_array));
+ opline_jmpz->result.var = get_temporary_variable();
opline_jmpz->result_type = IS_TMP_VAR;
}
@@ -7322,12 +7426,16 @@ void zend_compile_post_incdec(znode *result, zend_ast *ast) /* {{{ */
zend_ensure_writable_variable(var_ast);
if (var_ast->kind == ZEND_AST_PROP) {
- zend_op *opline = zend_compile_prop(NULL, var_ast, BP_VAR_RW);
+ zend_op *opline = zend_compile_prop(NULL, var_ast, BP_VAR_RW, 0);
opline->opcode = ast->kind == ZEND_AST_POST_INC ? ZEND_POST_INC_OBJ : ZEND_POST_DEC_OBJ;
zend_make_tmp_result(result, opline);
+ } else if (var_ast->kind == ZEND_AST_STATIC_PROP) {
+ zend_op *opline = zend_compile_static_prop(NULL, var_ast, BP_VAR_RW, 0, 0);
+ opline->opcode = ast->kind == ZEND_AST_POST_INC ? ZEND_POST_INC_STATIC_PROP : ZEND_POST_DEC_STATIC_PROP;
+ zend_make_tmp_result(result, opline);
} else {
znode var_node;
- zend_compile_var(&var_node, var_ast, BP_VAR_RW);
+ zend_compile_var(&var_node, var_ast, BP_VAR_RW, 0);
zend_emit_op_tmp(result, ast->kind == ZEND_AST_POST_INC ? ZEND_POST_INC : ZEND_POST_DEC,
&var_node, NULL);
}
@@ -7342,11 +7450,14 @@ void zend_compile_pre_incdec(znode *result, zend_ast *ast) /* {{{ */
zend_ensure_writable_variable(var_ast);
if (var_ast->kind == ZEND_AST_PROP) {
- zend_op *opline = zend_compile_prop(result, var_ast, BP_VAR_RW);
+ zend_op *opline = zend_compile_prop(result, var_ast, BP_VAR_RW, 0);
opline->opcode = ast->kind == ZEND_AST_PRE_INC ? ZEND_PRE_INC_OBJ : ZEND_PRE_DEC_OBJ;
+ } else if (var_ast->kind == ZEND_AST_STATIC_PROP) {
+ zend_op *opline = zend_compile_static_prop(result, var_ast, BP_VAR_RW, 0, 0);
+ opline->opcode = ast->kind == ZEND_AST_PRE_INC ? ZEND_PRE_INC_STATIC_PROP : ZEND_PRE_DEC_STATIC_PROP;
} else {
znode var_node;
- zend_compile_var(&var_node, var_ast, BP_VAR_RW);
+ zend_compile_var(&var_node, var_ast, BP_VAR_RW, 0);
zend_emit_op(result, ast->kind == ZEND_AST_PRE_INC ? ZEND_PRE_INC : ZEND_PRE_DEC,
&var_node, NULL);
}
@@ -7383,7 +7494,7 @@ static void zend_compile_shorthand_conditional(znode *result, zend_ast *ast) /*
zend_compile_expr(&cond_node, cond_ast);
- opnum_jmp_set = get_next_op_number(CG(active_op_array));
+ opnum_jmp_set = get_next_op_number();
zend_emit_op_tmp(result, ZEND_JMP_SET, &cond_node, NULL);
zend_compile_expr(&false_node, false_ast);
@@ -7405,6 +7516,30 @@ void zend_compile_conditional(znode *result, zend_ast *ast) /* {{{ */
zend_op *opline_qm_assign2;
uint32_t opnum_jmpz, opnum_jmp;
+ if (cond_ast->kind == ZEND_AST_CONDITIONAL
+ && cond_ast->attr != ZEND_PARENTHESIZED_CONDITIONAL) {
+ if (cond_ast->child[1]) {
+ if (true_ast) {
+ zend_error(E_DEPRECATED,
+ "Unparenthesized `a ? b : c ? d : e` is deprecated. "
+ "Use either `(a ? b : c) ? d : e` or `a ? b : (c ? d : e)`");
+ } else {
+ zend_error(E_DEPRECATED,
+ "Unparenthesized `a ? b : c ?: d` is deprecated. "
+ "Use either `(a ? b : c) ?: d` or `a ? b : (c ?: d)`");
+ }
+ } else {
+ if (true_ast) {
+ zend_error(E_DEPRECATED,
+ "Unparenthesized `a ?: b ? c : d` is deprecated. "
+ "Use either `(a ?: b) ? c : d` or `a ?: (b ? c : d)`");
+ } else {
+ /* This case is harmless: (a ?: b) ?: c always produces the same result
+ * as a ?: (b ?: c). */
+ }
+ }
+ }
+
if (!true_ast) {
zend_compile_shorthand_conditional(result, ast);
return;
@@ -7440,9 +7575,9 @@ void zend_compile_coalesce(znode *result, zend_ast *ast) /* {{{ */
zend_op *opline;
uint32_t opnum;
- zend_compile_var(&expr_node, expr_ast, BP_VAR_IS);
+ zend_compile_var(&expr_node, expr_ast, BP_VAR_IS, 0);
- opnum = get_next_op_number(CG(active_op_array));
+ opnum = get_next_op_number();
zend_emit_op_tmp(result, ZEND_COALESCE, &expr_node, NULL);
zend_compile_expr(&default_node, default_ast);
@@ -7451,7 +7586,105 @@ void zend_compile_coalesce(znode *result, zend_ast *ast) /* {{{ */
SET_NODE(opline->result, result);
opline = &CG(active_op_array)->opcodes[opnum];
- opline->op2.opline_num = get_next_op_number(CG(active_op_array));
+ opline->op2.opline_num = get_next_op_number();
+}
+/* }}} */
+
+static void znode_dtor(zval *zv) {
+ znode *node = Z_PTR_P(zv);
+ if (node->op_type == IS_CONST) {
+ zval_ptr_dtor_nogc(&node->u.constant);
+ }
+ efree(node);
+}
+
+void zend_compile_assign_coalesce(znode *result, zend_ast *ast) /* {{{ */
+{
+ zend_ast *var_ast = ast->child[0];
+ zend_ast *default_ast = ast->child[1];
+
+ znode var_node_is, var_node_w, default_node, assign_node, *node;
+ zend_op *opline;
+ uint32_t coalesce_opnum;
+ zend_bool need_frees = 0;
+
+ /* Remember expressions compiled during the initial BP_VAR_IS lookup,
+ * to avoid double-evaluation when we compile again with BP_VAR_W. */
+ HashTable *orig_memoized_exprs = CG(memoized_exprs);
+ int orig_memoize_mode = CG(memoize_mode);
+
+ zend_ensure_writable_variable(var_ast);
+ if (is_this_fetch(var_ast)) {
+ zend_error_noreturn(E_COMPILE_ERROR, "Cannot re-assign $this");
+ }
+
+ ALLOC_HASHTABLE(CG(memoized_exprs));
+ zend_hash_init(CG(memoized_exprs), 0, NULL, znode_dtor, 0);
+
+ CG(memoize_mode) = ZEND_MEMOIZE_COMPILE;
+ zend_compile_var(&var_node_is, var_ast, BP_VAR_IS, 0);
+
+ coalesce_opnum = get_next_op_number();
+ zend_emit_op_tmp(result, ZEND_COALESCE, &var_node_is, NULL);
+
+ CG(memoize_mode) = ZEND_MEMOIZE_NONE;
+ zend_compile_expr(&default_node, default_ast);
+
+ CG(memoize_mode) = ZEND_MEMOIZE_FETCH;
+ zend_compile_var(&var_node_w, var_ast, BP_VAR_W, 0);
+
+ /* Reproduce some of the zend_compile_assign() opcode fixup logic here. */
+ opline = &CG(active_op_array)->opcodes[CG(active_op_array)->last-1];
+ switch (var_ast->kind) {
+ case ZEND_AST_VAR:
+ zend_emit_op(&assign_node, ZEND_ASSIGN, &var_node_w, &default_node);
+ break;
+ case ZEND_AST_STATIC_PROP:
+ opline->opcode = ZEND_ASSIGN_STATIC_PROP;
+ zend_emit_op_data(&default_node);
+ assign_node = var_node_w;
+ break;
+ case ZEND_AST_DIM:
+ opline->opcode = ZEND_ASSIGN_DIM;
+ zend_emit_op_data(&default_node);
+ assign_node = var_node_w;
+ break;
+ case ZEND_AST_PROP:
+ opline->opcode = ZEND_ASSIGN_OBJ;
+ zend_emit_op_data(&default_node);
+ assign_node = var_node_w;
+ break;
+ EMPTY_SWITCH_DEFAULT_CASE();
+ }
+
+ opline = zend_emit_op_tmp(NULL, ZEND_QM_ASSIGN, &assign_node, NULL);
+ SET_NODE(opline->result, result);
+
+ ZEND_HASH_FOREACH_PTR(CG(memoized_exprs), node) {
+ if (node->op_type == IS_TMP_VAR || node->op_type == IS_VAR) {
+ need_frees = 1;
+ break;
+ }
+ } ZEND_HASH_FOREACH_END();
+
+ /* Free DUPed expressions if there are any */
+ if (need_frees) {
+ uint32_t jump_opnum = zend_emit_jump(0);
+ zend_update_jump_target_to_next(coalesce_opnum);
+ ZEND_HASH_FOREACH_PTR(CG(memoized_exprs), node) {
+ if (node->op_type == IS_TMP_VAR || node->op_type == IS_VAR) {
+ zend_emit_op(NULL, ZEND_FREE, node, NULL);
+ }
+ } ZEND_HASH_FOREACH_END();
+ zend_update_jump_target_to_next(jump_opnum);
+ } else {
+ zend_update_jump_target_to_next(coalesce_opnum);
+ }
+
+ zend_hash_destroy(CG(memoized_exprs));
+ FREE_HASHTABLE(CG(memoized_exprs));
+ CG(memoized_exprs) = orig_memoized_exprs;
+ CG(memoize_mode) = orig_memoize_mode;
}
/* }}} */
@@ -7506,8 +7739,8 @@ void zend_compile_yield(znode *result, zend_ast *ast) /* {{{ */
}
if (value_ast) {
- if (returns_by_ref && zend_is_variable(value_ast) && !zend_is_call(value_ast)) {
- zend_compile_var(&value_node, value_ast, BP_VAR_W);
+ if (returns_by_ref && zend_is_variable(value_ast)) {
+ zend_compile_var(&value_node, value_ast, BP_VAR_W, 1);
} else {
zend_compile_expr(&value_node, value_ast);
}
@@ -7555,7 +7788,7 @@ void zend_compile_instanceof(znode *result, zend_ast *ast) /* {{{ */
return;
}
- zend_compile_class_ref_ex(&class_node, class_ast,
+ zend_compile_class_ref(&class_node, class_ast,
ZEND_FETCH_CLASS_NO_AUTOLOAD | ZEND_FETCH_CLASS_EXCEPTION);
opline = zend_emit_op_tmp(result, ZEND_INSTANCEOF, &obj_node, NULL);
@@ -7563,7 +7796,7 @@ void zend_compile_instanceof(znode *result, zend_ast *ast) /* {{{ */
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));
+ Z_STR(class_node.u.constant));
opline->extended_value = zend_alloc_cache_slot();
} else {
SET_NODE(opline->op2, &class_node);
@@ -7596,7 +7829,7 @@ void zend_compile_isset_or_empty(znode *result, zend_ast *ast) /* {{{ */
ZEND_ASSERT(ast->kind == ZEND_AST_ISSET || ast->kind == ZEND_AST_EMPTY);
- if (!zend_is_variable(var_ast) || zend_is_call(var_ast)) {
+ if (!zend_is_variable(var_ast)) {
if (ast->kind == ZEND_AST_EMPTY) {
/* empty(expr) can be transformed to !expr */
zend_ast *not_ast = zend_ast_create_ex(ZEND_AST_UNARY_OP, ZEND_BOOL_NOT, var_ast);
@@ -7613,6 +7846,7 @@ void zend_compile_isset_or_empty(znode *result, zend_ast *ast) /* {{{ */
case ZEND_AST_VAR:
if (is_this_fetch(var_ast)) {
opline = zend_emit_op(result, ZEND_ISSET_ISEMPTY_THIS, NULL, NULL);
+ CG(active_op_array)->fn_flags |= ZEND_ACC_USES_THIS;
} else if (zend_try_compile_cv(&var_node, var_ast) == SUCCESS) {
opline = zend_emit_op(result, ZEND_ISSET_ISEMPTY_CV, &var_node, NULL);
} else {
@@ -7625,11 +7859,11 @@ void zend_compile_isset_or_empty(znode *result, zend_ast *ast) /* {{{ */
opline->opcode = ZEND_ISSET_ISEMPTY_DIM_OBJ;
break;
case ZEND_AST_PROP:
- opline = zend_compile_prop(result, var_ast, BP_VAR_IS);
+ opline = zend_compile_prop(result, var_ast, BP_VAR_IS, 0);
opline->opcode = ZEND_ISSET_ISEMPTY_PROP_OBJ;
break;
case ZEND_AST_STATIC_PROP:
- opline = zend_compile_static_prop(result, var_ast, BP_VAR_IS, 0);
+ opline = zend_compile_static_prop(result, var_ast, BP_VAR_IS, 0, 0);
opline->opcode = ZEND_ISSET_ISEMPTY_STATIC_PROP;
break;
EMPTY_SWITCH_DEFAULT_CASE()
@@ -7646,9 +7880,7 @@ void zend_compile_silence(znode *result, zend_ast *ast) /* {{{ */
{
zend_ast *expr_ast = ast->child[0];
znode silence_node;
- uint32_t range;
- range = zend_start_live_range(CG(active_op_array), get_next_op_number(CG(active_op_array)));
zend_emit_op_tmp(&silence_node, ZEND_BEGIN_SILENCE, NULL, NULL);
if (expr_ast->kind == ZEND_AST_VAR) {
@@ -7659,11 +7891,6 @@ void zend_compile_silence(znode *result, zend_ast *ast) /* {{{ */
zend_compile_expr(result, expr_ast);
}
- /* Store BEGIN_SILENCE/END_SILENCE pair to restore previous
- * EG(error_reporting) value on exception */
- zend_end_live_range(CG(active_op_array), range, get_next_op_number(CG(active_op_array)),
- ZEND_LIVE_SILENCE, silence_node.u.op.var);
-
zend_emit_op(NULL, ZEND_END_SILENCE, &silence_node, NULL);
}
/* }}} */
@@ -7712,6 +7939,18 @@ void zend_compile_array(znode *result, zend_ast *ast) /* {{{ */
}
value_ast = elem_ast->child[0];
+
+ if (elem_ast->kind == ZEND_AST_UNPACK) {
+ zend_compile_expr(&value_node, value_ast);
+ if (i == 0) {
+ opnum_init = get_next_op_number();
+ opline = zend_emit_op_tmp(result, ZEND_INIT_ARRAY, NULL, NULL);
+ }
+ opline = zend_emit_op(NULL, ZEND_ADD_ARRAY_UNPACK, &value_node, NULL);
+ SET_NODE(opline->result, result);
+ continue;
+ }
+
key_ast = elem_ast->child[1];
by_ref = elem_ast->attr;
@@ -7723,13 +7962,13 @@ void zend_compile_array(znode *result, zend_ast *ast) /* {{{ */
if (by_ref) {
zend_ensure_writable_variable(value_ast);
- zend_compile_var(&value_node, value_ast, BP_VAR_W);
+ zend_compile_var(&value_node, value_ast, BP_VAR_W, 1);
} else {
zend_compile_expr(&value_node, value_ast);
}
if (i == 0) {
- opnum_init = get_next_op_number(CG(active_op_array));
+ opnum_init = get_next_op_number();
opline = zend_emit_op_tmp(result, ZEND_INIT_ARRAY, &value_node, key_node_ptr);
opline->extended_value = list->children << ZEND_ARRAY_SIZE_SHIFT;
} else {
@@ -7792,16 +8031,16 @@ void zend_compile_const(znode *result, zend_ast *ast) /* {{{ */
if (is_fully_qualified) {
opline->op2.constant = zend_add_const_name_literal(
- CG(active_op_array), resolved_name, 0);
+ resolved_name, 0);
} else {
opline->op1.num = IS_CONSTANT_UNQUALIFIED;
if (FC(current_namespace)) {
opline->op1.num |= IS_CONSTANT_IN_NAMESPACE;
opline->op2.constant = zend_add_const_name_literal(
- CG(active_op_array), resolved_name, 1);
+ resolved_name, 1);
} else {
opline->op2.constant = zend_add_const_name_literal(
- CG(active_op_array), resolved_name, 0);
+ resolved_name, 0);
}
}
opline->extended_value = zend_alloc_cache_slot();
@@ -7816,16 +8055,6 @@ void zend_compile_class_const(znode *result, zend_ast *ast) /* {{{ */
znode class_node, const_node;
zend_op *opline;
- 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->op1.num = zend_get_class_fetch_type(zend_ast_get_str(class_ast));
- } else {
- result->op_type = IS_CONST;
- }
- return;
- }
-
zend_eval_const_expr(&ast->child[0]);
zend_eval_const_expr(&ast->child[1]);
@@ -7843,12 +8072,8 @@ void zend_compile_class_const(znode *result, zend_ast *ast) /* {{{ */
}
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,
- "Dynamic class names are not allowed in compile-time ::class fetch");
- }
- zend_compile_class_ref_ex(&class_node, class_ast, ZEND_FETCH_CLASS_EXCEPTION);
+ zend_compile_class_ref(&class_node, class_ast, ZEND_FETCH_CLASS_EXCEPTION);
zend_compile_expr(&const_node, const_ast);
@@ -7856,45 +8081,45 @@ void zend_compile_class_const(znode *result, zend_ast *ast) /* {{{ */
zend_set_class_name_op1(opline, &class_node);
- opline->extended_value = zend_alloc_polymorphic_cache_slot();
+ opline->extended_value = zend_alloc_cache_slots(2);
}
/* }}} */
-void zend_compile_resolve_class_name(znode *result, zend_ast *ast) /* {{{ */
+void zend_compile_class_name(znode *result, zend_ast *ast) /* {{{ */
{
- zend_ast *name_ast = ast->child[0];
- uint32_t fetch_type = zend_get_class_fetch_type(zend_ast_get_str(name_ast));
- zend_ensure_valid_class_fetch_type(fetch_type);
+ zend_ast *class_ast = ast->child[0];
+ zend_op *opline;
- switch (fetch_type) {
- case ZEND_FETCH_CLASS_SELF:
- if (CG(active_class_entry) && zend_is_scope_known()) {
- result->op_type = IS_CONST;
- 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->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->op1.num = fetch_type;
- }
- break;
- case ZEND_FETCH_CLASS_DEFAULT:
- result->op_type = IS_CONST;
- ZVAL_STR(&result->u.constant, zend_resolve_class_name_ast(name_ast));
- break;
- EMPTY_SWITCH_DEFAULT_CASE()
+ if (zend_try_compile_const_expr_resolve_class_name(&result->u.constant, class_ast)) {
+ result->op_type = IS_CONST;
+ return;
}
+
+ opline = zend_emit_op_tmp(result, ZEND_FETCH_CLASS_NAME, NULL, NULL);
+ opline->op1.num = zend_get_class_fetch_type(zend_ast_get_str(class_ast));
+}
+/* }}} */
+
+static zend_op *zend_compile_rope_add_ex(zend_op *opline, znode *result, uint32_t num, znode *elem_node) /* {{{ */
+{
+ if (num == 0) {
+ result->op_type = IS_TMP_VAR;
+ result->u.op.var = -1;
+ opline->opcode = ZEND_ROPE_INIT;
+ } else {
+ opline->opcode = ZEND_ROPE_ADD;
+ SET_NODE(opline->op1, result);
+ }
+ SET_NODE(opline->op2, elem_node);
+ SET_NODE(opline->result, result);
+ opline->extended_value = num;
+ return opline;
}
/* }}} */
static zend_op *zend_compile_rope_add(znode *result, uint32_t num, znode *elem_node) /* {{{ */
{
- zend_op *opline = get_next_op(CG(active_op_array));
+ zend_op *opline = get_next_op();
if (num == 0) {
result->op_type = IS_TMP_VAR;
@@ -7918,6 +8143,7 @@ static void zend_compile_encaps_list(znode *result, zend_ast *ast) /* {{{ */
zend_op *opline = NULL, *init_opline;
znode elem_node, last_const_node;
zend_ast_list *list = zend_ast_get_list(ast);
+ uint32_t reserved_op_number = -1;
ZEND_ASSERT(list->children > 0);
@@ -7937,14 +8163,23 @@ static void zend_compile_encaps_list(znode *result, zend_ast *ast) /* {{{ */
} else {
last_const_node.op_type = IS_CONST;
ZVAL_COPY_VALUE(&last_const_node.u.constant, &elem_node.u.constant);
+ /* Reserve place for ZEND_ROPE_ADD instruction */
+ reserved_op_number = get_next_op_number();
+ opline = get_next_op();
+ opline->opcode = ZEND_NOP;
}
continue;
} else {
if (j == 0) {
- rope_init_lineno = get_next_op_number(CG(active_op_array));
+ if (last_const_node.op_type == IS_CONST) {
+ rope_init_lineno = reserved_op_number;
+ } else {
+ rope_init_lineno = get_next_op_number();
+ }
}
if (last_const_node.op_type == IS_CONST) {
- zend_compile_rope_add(result, j++, &last_const_node);
+ opline = &CG(active_op_array)->opcodes[reserved_op_number];
+ zend_compile_rope_add_ex(opline, result, j++, &last_const_node);
last_const_node.op_type = IS_UNUSED;
}
opline = zend_compile_rope_add(result, j++, &elem_node);
@@ -7959,9 +8194,11 @@ static void zend_compile_encaps_list(znode *result, zend_ast *ast) /* {{{ */
ZVAL_EMPTY_STRING(&result->u.constant);
/* empty string */
}
+ CG(active_op_array)->last = reserved_op_number - 1;
return;
} else if (last_const_node.op_type == IS_CONST) {
- opline = zend_compile_rope_add(result, j++, &last_const_node);
+ opline = &CG(active_op_array)->opcodes[reserved_op_number];
+ opline = zend_compile_rope_add_ex(opline, result, j++, &last_const_node);
}
init_opline = CG(active_op_array)->opcodes + rope_init_lineno;
if (j == 1) {
@@ -7974,7 +8211,7 @@ static void zend_compile_encaps_list(znode *result, zend_ast *ast) /* {{{ */
opline->op1_type = opline->op2_type;
opline->op1 = opline->op2;
opline->result_type = IS_TMP_VAR;
- opline->result.var = get_temporary_variable(CG(active_op_array));
+ opline->result.var = get_temporary_variable();
SET_UNUSED(opline->op2);
GET_NODE(result, opline->result);
}
@@ -7984,29 +8221,25 @@ static void zend_compile_encaps_list(znode *result, zend_ast *ast) /* {{{ */
opline->op1_type = init_opline->op2_type;
opline->op1 = init_opline->op2;
opline->result_type = IS_TMP_VAR;
- opline->result.var = get_temporary_variable(CG(active_op_array));
+ opline->result.var = get_temporary_variable();
MAKE_NOP(init_opline);
GET_NODE(result, opline->result);
} else {
uint32_t var;
- uint32_t range = zend_start_live_range(CG(active_op_array), rope_init_lineno);
init_opline->extended_value = j;
opline->opcode = ZEND_ROPE_END;
- opline->result.var = get_temporary_variable(CG(active_op_array));
- var = opline->op1.var = get_temporary_variable(CG(active_op_array));
+ opline->result.var = get_temporary_variable();
+ var = opline->op1.var = get_temporary_variable();
GET_NODE(result, opline->result);
/* Allocates the necessary number of zval slots to keep the rope */
i = ((j * sizeof(zend_string*)) + (sizeof(zval) - 1)) / sizeof(zval);
while (i > 1) {
- get_temporary_variable(CG(active_op_array));
+ get_temporary_variable();
i--;
}
- zend_end_live_range(CG(active_op_array), range, opline - CG(active_op_array)->opcodes,
- ZEND_LIVE_ROPE, var);
-
/* Update all the previous opcodes to use the same variable */
while (opline != init_opline) {
opline--;
@@ -8050,7 +8283,9 @@ zend_bool zend_is_allowed_in_const_expr(zend_ast_kind kind) /* {{{ */
|| kind == ZEND_AST_UNARY_PLUS || kind == ZEND_AST_UNARY_MINUS
|| kind == ZEND_AST_CONDITIONAL || kind == ZEND_AST_DIM
|| kind == ZEND_AST_ARRAY || kind == ZEND_AST_ARRAY_ELEM
+ || kind == ZEND_AST_UNPACK
|| kind == ZEND_AST_CONST || kind == ZEND_AST_CLASS_CONST
+ || kind == ZEND_AST_CLASS_NAME
|| kind == ZEND_AST_MAGIC_CONST || kind == ZEND_AST_COALESCE;
}
/* }}} */
@@ -8063,7 +8298,6 @@ void zend_compile_const_expr_class_const(zend_ast **ast_ptr) /* {{{ */
zend_string *class_name;
zend_string *const_name = zend_ast_get_str(const_ast);
zend_string *name;
- zval result;
int fetch_type;
if (class_ast->kind != ZEND_AST_ZVAL) {
@@ -8071,11 +8305,6 @@ void zend_compile_const_expr_class_const(zend_ast **ast_ptr) /* {{{ */
"Dynamic class names are not allowed in compile-time class constant references");
}
- if (zend_try_compile_const_expr_resolve_class_name(&result, class_ast, const_ast, 1)) {
- *ast_ptr = zend_ast_create_zval(&result);
- return;
- }
-
class_name = zend_ast_get_str(class_ast);
fetch_type = zend_get_class_fetch_type(class_name);
@@ -8100,6 +8329,29 @@ void zend_compile_const_expr_class_const(zend_ast **ast_ptr) /* {{{ */
}
/* }}} */
+void zend_compile_const_expr_class_name(zend_ast **ast_ptr) /* {{{ */
+{
+ zend_ast *ast = *ast_ptr;
+ zend_ast *class_ast = ast->child[0];
+ zend_string *class_name = zend_ast_get_str(class_ast);
+ uint32_t fetch_type = zend_get_class_fetch_type(class_name);
+
+ switch (fetch_type) {
+ case ZEND_FETCH_CLASS_SELF:
+ case ZEND_FETCH_CLASS_PARENT:
+ /* For the const-eval representation store the fetch type instead of the name. */
+ zend_string_release(class_name);
+ ast->child[0] = NULL;
+ ast->attr = fetch_type;
+ return;
+ case ZEND_FETCH_CLASS_STATIC:
+ zend_error_noreturn(E_COMPILE_ERROR,
+ "static::class cannot be used for compile-time class name resolution");
+ return;
+ EMPTY_SWITCH_DEFAULT_CASE()
+ }
+}
+
void zend_compile_const_expr_const(zend_ast **ast_ptr) /* {{{ */
{
zend_ast *ast = *ast_ptr;
@@ -8151,6 +8403,9 @@ void zend_compile_const_expr(zend_ast **ast_ptr) /* {{{ */
case ZEND_AST_CLASS_CONST:
zend_compile_const_expr_class_const(ast_ptr);
break;
+ case ZEND_AST_CLASS_NAME:
+ zend_compile_const_expr_class_name(ast_ptr);
+ break;
case ZEND_AST_CONST:
zend_compile_const_expr_const(ast_ptr);
break;
@@ -8200,15 +8455,20 @@ void zend_compile_top_stmt(zend_ast *ast) /* {{{ */
return;
}
- zend_compile_stmt(ast);
-
+ if (ast->kind == ZEND_AST_FUNC_DECL) {
+ CG(zend_lineno) = ast->lineno;
+ zend_compile_func_decl(NULL, ast, 1);
+ CG(zend_lineno) = ((zend_ast_decl *) ast)->end_lineno;
+ } else if (ast->kind == ZEND_AST_CLASS) {
+ CG(zend_lineno) = ast->lineno;
+ zend_compile_class_decl(ast, 1);
+ CG(zend_lineno) = ((zend_ast_decl *) ast)->end_lineno;
+ } else {
+ zend_compile_stmt(ast);
+ }
if (ast->kind != ZEND_AST_NAMESPACE && ast->kind != ZEND_AST_HALT_COMPILER) {
zend_verify_namespace();
}
- if (ast->kind == ZEND_AST_FUNC_DECL || ast->kind == ZEND_AST_CLASS) {
- CG(zend_lineno) = ((zend_ast_decl *) ast)->end_lineno;
- zend_do_early_binding();
- }
}
/* }}} */
@@ -8220,8 +8480,8 @@ void zend_compile_stmt(zend_ast *ast) /* {{{ */
CG(zend_lineno) = ast->lineno;
- if ((CG(compiler_options) & ZEND_COMPILE_EXTENDED_INFO) && !zend_is_unticked_stmt(ast)) {
- zend_do_extended_info();
+ if ((CG(compiler_options) & ZEND_COMPILE_EXTENDED_STMT) && !zend_is_unticked_stmt(ast)) {
+ zend_do_extended_stmt();
}
switch (ast->kind) {
@@ -8282,10 +8542,10 @@ void zend_compile_stmt(zend_ast *ast) /* {{{ */
break;
case ZEND_AST_FUNC_DECL:
case ZEND_AST_METHOD:
- zend_compile_func_decl(NULL, ast);
+ zend_compile_func_decl(NULL, ast, 0);
break;
- case ZEND_AST_PROP_DECL:
- zend_compile_prop_decl(ast);
+ case ZEND_AST_PROP_GROUP:
+ zend_compile_prop_group(ast);
break;
case ZEND_AST_CLASS_CONST_DECL:
zend_compile_class_const_decl(ast);
@@ -8294,7 +8554,7 @@ void zend_compile_stmt(zend_ast *ast) /* {{{ */
zend_compile_use_trait(ast);
break;
case ZEND_AST_CLASS:
- zend_compile_class_decl(ast);
+ zend_compile_class_decl(ast, 0);
break;
case ZEND_AST_GROUP_USE:
zend_compile_group_use(ast);
@@ -8330,6 +8590,11 @@ void zend_compile_expr(znode *result, zend_ast *ast) /* {{{ */
/* CG(zend_lineno) = ast->lineno; */
CG(zend_lineno) = zend_ast_get_lineno(ast);
+ if (CG(memoize_mode) != ZEND_MEMOIZE_NONE) {
+ zend_compile_memoized_expr(result, ast);
+ return;
+ }
+
switch (ast->kind) {
case ZEND_AST_ZVAL:
ZVAL_COPY(&result->u.constant, zend_ast_get_zval(ast));
@@ -8345,7 +8610,7 @@ void zend_compile_expr(znode *result, zend_ast *ast) /* {{{ */
case ZEND_AST_CALL:
case ZEND_AST_METHOD_CALL:
case ZEND_AST_STATIC_CALL:
- zend_compile_var(result, ast, BP_VAR_R);
+ zend_compile_var(result, ast, BP_VAR_R, 0);
return;
case ZEND_AST_ASSIGN:
zend_compile_assign(result, ast);
@@ -8397,6 +8662,9 @@ void zend_compile_expr(znode *result, zend_ast *ast) /* {{{ */
case ZEND_AST_COALESCE:
zend_compile_coalesce(result, ast);
return;
+ case ZEND_AST_ASSIGN_COALESCE:
+ zend_compile_assign_coalesce(result, ast);
+ return;
case ZEND_AST_PRINT:
zend_compile_print(result, ast);
return;
@@ -8434,6 +8702,9 @@ void zend_compile_expr(znode *result, zend_ast *ast) /* {{{ */
case ZEND_AST_CLASS_CONST:
zend_compile_class_const(result, ast);
return;
+ case ZEND_AST_CLASS_NAME:
+ zend_compile_class_name(result, ast);
+ return;
case ZEND_AST_ENCAPS_LIST:
zend_compile_encaps_list(result, ast);
return;
@@ -8441,7 +8712,8 @@ void zend_compile_expr(znode *result, zend_ast *ast) /* {{{ */
zend_compile_magic_const(result, ast);
return;
case ZEND_AST_CLOSURE:
- zend_compile_func_decl(result, ast);
+ case ZEND_AST_ARROW_FUNC:
+ zend_compile_func_decl(result, ast, 0);
return;
default:
ZEND_ASSERT(0 /* not supported */);
@@ -8449,35 +8721,31 @@ void zend_compile_expr(znode *result, zend_ast *ast) /* {{{ */
}
/* }}} */
-void zend_compile_var(znode *result, zend_ast *ast, uint32_t type) /* {{{ */
+zend_op *zend_compile_var(znode *result, zend_ast *ast, uint32_t type, int by_ref) /* {{{ */
{
CG(zend_lineno) = zend_ast_get_lineno(ast);
switch (ast->kind) {
case ZEND_AST_VAR:
- zend_compile_simple_var(result, ast, type, 0);
- return;
+ return zend_compile_simple_var(result, ast, type, 0);
case ZEND_AST_DIM:
- zend_compile_dim(result, ast, type);
- return;
+ return zend_compile_dim(result, ast, type);
case ZEND_AST_PROP:
- zend_compile_prop(result, ast, type);
- return;
+ return zend_compile_prop(result, ast, type, by_ref);
case ZEND_AST_STATIC_PROP:
- zend_compile_static_prop(result, ast, type, 0);
- return;
+ return zend_compile_static_prop(result, ast, type, by_ref, 0);
case ZEND_AST_CALL:
zend_compile_call(result, ast, type);
- return;
+ return NULL;
case ZEND_AST_METHOD_CALL:
zend_compile_method_call(result, ast, type);
- return;
+ return NULL;
case ZEND_AST_STATIC_CALL:
zend_compile_static_call(result, ast, type);
- return;
+ return NULL;
case ZEND_AST_ZNODE:
*result = *zend_ast_get_znode(ast);
- return;
+ return NULL;
default:
if (type == BP_VAR_W || type == BP_VAR_RW || type == BP_VAR_UNSET) {
zend_error_noreturn(E_COMPILE_ERROR,
@@ -8485,29 +8753,30 @@ void zend_compile_var(znode *result, zend_ast *ast, uint32_t type) /* {{{ */
}
zend_compile_expr(result, ast);
- return;
+ return NULL;
}
}
/* }}} */
-void zend_delayed_compile_var(znode *result, zend_ast *ast, uint32_t type) /* {{{ */
+zend_op *zend_delayed_compile_var(znode *result, zend_ast *ast, uint32_t type, zend_bool by_ref) /* {{{ */
{
switch (ast->kind) {
case ZEND_AST_VAR:
- zend_compile_simple_var(result, ast, type, 1);
- return;
+ return zend_compile_simple_var(result, ast, type, 1);
case ZEND_AST_DIM:
- zend_delayed_compile_dim(result, ast, type);
- return;
+ return zend_delayed_compile_dim(result, ast, type);
case ZEND_AST_PROP:
- zend_delayed_compile_prop(result, ast, type);
- return;
+ {
+ zend_op *opline = zend_delayed_compile_prop(result, ast, type);
+ if (by_ref) {
+ opline->extended_value |= ZEND_FETCH_REF;
+ }
+ return opline;
+ }
case ZEND_AST_STATIC_PROP:
- zend_compile_static_prop(result, ast, type, 1);
- return;
+ return zend_compile_static_prop(result, ast, type, by_ref, 1);
default:
- zend_compile_var(result, ast, type);
- return;
+ return zend_compile_var(result, ast, type, 0);
}
}
/* }}} */
@@ -8596,7 +8865,7 @@ void zend_eval_const_expr(zend_ast **ast_ptr) /* {{{ */
case ZEND_AST_COALESCE:
/* Set isset fetch indicator here, opcache disallows runtime altering of the AST */
if (ast->child[0]->kind == ZEND_AST_DIM) {
- ast->child[0]->attr = ZEND_DIM_IS;
+ ast->child[0]->attr |= ZEND_DIM_IS;
}
zend_eval_const_expr(&ast->child[0]);
@@ -8650,9 +8919,14 @@ void zend_eval_const_expr(zend_ast **ast_ptr) /* {{{ */
zend_error_noreturn(E_COMPILE_ERROR, "Cannot use [] for reading");
}
+ if (ast->attr & ZEND_DIM_ALTERNATIVE_SYNTAX) {
+ ast->attr &= ~ZEND_DIM_ALTERNATIVE_SYNTAX; /* remove flag to avoid duplicate warning */
+ zend_error(E_DEPRECATED, "Array and string offset access syntax with curly braces is deprecated");
+ }
+
/* Set isset fetch indicator here, opcache disallows runtime altering of the AST */
- if (ast->attr == ZEND_DIM_IS && ast->child[0]->kind == ZEND_AST_DIM) {
- ast->child[0]->attr = ZEND_DIM_IS;
+ if (ast->attr & ZEND_DIM_IS && ast->child[0]->kind == ZEND_AST_DIM) {
+ ast->child[0]->attr |= ZEND_DIM_IS;
}
zend_eval_const_expr(&ast->child[0]);
@@ -8730,32 +9004,16 @@ void zend_eval_const_expr(zend_ast **ast_ptr) /* {{{ */
}
case ZEND_AST_CLASS_CONST:
{
- zend_ast *class_ast = ast->child[0];
- zend_ast *name_ast = ast->child[1];
+ zend_ast *class_ast;
+ zend_ast *name_ast;
zend_string *resolved_name;
- if (zend_try_compile_const_expr_resolve_class_name(&result, class_ast, name_ast, 0)) {
- if (Z_TYPE(result) == IS_NULL) {
- if (zend_get_class_fetch_type(zend_ast_get_str(class_ast)) == ZEND_FETCH_CLASS_SELF) {
- zend_ast_destroy(ast);
- *ast_ptr = zend_ast_create_ex(ZEND_AST_MAGIC_CONST, T_CLASS_C);
- }
- return;
- }
- break;
- }
-
zend_eval_const_expr(&ast->child[0]);
zend_eval_const_expr(&ast->child[1]);
class_ast = ast->child[0];
name_ast = ast->child[1];
- if (name_ast->kind == ZEND_AST_ZVAL && zend_string_equals_literal_ci(zend_ast_get_str(name_ast), "class")) {
- zend_error_noreturn(E_COMPILE_ERROR,
- "Dynamic class names are not allowed in compile-time ::class fetch");
- }
-
if (class_ast->kind != ZEND_AST_ZVAL || name_ast->kind != ZEND_AST_ZVAL) {
return;
}
@@ -8770,7 +9028,14 @@ void zend_eval_const_expr(zend_ast **ast_ptr) /* {{{ */
zend_string_release_ex(resolved_name, 0);
break;
}
-
+ case ZEND_AST_CLASS_NAME:
+ {
+ zend_ast *class_ast = ast->child[0];
+ if (!zend_try_compile_const_expr_resolve_class_name(&result, class_ast)) {
+ return;
+ }
+ break;
+ }
default:
return;
}
@@ -8779,13 +9044,3 @@ void zend_eval_const_expr(zend_ast **ast_ptr) /* {{{ */
*ast_ptr = zend_ast_create_zval(&result);
}
/* }}} */
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * indent-tabs-mode: t
- * End:
- * vim600: sw=4 ts=4 fdm=marker
- * vim<600: sw=4 ts=4
- */
diff --git a/Zend/zend_compile.h b/Zend/zend_compile.h
index f63b3a755d..c21554e464 100644
--- a/Zend/zend_compile.h
+++ b/Zend/zend_compile.h
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| Zend Engine |
+----------------------------------------------------------------------+
- | Copyright (c) 1998-2018 Zend Technologies Ltd. (http://www.zend.com) |
+ | Copyright (c) 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 |
@@ -23,9 +23,7 @@
#include "zend.h"
#include "zend_ast.h"
-#ifdef HAVE_STDARG_H
-# include <stdarg.h>
-#endif
+#include <stdarg.h>
#include "zend_llist.h"
@@ -57,11 +55,9 @@ 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_RUN_TIME_CACHE 1
#else
# define ZEND_USE_ABS_JMP_ADDR 0
# define ZEND_USE_ABS_CONST_ADDR 0
-# define ZEND_EX_USE_RUN_TIME_CACHE 1
#endif
typedef union _znode_op {
@@ -109,7 +105,6 @@ typedef struct _zend_declarables {
/* Compilation context that is different for each file, but shared between op arrays. */
typedef struct _zend_file_context {
zend_declarables declarables;
- znode implementing_class;
zend_string *current_namespace;
zend_bool in_namespace;
@@ -126,12 +121,13 @@ typedef union _zend_parser_stack_elem {
zend_ast *ast;
zend_string *str;
zend_ulong num;
+ unsigned char *ptr;
} zend_parser_stack_elem;
void zend_compile_top_stmt(zend_ast *ast);
void zend_compile_stmt(zend_ast *ast);
void zend_compile_expr(znode *node, zend_ast *ast);
-void zend_compile_var(znode *node, zend_ast *ast, uint32_t type);
+zend_op *zend_compile_var(znode *node, zend_ast *ast, uint32_t type, int by_ref);
void zend_eval_const_expr(zend_ast **ast_ptr);
void zend_const_expr_to_zval(zval *result, zend_ast *ast);
@@ -175,7 +171,8 @@ typedef struct _zend_try_catch_element {
#define ZEND_LIVE_LOOP 1
#define ZEND_LIVE_SILENCE 2
#define ZEND_LIVE_ROPE 3
-#define ZEND_LIVE_MASK 3
+#define ZEND_LIVE_NEW 4
+#define ZEND_LIVE_MASK 7
typedef struct _zend_live_range {
uint32_t var; /* low bits are used for variable type (ZEND_LIVE_* macros) */
@@ -188,7 +185,6 @@ typedef struct _zend_oparray_context {
uint32_t opcodes_size;
int vars_size;
int literals_size;
- int backpatch_count;
uint32_t fast_call_var;
uint32_t try_catch_offset;
int current_brk_cont;
@@ -202,131 +198,157 @@ typedef struct _zend_oparray_context {
/* Common flags | | | */
/* ============ | | | */
/* | | | */
+/* Visibility flags (public < protected < private) | | | */
+#define ZEND_ACC_PUBLIC (1 << 0) /* | X | X | X */
+#define ZEND_ACC_PROTECTED (1 << 1) /* | X | X | X */
+#define ZEND_ACC_PRIVATE (1 << 2) /* | X | X | X */
+/* | | | */
+/* Property or method overrides private one | | | */
+#define ZEND_ACC_CHANGED (1 << 3) /* | X | X | */
+/* | | | */
/* Staic method or property | | | */
-#define ZEND_ACC_STATIC (1 << 0) /* | X | X | */
+#define ZEND_ACC_STATIC (1 << 4) /* | X | X | */
/* | | | */
/* Final class or method | | | */
-#define ZEND_ACC_FINAL (1 << 2) /* X | X | | */
+#define ZEND_ACC_FINAL (1 << 5) /* 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 */
+/* Abstract method | | | */
+#define ZEND_ACC_ABSTRACT (1 << 6) /* X | X | | */
+#define ZEND_ACC_EXPLICIT_ABSTRACT_CLASS (1 << 6) /* X | | | */
/* | | | */
-/* TODO: explain the name ??? | | | */
-#define ZEND_ACC_CHANGED (1 << 11) /* | X | X | */
+/* Immutable op_array and class_entries | | | */
+/* (implemented only for lazy loading of op_arrays) | | | */
+#define ZEND_ACC_IMMUTABLE (1 << 7) /* X | X | | */
/* | | | */
-/* TODO: used only by ext/reflection ??? | | | */
-#define ZEND_ACC_IMPLICIT_PUBLIC (1 << 12) /* | ? | ? | ? */
+/* Function has typed arguments / class has typed props | | | */
+#define ZEND_ACC_HAS_TYPE_HINTS (1 << 8) /* X | X | | */
/* | | | */
-/* Shadow of parent's private method/property | | | */
-#define ZEND_ACC_SHADOW (1 << 17) /* | ? | X | */
+/* Top-level class or function declaration | | | */
+#define ZEND_ACC_TOP_LEVEL (1 << 9) /* X | X | | */
/* | | | */
-/* Class Flags (unused: 0, 1, 3, 11-18, 21, 25...) | | | */
+/* op_array or class is preloaded | | | */
+#define ZEND_ACC_PRELOADED (1 << 10) /* X | X | | */
+/* | | | */
+/* Class Flags (unused: 24...) | | | */
/* =========== | | | */
/* | | | */
+/* Special class types | | | */
+#define ZEND_ACC_INTERFACE (1 << 0) /* X | | | */
+#define ZEND_ACC_TRAIT (1 << 1) /* X | | | */
+#define ZEND_ACC_ANON_CLASS (1 << 2) /* X | | | */
+/* | | | */
+/* Class linked with parent, interfacs and traits | | | */
+#define ZEND_ACC_LINKED (1 << 3) /* X | | | */
+/* | | | */
/* 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 | | | */
+/* Class has magic methods __get/__set/__unset/ | | | */
+/* __isset that use guards | | | */
+#define ZEND_ACC_USE_GUARDS (1 << 11) /* X | | | */
/* | | | */
-/* Bound anonymous class | | | */
-#define ZEND_ACC_ANON_BOUND (1 << 9) /* X | | | */
+/* Class constants updated | | | */
+#define ZEND_ACC_CONSTANTS_UPDATED (1 << 12) /* X | | | */
/* | | | */
/* Class extends another class | | | */
-#define ZEND_ACC_INHERITED (1 << 10) /* X | | | */
+#define ZEND_ACC_INHERITED (1 << 13) /* X | | | */
/* | | | */
/* Class implements interface(s) | | | */
-#define ZEND_ACC_IMPLEMENT_INTERFACES (1 << 19) /* X | | | */
-/* | | | */
-/* Class constants updated | | | */
-#define ZEND_ACC_CONSTANTS_UPDATED (1 << 20) /* X | | | */
+#define ZEND_ACC_IMPLEMENT_INTERFACES (1 << 14) /* X | | | */
/* | | | */
/* Class uses trait(s) | | | */
-#define ZEND_ACC_IMPLEMENT_TRAITS (1 << 22) /* X | | | */
+#define ZEND_ACC_IMPLEMENT_TRAITS (1 << 15) /* X | | | */
/* | | | */
/* User class has methods with static variables | | | */
-#define ZEND_HAS_STATIC_IN_METHODS (1 << 23) /* X | | | */
+#define ZEND_HAS_STATIC_IN_METHODS (1 << 16) /* X | | | */
/* | | | */
-/* Class has magic methods __get/__set/__unset/ | | | */
-/* __isset that use guards | | | */
-#define ZEND_ACC_USE_GUARDS (1 << 24) /* X | | | */
+/* Whether all property types are resolved to CEs | | | */
+#define ZEND_ACC_PROPERTY_TYPES_RESOLVED (1 << 17) /* X | | | */
+/* | | | */
+/* Children must reuse parent get_iterator() | | | */
+#define ZEND_ACC_REUSE_GET_ITERATOR (1 << 18) /* X | | | */
+/* | | | */
+/* Parent class is resolved (CE). | | | */
+#define ZEND_ACC_RESOLVED_PARENT (1 << 19) /* X | | | */
/* | | | */
-/* Function Flags (unused: 4, 5, 17?) | | | */
+/* Interfaces are resolved (CEs). | | | */
+#define ZEND_ACC_RESOLVED_INTERFACES (1 << 20) /* X | | | */
+/* | | | */
+/* Class has unresolved variance obligations. | | | */
+#define ZEND_ACC_UNRESOLVED_VARIANCE (1 << 21) /* X | | | */
+/* | | | */
+/* Class is linked apart from variance obligations. | | | */
+#define ZEND_ACC_NEARLY_LINKED (1 << 22) /* X | | | */
+/* | | | */
+/* Whether this class was used in its unlinked state. | | | */
+#define ZEND_ACC_HAS_UNLINKED_USES (1 << 23) /* X | | | */
+/* | | | */
+/* Function Flags (unused: 23, 26) | | | */
/* ============== | | | */
/* | | | */
-/* Abstarct method | | | */
-#define ZEND_ACC_ABSTRACT (1 << 1) /* | X | | */
+/* deprecation flag | | | */
+#define ZEND_ACC_DEPRECATED (1 << 11) /* | X | | */
/* | | | */
-/* TODO: used only during inheritance ??? | | | */
-#define ZEND_ACC_IMPLEMENTED_ABSTRACT (1 << 3) /* | X | | */
+/* Function returning by reference | | | */
+#define ZEND_ACC_RETURN_REFERENCE (1 << 12) /* | X | | */
/* | | | */
-#define ZEND_ACC_FAKE_CLOSURE (1 << 6) /* | X | | */
+/* Function has a return type | | | */
+#define ZEND_ACC_HAS_RETURN_TYPE (1 << 13) /* | X | | */
/* | | | */
-/* method flag used by Closure::__invoke() | | | */
-#define ZEND_ACC_USER_ARG_INFO (1 << 7) /* | X | | */
+/* Function with variable number of arguments | | | */
+#define ZEND_ACC_VARIADIC (1 << 14) /* | X | | */
/* | | | */
-/* method flags (special method detection) | | | */
-#define ZEND_ACC_CTOR (1 << 13) /* | X | | */
-#define ZEND_ACC_DTOR (1 << 14) /* | X | | */
+/* op_array has finally blocks (user only) | | | */
+#define ZEND_ACC_HAS_FINALLY_BLOCK (1 << 15) /* | X | | */
/* | | | */
/* "main" op_array with | | | */
-/* ZEND_DECLARE_INHERITED_CLASS_DELAYED opcodes | | | */
-#define ZEND_ACC_EARLY_BINDING (1 << 15) /* | X | | */
+/* ZEND_DECLARE_CLASS_DELAYED opcodes | | | */
+#define ZEND_ACC_EARLY_BINDING (1 << 16) /* | 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 | | */
+#define ZEND_ACC_ALLOW_STATIC (1 << 17) /* | X | | */
/* | | | */
/* call through user function trampoline. e.g. | | | */
/* __call, __callstatic | | | */
-#define ZEND_ACC_CALL_VIA_TRAMPOLINE (1 << 21) /* | X | | */
+#define ZEND_ACC_CALL_VIA_TRAMPOLINE (1 << 18) /* | X | | */
/* | | | */
/* disable inline caching | | | */
-#define ZEND_ACC_NEVER_CACHE (1 << 22) /* | X | | */
+#define ZEND_ACC_NEVER_CACHE (1 << 19) /* | X | | */
/* | | | */
-#define ZEND_ACC_GENERATOR (1 << 23) /* | X | | */
+/* Closure related | | | */
+#define ZEND_ACC_CLOSURE (1 << 20) /* | X | | */
+#define ZEND_ACC_FAKE_CLOSURE (1 << 21) /* | X | | */
/* | | | */
-/* Function with varable number of arguments | | | */
-#define ZEND_ACC_VARIADIC (1 << 24) /* | X | | */
+/* run_time_cache allocated on heap (user only) | | | */
+#define ZEND_ACC_HEAP_RT_CACHE (1 << 22) /* | X | | */
/* | | | */
-/* Immutable op_array (lazy loading) | | | */
-#define ZEND_ACC_IMMUTABLE (1 << 25) /* | X | | */
+/* method flag used by Closure::__invoke() (int only) | | | */
+#define ZEND_ACC_USER_ARG_INFO (1 << 22) /* | X | | */
/* | | | */
-/* Function returning by reference | | | */
-#define ZEND_ACC_RETURN_REFERENCE (1 << 26) /* | X | | */
+#define ZEND_ACC_GENERATOR (1 << 24) /* | X | | */
/* | | | */
-#define ZEND_ACC_DONE_PASS_TWO (1 << 27) /* | X | | */
+/* function was processed by pass two (user only) | | | */
+#define ZEND_ACC_DONE_PASS_TWO (1 << 25) /* | X | | */
/* | | | */
-/* Function has typed arguments | | | */
-#define ZEND_ACC_HAS_TYPE_HINTS (1 << 28) /* | X | | */
+/* internal function is allocated at arena (int only) | | | */
+#define ZEND_ACC_ARENA_ALLOCATED (1 << 25) /* | X | | */
/* | | | */
-/* op_array has finally blocks (user only) | | | */
-#define ZEND_ACC_HAS_FINALLY_BLOCK (1 << 29) /* | X | | */
+/* op_array is a clone of trait method | | | */
+#define ZEND_ACC_TRAIT_CLONE (1 << 27) /* | X | | */
/* | | | */
-/* internal function is allocated at arena (int only) | | | */
-#define ZEND_ACC_ARENA_ALLOCATED (1 << 29) /* | X | | */
+/* functions is a constructor | | | */
+#define ZEND_ACC_CTOR (1 << 28) /* | X | | */
/* | | | */
-/* Function has a return type | | | */
-#define ZEND_ACC_HAS_RETURN_TYPE (1 << 30) /* | X | | */
+/* function is a destructor | | | */
+#define ZEND_ACC_DTOR (1 << 29) /* | X | | */
+/* | | | */
+/* closure uses $this | | | */
+#define ZEND_ACC_USES_THIS (1 << 30) /* | X | | */
/* | | | */
/* op_array uses strict mode types | | | */
-#define ZEND_ACC_STRICT_TYPES (1 << 31) /* | X | | */
+#define ZEND_ACC_STRICT_TYPES (1U << 31) /* | X | | */
#define ZEND_ACC_PPP_MASK (ZEND_ACC_PUBLIC | ZEND_ACC_PROTECTED | ZEND_ACC_PRIVATE)
@@ -343,6 +365,7 @@ typedef struct _zend_property_info {
zend_string *name;
zend_string *doc_comment;
zend_class_entry *ce;
+ zend_type type;
} zend_property_info;
#define OBJ_PROP(obj, offset) \
@@ -350,7 +373,7 @@ typedef struct _zend_property_info {
#define OBJ_PROP_NUM(obj, num) \
(&(obj)->properties_table[(num)])
#define OBJ_PROP_TO_OFFSET(num) \
- ((uint32_t)(zend_uintptr_t)OBJ_PROP_NUM(((zend_object*)NULL), num))
+ ((uint32_t)(XtOffsetOf(zend_object, properties_table) + sizeof(zval) * (num)))
#define OBJ_PROP_TO_NUM(offset) \
((offset - OBJ_PROP_TO_OFFSET(0)) / sizeof(zval))
@@ -407,7 +430,8 @@ struct _zend_op_array {
uint32_t last; /* number of opcodes */
zend_op *opcodes;
- void **run_time_cache;
+ ZEND_MAP_PTR_DEF(void **, run_time_cache);
+ ZEND_MAP_PTR_DEF(HashTable *, static_variables_ptr);
HashTable *static_variables;
zend_string **vars; /* names of CV variables */
@@ -466,7 +490,7 @@ union _zend_function {
uint32_t fn_flags;
zend_string *function_name;
zend_class_entry *scope;
- union _zend_function *prototype;
+ zend_function *prototype;
uint32_t num_args;
uint32_t required_num_args;
zend_arg_info *arg_info;
@@ -476,13 +500,6 @@ union _zend_function {
zend_internal_function internal_function;
};
-typedef enum _zend_call_kind {
- ZEND_CALL_NESTED_FUNCTION, /* stackless VM call to function */
- ZEND_CALL_NESTED_CODE, /* stackless VM call to include/require/eval */
- ZEND_CALL_TOP_FUNCTION, /* direct VM call to function from external C code */
- ZEND_CALL_TOP_CODE /* direct VM call to "main" code from external C code */
-} zend_call_kind;
-
struct _zend_execute_data {
const zend_op *opline; /* executed opline */
zend_execute_data *call; /* current call */
@@ -491,30 +508,33 @@ struct _zend_execute_data {
zval This; /* this + call_info + num_args */
zend_execute_data *prev_execute_data;
zend_array *symbol_table;
-#if ZEND_EX_USE_RUN_TIME_CACHE
void **run_time_cache; /* cache op_array->run_time_cache */
-#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)
-#define ZEND_CALL_CTOR (1 << 3)
-#define ZEND_CALL_HAS_SYMBOL_TABLE (1 << 4)
-#define ZEND_CALL_CLOSURE (1 << 5)
-#define ZEND_CALL_RELEASE_THIS (1 << 6)
-#define ZEND_CALL_ALLOCATED (1 << 7)
-#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
+#define ZEND_CALL_HAS_THIS IS_OBJECT_EX
+
+/* Top 16 bits of Z_TYPE_INFO(EX(This)) are used as call_info flags */
+#define ZEND_CALL_FUNCTION (0 << 16)
+#define ZEND_CALL_CODE (1 << 16)
+#define ZEND_CALL_NESTED (0 << 17)
+#define ZEND_CALL_TOP (1 << 17)
+#define ZEND_CALL_ALLOCATED (1 << 18)
+#define ZEND_CALL_FREE_EXTRA_ARGS (1 << 19)
+#define ZEND_CALL_HAS_SYMBOL_TABLE (1 << 20)
+#define ZEND_CALL_RELEASE_THIS (1 << 21)
+#define ZEND_CALL_CLOSURE (1 << 22)
+#define ZEND_CALL_FAKE_CLOSURE (1 << 23)
+#define ZEND_CALL_GENERATOR (1 << 24)
+#define ZEND_CALL_DYNAMIC (1 << 25)
+#define ZEND_CALL_SEND_ARG_BY_REF (1u << 31)
+
+#define ZEND_CALL_NESTED_FUNCTION (ZEND_CALL_FUNCTION | ZEND_CALL_NESTED)
+#define ZEND_CALL_NESTED_CODE (ZEND_CALL_CODE | ZEND_CALL_NESTED)
+#define ZEND_CALL_TOP_FUNCTION (ZEND_CALL_TOP | ZEND_CALL_FUNCTION)
+#define ZEND_CALL_TOP_CODE (ZEND_CALL_CODE | ZEND_CALL_TOP)
#define ZEND_CALL_INFO(call) \
- (Z_TYPE_INFO((call)->This) >> ZEND_CALL_INFO_SHIFT)
+ Z_TYPE_INFO((call)->This)
#define ZEND_CALL_KIND_EX(call_info) \
(call_info & (ZEND_CALL_CODE | ZEND_CALL_TOP))
@@ -522,16 +542,12 @@ struct _zend_execute_data {
#define ZEND_CALL_KIND(call) \
ZEND_CALL_KIND_EX(ZEND_CALL_INFO(call))
-#define ZEND_SET_CALL_INFO(call, object, info) do { \
- Z_TYPE_INFO((call)->This) = ((object) ? IS_OBJECT_EX : IS_UNDEF) | ((info) << ZEND_CALL_INFO_SHIFT); \
- } while (0)
-
#define ZEND_ADD_CALL_FLAG_EX(call_info, flag) do { \
- call_info |= ((flag) << ZEND_CALL_INFO_SHIFT); \
+ call_info |= (flag); \
} while (0)
#define ZEND_DEL_CALL_FLAG_EX(call_info, flag) do { \
- call_info &= ~((flag) << ZEND_CALL_INFO_SHIFT); \
+ call_info &= ~(flag); \
} while (0)
#define ZEND_ADD_CALL_FLAG(call, flag) do { \
@@ -678,24 +694,11 @@ struct _zend_execute_data {
(node).constant = RT_CONSTANT(opline, node) - (op_array)->literals; \
} while (0)
-#if ZEND_EX_USE_RUN_TIME_CACHE
-
-# define EX_RUN_TIME_CACHE() \
- EX(run_time_cache)
+#define RUN_TIME_CACHE(op_array) \
+ ZEND_MAP_PTR_GET((op_array)->run_time_cache)
-# define EX_LOAD_RUN_TIME_CACHE(op_array) do { \
- EX(run_time_cache) = (op_array)->run_time_cache; \
- } while (0)
-
-#else
-
-# define EX_RUN_TIME_CACHE() \
- EX(func)->op_array.run_time_cache
-
-# define EX_LOAD_RUN_TIME_CACHE(op_array) do { \
- } while (0)
-
-#endif
+#define ZEND_OP_ARRAY_EXTENSION(op_array, handle) \
+ ((void**)RUN_TIME_CACHE(op_array))[handle]
#define IS_UNUSED 0 /* Unused operand */
#define IS_CONST (1<<0)
@@ -757,11 +760,10 @@ zend_bool zend_handle_encoding_declaration(zend_ast *ast);
/* parser-driven code generators */
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 int do_bind_function(zval *lcname);
+ZEND_API int do_bind_class(zval *lcname, zend_string *lc_parent_name);
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);
+ZEND_API void zend_do_delayed_early_binding(zend_op_array *op_array, uint32_t first_early_binding_opline);
void zend_do_extended_info(void);
void zend_do_extended_fcall_begin(void);
@@ -780,7 +782,6 @@ ZEND_API void function_add_ref(zend_function *function);
ZEND_API zend_op_array *compile_file(zend_file_handle *file_handle, int type);
ZEND_API zend_op_array *compile_string(zval *source_string, char *filename);
ZEND_API zend_op_array *compile_filename(int type, zval *filename);
-ZEND_API void zend_try_exception_handler();
ZEND_API int zend_execute_scripts(int type, zval *retval, int file_count, ...);
ZEND_API int open_file_for_scanning(zend_file_handle *file_handle);
ZEND_API void init_op_array(zend_op_array *op_array, zend_uchar type, int initial_ops_size);
@@ -789,6 +790,17 @@ ZEND_API void zend_destroy_file_handle(zend_file_handle *file_handle);
ZEND_API void zend_cleanup_internal_class_data(zend_class_entry *ce);
ZEND_API void zend_cleanup_internal_classes(void);
+ZEND_API ZEND_COLD void zend_user_exception_handler(void);
+
+#define zend_try_exception_handler() do { \
+ if (UNEXPECTED(EG(exception))) { \
+ if (Z_TYPE(EG(user_exception_handler)) != IS_UNDEF) { \
+ zend_user_exception_handler(); \
+ } \
+ } \
+ } while (0)
+
+void zend_free_internal_arg_info(zend_internal_function *function);
ZEND_API void destroy_zend_function(zend_function *function);
ZEND_API void zend_function_dtor(zval *zv);
ZEND_API void destroy_zend_class(zval *zv);
@@ -799,9 +811,19 @@ ZEND_API zend_string *zend_mangle_property_name(const char *src1, size_t src1_le
zend_unmangle_property_name_ex(mangled_property, class_name, prop_name, NULL)
ZEND_API int zend_unmangle_property_name_ex(const zend_string *name, const char **class_name, const char **prop_name, size_t *prop_len);
+static zend_always_inline const char *zend_get_unmangled_property_name(const zend_string *mangled_prop) {
+ const char *class_name, *prop_name;
+ zend_unmangle_property_name(mangled_prop, &class_name, &prop_name);
+ return prop_name;
+}
+
#define ZEND_FUNCTION_DTOR zend_function_dtor
#define ZEND_CLASS_DTOR destroy_zend_class
+typedef zend_bool (*zend_needs_live_range_cb)(zend_op_array *op_array, zend_op *opline);
+ZEND_API void zend_recalc_live_ranges(
+ zend_op_array *op_array, zend_needs_live_range_cb needs_live_range);
+
ZEND_API int pass_two(zend_op_array *op_array);
ZEND_API zend_bool zend_is_compiling(void);
ZEND_API char *zend_make_compiled_string_description(const char *name);
@@ -810,11 +832,6 @@ 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;
@@ -832,8 +849,6 @@ ZEND_API void zend_set_function_arg_flags(zend_function *func);
int ZEND_FASTCALL zendlex(zend_parser_stack_elem *elem);
-int zend_add_literal(zend_op_array *op_array, zval *zv);
-
void zend_assert_valid_class_name(const zend_string *const_name);
/* BEGIN: OPCODES */
@@ -854,6 +869,8 @@ void zend_assert_valid_class_name(const zend_string *const_name);
#define ZEND_FETCH_CLASS_NO_AUTOLOAD 0x80
#define ZEND_FETCH_CLASS_SILENT 0x0100
#define ZEND_FETCH_CLASS_EXCEPTION 0x0200
+#define ZEND_FETCH_CLASS_ALLOW_UNLINKED 0x0400
+#define ZEND_FETCH_CLASS_ALLOW_NEARLY_LINKED 0x0800
#define ZEND_PARAM_REF (1<<0)
#define ZEND_PARAM_VARIADIC (1<<1)
@@ -894,9 +911,6 @@ void zend_assert_valid_class_name(const zend_string *const_name);
#define ZEND_REQUIRE (1<<3)
#define ZEND_REQUIRE_ONCE (1<<4)
-#define ZEND_CT (1<<0)
-#define ZEND_RT (1<<1)
-
/* global/local fetches */
#define ZEND_FETCH_GLOBAL (1<<1)
#define ZEND_FETCH_LOCAL (1<<2)
@@ -904,17 +918,25 @@ void zend_assert_valid_class_name(const zend_string *const_name);
#define ZEND_FETCH_TYPE_MASK 0xe
+/* Only one of these can ever be in use */
+#define ZEND_FETCH_REF 1
+#define ZEND_FETCH_DIM_WRITE 2
+#define ZEND_FETCH_OBJ_WRITE 3
+#define ZEND_FETCH_OBJ_FLAGS 3
+
#define ZEND_ISEMPTY (1<<0)
#define ZEND_LAST_CATCH (1<<0)
#define ZEND_FREE_ON_RETURN (1<<0)
+#define ZEND_FREE_SWITCH (1<<1)
-#define ZEND_SEND_BY_VAL 0
-#define ZEND_SEND_BY_REF 1
-#define ZEND_SEND_PREFER_REF 2
+#define ZEND_SEND_BY_VAL 0u
+#define ZEND_SEND_BY_REF 1u
+#define ZEND_SEND_PREFER_REF 2u
-#define ZEND_DIM_IS 1
+#define ZEND_DIM_IS (1 << 0) /* isset fetch needed for null coalesce */
+#define ZEND_DIM_ALTERNATIVE_SYNTAX (1 << 1) /* deprecated curly brace usage */
#define IS_CONSTANT_UNQUALIFIED 0x010
#define IS_CONSTANT_CLASS 0x080 /* __CLASS__ in trait */
@@ -941,7 +963,7 @@ static zend_always_inline int zend_check_arg_send_type(const zend_function *zf,
#define ARG_MAY_BE_SENT_BY_REF(zf, arg_num) \
zend_check_arg_send_type(zf, arg_num, ZEND_SEND_PREFER_REF)
-/* Quick API to check firat 12 arguments */
+/* Quick API to check first 12 arguments */
#define MAX_ARG_FLAG_NUM 12
#ifdef WORDS_BIGENDIAN
@@ -970,8 +992,9 @@ 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_BIND_VAL 0
+#define ZEND_BIND_REF 1
+#define ZEND_BIND_IMPLICIT 2
#define ZEND_RETURNS_FUNCTION (1<<0)
#define ZEND_RETURNS_VALUE (1<<1)
@@ -980,17 +1003,26 @@ static zend_always_inline int zend_check_arg_send_type(const zend_function *zf,
#define ZEND_ARRAY_NOT_PACKED (1<<1)
#define ZEND_ARRAY_SIZE_SHIFT 2
+/* Attribute for ternary inside parentheses */
+#define ZEND_PARENTHESIZED_CONDITIONAL 1
+
/* For "use" AST nodes and the seen symbol table */
#define ZEND_SYMBOL_CLASS (1<<0)
#define ZEND_SYMBOL_FUNCTION (1<<1)
#define ZEND_SYMBOL_CONST (1<<2)
+/* All increment opcodes are even (decrement are odd) */
+#define ZEND_IS_INCREMENT(opcode) (((opcode) & 1) == 0)
+
+#define ZEND_IS_BINARY_ASSIGN_OP_OPCODE(opcode) \
+ (((opcode) >= ZEND_ADD) && ((opcode) <= ZEND_POW))
+
/* Pseudo-opcodes that are used only temporarily during compilation */
+#define ZEND_PARENTHESIZED_CONCAT 252 /* removed with PHP 8 */
#define ZEND_GOTO 253
#define ZEND_BRK 254
#define ZEND_CONT 255
-
END_EXTERN_C()
#define ZEND_CLONE_FUNC_NAME "__clone"
@@ -1011,45 +1043,59 @@ END_EXTERN_C()
* to change the default compiler behavior */
/* generate extended debug information */
-#define ZEND_COMPILE_EXTENDED_INFO (1<<0)
+#define ZEND_COMPILE_EXTENDED_STMT (1<<0)
+#define ZEND_COMPILE_EXTENDED_FCALL (1<<1)
+#define ZEND_COMPILE_EXTENDED_INFO (ZEND_COMPILE_EXTENDED_STMT|ZEND_COMPILE_EXTENDED_FCALL)
/* call op_array handler of extendions */
-#define ZEND_COMPILE_HANDLE_OP_ARRAY (1<<1)
+#define ZEND_COMPILE_HANDLE_OP_ARRAY (1<<2)
/* generate ZEND_INIT_FCALL_BY_NAME for internal functions instead of ZEND_INIT_FCALL */
-#define ZEND_COMPILE_IGNORE_INTERNAL_FUNCTIONS (1<<2)
+#define ZEND_COMPILE_IGNORE_INTERNAL_FUNCTIONS (1<<3)
/* don't perform early binding for classes inherited form internal ones;
* in namespaces assume that internal class that doesn't exist at compile-time
* may apper in run-time */
-#define ZEND_COMPILE_IGNORE_INTERNAL_CLASSES (1<<3)
+#define ZEND_COMPILE_IGNORE_INTERNAL_CLASSES (1<<4)
-/* generate ZEND_DECLARE_INHERITED_CLASS_DELAYED opcode to delay early binding */
-#define ZEND_COMPILE_DELAYED_BINDING (1<<4)
+/* generate ZEND_DECLARE_CLASS_DELAYED opcode to delay early binding */
+#define ZEND_COMPILE_DELAYED_BINDING (1<<5)
/* disable constant substitution at compile-time */
-#define ZEND_COMPILE_NO_CONSTANT_SUBSTITUTION (1<<5)
+#define ZEND_COMPILE_NO_CONSTANT_SUBSTITUTION (1<<6)
/* disable usage of builtin instruction for strlen() */
-#define ZEND_COMPILE_NO_BUILTIN_STRLEN (1<<6)
+#define ZEND_COMPILE_NO_BUILTIN_STRLEN (1<<7)
/* disable substitution of persistent constants at compile-time */
-#define ZEND_COMPILE_NO_PERSISTENT_CONSTANT_SUBSTITUTION (1<<7)
+#define ZEND_COMPILE_NO_PERSISTENT_CONSTANT_SUBSTITUTION (1<<8)
/* generate ZEND_INIT_FCALL_BY_NAME for userland functions instead of ZEND_INIT_FCALL */
-#define ZEND_COMPILE_IGNORE_USER_FUNCTIONS (1<<8)
+#define ZEND_COMPILE_IGNORE_USER_FUNCTIONS (1<<9)
/* force ZEND_ACC_USE_GUARDS for all classes */
-#define ZEND_COMPILE_GUARDS (1<<9)
+#define ZEND_COMPILE_GUARDS (1<<10)
/* disable builtin special case function calls */
-#define ZEND_COMPILE_NO_BUILTINS (1<<10)
+#define ZEND_COMPILE_NO_BUILTINS (1<<11)
/* result of compilation may be stored in file cache */
-#define ZEND_COMPILE_WITH_FILE_CACHE (1<<11)
+#define ZEND_COMPILE_WITH_FILE_CACHE (1<<12)
+
+/* ignore functions and classes declared in other files */
+#define ZEND_COMPILE_IGNORE_OTHER_FILES (1<<13)
+
+/* this flag is set when compiler invoked by opcache_compile_file() */
+#define ZEND_COMPILE_WITHOUT_EXECUTION (1<<14)
+
+/* this flag is set when compiler invoked during preloading */
+#define ZEND_COMPILE_PRELOAD (1<<15)
/* disable jumptable optimization for switch statements */
-#define ZEND_COMPILE_NO_JUMPTABLES (1<<12)
+#define ZEND_COMPILE_NO_JUMPTABLES (1<<16)
+
+/* this flag is set when compiler invoked during preloading in separate process */
+#define ZEND_COMPILE_PRELOAD_IN_CHILD (1<<17)
/* The default value for CG(compiler_options) */
#define ZEND_COMPILE_DEFAULT ZEND_COMPILE_HANDLE_OP_ARRAY
@@ -1060,13 +1106,3 @@ END_EXTERN_C()
ZEND_API zend_bool zend_binary_op_produces_numeric_string_error(uint32_t opcode, zval *op1, zval *op2);
#endif /* ZEND_COMPILE_H */
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * indent-tabs-mode: t
- * End:
- * vim600: sw=4 ts=4 fdm=marker
- * vim<600: sw=4 ts=4
- */
diff --git a/Zend/zend_config.nw.h b/Zend/zend_config.nw.h
deleted file mode 100644
index c7cc81ea7f..0000000000
--- a/Zend/zend_config.nw.h
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- +----------------------------------------------------------------------+
- | 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: Andi Gutmans <andi@php.net> |
- | Zeev Suraski <zeev@php.net> |
- +----------------------------------------------------------------------+
-*/
-
-#ifndef ZEND_CONFIG_NW_H
-#define ZEND_CONFIG_NW_H
-
-
-#include <string.h>
-#include <float.h>
-
-typedef unsigned long ulong;
-typedef unsigned int uint;
-
-#define HAVE_ALLOCA 1
-#define HAVE_LIMITS_H 1
-/* #include <malloc.h> */
-
-#define HAVE_STRING_H 1
-#define HAVE_SYS_SELECT_H 1
-#define HAVE_STDLIB_H 1
-#undef HAVE_KILL
-#define HAVE_GETPID 1
-/* #define HAVE_ALLOCA_H 1 */
-#define HAVE_MEMCPY 1
-#define HAVE_STRDUP 1
-#define HAVE_SYS_TYPES_H 1
-/* #define HAVE_STDIOSTR_H 1 */
-#define HAVE_CLASS_ISTDIOSTREAM
-#define istdiostream stdiostream
-#define HAVE_STDARG_H 1
-#define HAVE_DLFCN_H 1
-/* #define HAVE_LIBDL 1 */
-#define HAVE_SNPRINTF 1
-#define HAVE_VSNPRINTF 1
-
-/*
-#define snprintf _snprintf
-#define vsnprintf _vsnprintf
-#define zend_isinf(a) 0
-#define zend_finite(x) _finite(x)
-#define zend_isnan(x) _isnan(x)
-*/
-
-#define zend_sprintf sprintf
-
-/* This will cause the compilation process to be MUCH longer, but will generate
- * a much quicker PHP binary
- */
-/*
-#undef inline
-#ifdef ZEND_WIN32_FORCE_INLINE
-# define inline __forceinline
-#else
-# define inline
-#endif
-*/
-
-/*
-#define zend_finite(A) _finite(A)
-#define zend_isnan(A) _isnan(A)
-*/
-
-#endif /* ZEND_CONFIG_NW_H */
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * indent-tabs-mode: t
- * End:
- * vim600: sw=4 ts=4 fdm=marker
- * vim<600: sw=4 ts=4
- */
diff --git a/Zend/zend_config.w32.h b/Zend/zend_config.w32.h
index cb58c8bdb2..19a5165e4b 100644
--- a/Zend/zend_config.w32.h
+++ b/Zend/zend_config.w32.h
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| Zend Engine |
+----------------------------------------------------------------------+
- | Copyright (c) 1998-2018 Zend Technologies Ltd. (http://www.zend.com) |
+ | Copyright (c) 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 |
@@ -38,9 +38,6 @@
#include <float.h>
-typedef unsigned long ulong;
-typedef unsigned int uint;
-
#define HAVE_STDIOSTR_H 1
#define HAVE_CLASS_ISTDIOSTREAM
#define istdiostream stdiostream
@@ -50,11 +47,18 @@ typedef unsigned int uint;
#endif
#define strcasecmp(s1, s2) _stricmp(s1, s2)
#define strncasecmp(s1, s2, n) _strnicmp(s1, s2, n)
+#if defined(__cplusplus) && __cplusplus >= 201103L
+extern "C++" {
+#include <cmath>
+#define zend_isnan std::isnan
+#define zend_isinf std::isinf
+#define zend_finite std::isfinite
+}
+#else
#define zend_isinf(a) ((_fpclass(a) == _FPCLASS_PINF) || (_fpclass(a) == _FPCLASS_NINF))
#define zend_finite(x) _finite(x)
#define zend_isnan(x) _isnan(x)
-
-#define zend_sprintf sprintf
+#endif
#ifndef __cplusplus
/* This will cause the compilation process to be MUCH longer, but will generate
@@ -76,13 +80,3 @@ typedef unsigned int uint;
#define ZEND_DLIMPORT __declspec(dllimport)
#endif /* ZEND_CONFIG_W32_H */
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * indent-tabs-mode: t
- * End:
- * vim600: sw=4 ts=4 fdm=marker
- * vim<600: sw=4 ts=4
- */
diff --git a/Zend/zend_constants.c b/Zend/zend_constants.c
index e2a945c746..49ee762c60 100644
--- a/Zend/zend_constants.c
+++ b/Zend/zend_constants.c
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| Zend Engine |
+----------------------------------------------------------------------+
- | Copyright (c) 1998-2018 Zend Technologies Ltd. (http://www.zend.com) |
+ | Copyright (c) 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 |
@@ -83,9 +83,9 @@ static int clean_module_constant(zval *el, void *arg)
int module_number = *(int *)arg;
if (ZEND_CONSTANT_MODULE_NUMBER(c) == module_number) {
- return 1;
+ return ZEND_HASH_APPLY_REMOVE;
} else {
- return 0;
+ return ZEND_HASH_APPLY_KEEP;
}
}
@@ -532,14 +532,3 @@ ZEND_API int zend_register_constant(zend_constant *c)
}
return ret;
}
-
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * indent-tabs-mode: t
- * End:
- * vim600: sw=4 ts=4 fdm=marker
- * vim<600: sw=4 ts=4
- */
diff --git a/Zend/zend_constants.h b/Zend/zend_constants.h
index d4499e09f3..ba0c798dc6 100644
--- a/Zend/zend_constants.h
+++ b/Zend/zend_constants.h
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| Zend Engine |
+----------------------------------------------------------------------+
- | Copyright (c) 1998-2018 Zend Technologies Ltd. (http://www.zend.com) |
+ | Copyright (c) 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 |
@@ -94,13 +94,3 @@ END_EXTERN_C()
#define ZEND_CONSTANT_DTOR free_zend_constant
#endif
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * indent-tabs-mode: t
- * End:
- * vim600: sw=4 ts=4 fdm=marker
- * vim<600: sw=4 ts=4
- */
diff --git a/Zend/zend_cpuinfo.c b/Zend/zend_cpuinfo.c
index 4cbd2ac776..8851764f57 100644
--- a/Zend/zend_cpuinfo.c
+++ b/Zend/zend_cpuinfo.c
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| Zend Engine |
+----------------------------------------------------------------------+
- | Copyright (c) 2018-2018 Zend Technologies Ltd. (http://www.zend.com) |
+ | Copyright (c) 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 |
@@ -107,11 +107,3 @@ ZEND_API int zend_cpu_supports(zend_cpu_feature feature) {
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
index 2cd9626d11..c0949e3638 100644
--- a/Zend/zend_cpuinfo.h
+++ b/Zend/zend_cpuinfo.h
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| Zend Engine |
+----------------------------------------------------------------------+
- | Copyright (c) 2018-2018 Zend Technologies Ltd. (http://www.zend.com) |
+ | Copyright (c) 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 |
@@ -22,7 +22,7 @@
#include "zend.h"
#define ZEND_CPU_EBX_MASK (1<<30)
-#define ZEND_CPU_EDX_MASK (1<<31)
+#define ZEND_CPU_EDX_MASK (1U<<31)
typedef enum _zend_cpu_feature {
/* ECX */
@@ -100,6 +100,10 @@ typedef enum _zend_cpu_feature {
void zend_cpu_startup();
ZEND_API int zend_cpu_supports(zend_cpu_feature feature);
+#ifndef __has_attribute
+# define __has_attribute(x) 0
+#endif
+
/* Address sanitizer is incompatible with ifunc resolvers, so exclude the
* CPU support helpers from asan.
* See also https://github.com/google/sanitizers/issues/342. */
@@ -112,8 +116,8 @@ ZEND_API int zend_cpu_supports(zend_cpu_feature feature);
#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
+ * before all PLT symbols are resolved. in other words,
+ * resolver functions should not depend on any external
* functions */
ZEND_NO_SANITIZE_ADDRESS
static zend_always_inline int zend_cpu_supports_sse2() {
@@ -203,11 +207,3 @@ static zend_always_inline int zend_cpu_supports_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 47da7ad5f3..2c42763f0c 100644
--- a/Zend/zend_default_classes.c
+++ b/Zend/zend_default_classes.c
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| Zend Engine |
+----------------------------------------------------------------------+
- | Copyright (c) 1998-2018 Zend Technologies Ltd. (http://www.zend.com) |
+ | Copyright (c) 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 |
@@ -24,7 +24,7 @@
#include "zend_exceptions.h"
#include "zend_closures.h"
#include "zend_generators.h"
-
+#include "zend_weakrefs.h"
ZEND_API void zend_register_default_classes(void)
{
@@ -33,14 +33,5 @@ ZEND_API void zend_register_default_classes(void)
zend_register_iterator_wrapper();
zend_register_closure_ce();
zend_register_generator_ce();
+ zend_register_weakref_ce();
}
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * indent-tabs-mode: t
- * End:
- * vim600: sw=4 ts=4 fdm=marker
- * vim<600: sw=4 ts=4
- */
diff --git a/Zend/zend_dtrace.c b/Zend/zend_dtrace.c
index f49750e453..750fb686c8 100644
--- a/Zend/zend_dtrace.c
+++ b/Zend/zend_dtrace.c
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| Zend Engine |
+----------------------------------------------------------------------+
- | Copyright (c) 1998-2009 Zend Technologies Ltd. (http://www.zend.com) |
+ | Copyright (c) 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 |
@@ -112,13 +112,3 @@ ZEND_API void dtrace_execute_internal(zend_execute_data *execute_data, zval *ret
/* }}} */
#endif /* HAVE_DTRACE */
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * indent-tabs-mode: t
- * End:
- * vim600: sw=4 ts=4 fdm=marker
- * vim<600: sw=4 ts=4
- */
diff --git a/Zend/zend_dtrace.d b/Zend/zend_dtrace.d
index 5e659741e2..6920d0e360 100644
--- a/Zend/zend_dtrace.d
+++ b/Zend/zend_dtrace.d
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| Zend Engine |
+----------------------------------------------------------------------+
- | Copyright (c) 1998-2009 Zend Technologies Ltd. (http://www.zend.com) |
+ | Copyright (c) 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 |
diff --git a/Zend/zend_dtrace.h b/Zend/zend_dtrace.h
index 793d27b75e..c4fedadd40 100644
--- a/Zend/zend_dtrace.h
+++ b/Zend/zend_dtrace.h
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| Zend Engine |
+----------------------------------------------------------------------+
- | Copyright (c) 1998-2009 Zend Technologies Ltd. (http://www.zend.com) |
+ | Copyright (c) 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 |
@@ -44,13 +44,3 @@ ZEND_API void dtrace_execute_internal(zend_execute_data *execute_data, zval *ret
#endif
#endif /* _ZEND_DTRACE_H */
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * indent-tabs-mode: t
- * End:
- * vim600: sw=4 ts=4 fdm=marker
- * vim<600: sw=4 ts=4
- */
diff --git a/Zend/zend_errors.h b/Zend/zend_errors.h
index 8fa82623e1..441458c033 100644
--- a/Zend/zend_errors.h
+++ b/Zend/zend_errors.h
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| Zend Engine |
+----------------------------------------------------------------------+
- | Copyright (c) 1998-2018 Zend Technologies Ltd. (http://www.zend.com) |
+ | Copyright (c) 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 |
@@ -40,13 +40,3 @@
#define E_CORE (E_CORE_ERROR | E_CORE_WARNING)
#endif /* ZEND_ERRORS_H */
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * indent-tabs-mode: t
- * End:
- * vim600: sw=4 ts=4 fdm=marker
- * vim<600: sw=4 ts=4
- */
diff --git a/Zend/zend_exceptions.c b/Zend/zend_exceptions.c
index 371c38dcd6..2d52e4e49e 100644
--- a/Zend/zend_exceptions.c
+++ b/Zend/zend_exceptions.c
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| Zend Engine |
+----------------------------------------------------------------------+
- | Copyright (c) 1998-2018 Zend Technologies Ltd. (http://www.zend.com) |
+ | Copyright (c) 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 |
@@ -185,16 +185,18 @@ ZEND_API ZEND_COLD void zend_throw_exception_internal(zval *exception) /* {{{ */
ZEND_API void zend_clear_exception(void) /* {{{ */
{
+ zend_object *exception;
if (EG(prev_exception)) {
-
OBJ_RELEASE(EG(prev_exception));
EG(prev_exception) = NULL;
}
if (!EG(exception)) {
return;
}
- OBJ_RELEASE(EG(exception));
+ /* exception may have destructor */
+ exception = EG(exception);
EG(exception) = NULL;
+ OBJ_RELEASE(exception);
if (EG(current_execute_data)) {
EG(current_execute_data)->opline = EG(opline_before_exception);
}
@@ -218,7 +220,9 @@ static zend_object *zend_default_exception_new_ex(zend_class_entry *class_type,
object_properties_init(object, class_type);
if (EG(current_execute_data)) {
- zend_fetch_debug_backtrace(&trace, skip_top_traces, 0, 0);
+ zend_fetch_debug_backtrace(&trace,
+ skip_top_traces,
+ EG(exception_ignore_args) ? DEBUG_BACKTRACE_IGNORE_ARGS : 0, 0);
} else {
array_init(&trace);
}
@@ -276,7 +280,7 @@ ZEND_METHOD(exception, __construct)
zend_class_entry *base_ce;
int argc = ZEND_NUM_ARGS();
- object = getThis();
+ object = ZEND_THIS;
base_ce = i_get_exception_base(object);
if (zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, argc, "|SlO!", &message, &code, &previous, zend_ce_throwable) == FAILURE) {
@@ -320,7 +324,7 @@ ZEND_METHOD(exception, __construct)
ZEND_METHOD(exception, __wakeup)
{
zval value, *pvalue;
- zval *object = getThis();
+ zval *object = ZEND_THIS;
CHECK_EXC_TYPE(ZEND_STR_MESSAGE, IS_STRING);
CHECK_EXC_TYPE(ZEND_STR_STRING, IS_STRING);
CHECK_EXC_TYPE(ZEND_STR_CODE, IS_LONG);
@@ -359,7 +363,7 @@ ZEND_METHOD(error_exception, __construct)
return;
}
- object = getThis();
+ object = ZEND_THIS;
if (message) {
ZVAL_STR_COPY(&tmp, message);
@@ -410,7 +414,7 @@ ZEND_METHOD(exception, getFile)
DEFAULT_0_PARAMS;
- prop = GET_PROPERTY(getThis(), ZEND_STR_FILE);
+ prop = GET_PROPERTY(ZEND_THIS, ZEND_STR_FILE);
ZVAL_DEREF(prop);
ZVAL_COPY(return_value, prop);
}
@@ -424,7 +428,7 @@ ZEND_METHOD(exception, getLine)
DEFAULT_0_PARAMS;
- prop = GET_PROPERTY(getThis(), ZEND_STR_LINE);
+ prop = GET_PROPERTY(ZEND_THIS, ZEND_STR_LINE);
ZVAL_DEREF(prop);
ZVAL_COPY(return_value, prop);
}
@@ -438,7 +442,7 @@ ZEND_METHOD(exception, getMessage)
DEFAULT_0_PARAMS;
- prop = GET_PROPERTY(getThis(), ZEND_STR_MESSAGE);
+ prop = GET_PROPERTY(ZEND_THIS, ZEND_STR_MESSAGE);
ZVAL_DEREF(prop);
ZVAL_COPY(return_value, prop);
}
@@ -452,7 +456,7 @@ ZEND_METHOD(exception, getCode)
DEFAULT_0_PARAMS;
- prop = GET_PROPERTY(getThis(), ZEND_STR_CODE);
+ prop = GET_PROPERTY(ZEND_THIS, ZEND_STR_CODE);
ZVAL_DEREF(prop);
ZVAL_COPY(return_value, prop);
}
@@ -466,7 +470,7 @@ ZEND_METHOD(exception, getTrace)
DEFAULT_0_PARAMS;
- prop = GET_PROPERTY(getThis(), ZEND_STR_TRACE);
+ prop = GET_PROPERTY(ZEND_THIS, ZEND_STR_TRACE);
ZVAL_DEREF(prop);
ZVAL_COPY(return_value, prop);
}
@@ -480,7 +484,7 @@ ZEND_METHOD(error_exception, getSeverity)
DEFAULT_0_PARAMS;
- prop = GET_PROPERTY(getThis(), ZEND_STR_SEVERITY);
+ prop = GET_PROPERTY(ZEND_THIS, ZEND_STR_SEVERITY);
ZVAL_DEREF(prop);
ZVAL_COPY(return_value, prop);
}
@@ -628,7 +632,7 @@ ZEND_METHOD(exception, getTraceAsString)
DEFAULT_0_PARAMS;
- object = getThis();
+ object = ZEND_THIS;
base_ce = i_get_exception_base(object);
trace = zend_read_property_ex(base_ce, object, ZSTR_KNOWN(ZEND_STR_TRACE), 1, &rv);
@@ -661,7 +665,7 @@ ZEND_METHOD(exception, getPrevious)
DEFAULT_0_PARAMS;
- ZVAL_COPY(return_value, GET_PROPERTY_SILENT(getThis(), ZEND_STR_PREVIOUS));
+ ZVAL_COPY(return_value, GET_PROPERTY_SILENT(ZEND_THIS, ZEND_STR_PREVIOUS));
} /* }}} */
/* {{{ proto string Exception|Error::__toString()
@@ -679,7 +683,7 @@ ZEND_METHOD(exception, __toString)
str = ZSTR_EMPTY_ALLOC();
- exception = getThis();
+ exception = ZEND_THIS;
fname = zend_string_init("gettraceasstring", sizeof("gettraceasstring")-1, 0);
while (exception && Z_TYPE_P(exception) == IS_OBJECT && instanceof_function(Z_OBJCE_P(exception), zend_ce_throwable)) {
@@ -736,7 +740,7 @@ ZEND_METHOD(exception, __toString)
}
zend_string_release_ex(fname, 0);
- exception = getThis();
+ exception = ZEND_THIS;
/* 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_IS_RECURSIVE_P(exception)) {
@@ -747,7 +751,7 @@ ZEND_METHOD(exception, __toString)
exception = GET_PROPERTY(exception, ZEND_STR_PREVIOUS);
}
- exception = getThis();
+ exception = ZEND_THIS;
base_ce = i_get_exception_base(exception);
/* We store the result in the private property string so we can access
@@ -779,7 +783,7 @@ static const zend_function_entry zend_funcs_throwable[] = {
* such exceptions in that handler.
* Also all getXY() methods are final because thy serve as read only access to
* their corresponding properties, no more, no less. If after all you need to
- * override somthing then it is method __toString().
+ * override something then it is method __toString().
* And never try to change the state of exceptions and never implement anything
* that gives the user anything to accomplish this.
*/
@@ -983,7 +987,7 @@ ZEND_API ZEND_COLD void zend_exception_error(zend_object *ex, int severity) /* {
zend_class_entry *ce_exception;
ZVAL_OBJ(&exception, ex);
- ce_exception = Z_OBJCE(exception);
+ ce_exception = ex->ce;
EG(exception) = NULL;
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));
@@ -996,7 +1000,7 @@ ZEND_API ZEND_COLD void zend_exception_error(zend_object *ex, int severity) /* {
zend_string_release_ex(file, 0);
zend_string_release_ex(message, 0);
} else if (instanceof_function(ce_exception, zend_ce_throwable)) {
- zval tmp, rv;
+ zval tmp;
zend_string *str, *file = NULL;
zend_long line = 0;
@@ -1064,13 +1068,3 @@ ZEND_API ZEND_COLD void zend_throw_exception_object(zval *exception) /* {{{ */
zend_throw_exception_internal(exception);
}
/* }}} */
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * indent-tabs-mode: t
- * End:
- * vim600: sw=4 ts=4 fdm=marker
- * vim<600: sw=4 ts=4
- */
diff --git a/Zend/zend_exceptions.h b/Zend/zend_exceptions.h
index 357a561ec7..5f31c4b25b 100644
--- a/Zend/zend_exceptions.h
+++ b/Zend/zend_exceptions.h
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| Zend Engine |
+----------------------------------------------------------------------+
- | Copyright (c) 1998-2018 Zend Technologies Ltd. (http://www.zend.com) |
+ | Copyright (c) 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 |
@@ -80,13 +80,3 @@ static zend_always_inline void zend_rethrow_exception(zend_execute_data *execute
END_EXTERN_C()
#endif
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * indent-tabs-mode: t
- * End:
- * vim600: sw=4 ts=4 fdm=marker
- * vim<600: sw=4 ts=4
- */
diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c
index 0eb6639b2e..59c151fe66 100644
--- a/Zend/zend_execute.c
+++ b/Zend/zend_execute.c
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| Zend Engine |
+----------------------------------------------------------------------+
- | Copyright (c) 1998-2018 Zend Technologies Ltd. (http://www.zend.com) |
+ | Copyright (c) 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 |
@@ -56,6 +56,9 @@
# elif defined(__IBMC__) && ZEND_GCC_VERSION >= 4002 && defined(__powerpc64__)
# define ZEND_VM_FP_GLOBAL_REG "r28"
# define ZEND_VM_IP_GLOBAL_REG "r29"
+# elif defined(__GNUC__) && ZEND_GCC_VERSION >= 4008 && defined(__aarch64__)
+# define ZEND_VM_FP_GLOBAL_REG "x27"
+# define ZEND_VM_IP_GLOBAL_REG "x28"
# endif
#endif
@@ -63,21 +66,28 @@
# pragma GCC diagnostic ignored "-Wvolatile-register-var"
register zend_execute_data* volatile execute_data __asm__(ZEND_VM_FP_GLOBAL_REG);
# pragma GCC diagnostic warning "-Wvolatile-register-var"
+#endif
+
+#if defined(ZEND_VM_FP_GLOBAL_REG) && ((ZEND_VM_KIND == ZEND_VM_KIND_CALL) || (ZEND_VM_KIND == ZEND_VM_KIND_HYBRID))
# define EXECUTE_DATA_D void
# define EXECUTE_DATA_C
# 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
+#endif
+
+#if defined(ZEND_VM_FP_GLOBAL_REG) && ((ZEND_VM_KIND == ZEND_VM_KIND_CALL) || (ZEND_VM_KIND == ZEND_VM_KIND_HYBRID))
+# define OPLINE_D void
+# define OPLINE_C
+# define OPLINE_DC
+# define OPLINE_CC
+#else
# define OPLINE_D const zend_op* opline
# define OPLINE_C opline
# define OPLINE_DC , OPLINE_D
@@ -131,9 +141,6 @@ ZEND_API const zend_internal_function zend_pass_function = {
{NULL,NULL,NULL,NULL} /* reserved */
};
-#undef zval_ptr_dtor
-#define zval_ptr_dtor(zv) i_zval_ptr_dtor(zv ZEND_FILE_LINE_CC)
-
#define FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op, result) do { \
zval *__container_to_free = (free_op); \
if (UNEXPECTED(__container_to_free) \
@@ -187,7 +194,6 @@ 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;
}
@@ -262,21 +268,35 @@ static zend_always_inline zval *_get_zval_ptr_var_deref(uint32_t var, zend_free_
return ret;
}
-static zend_never_inline ZEND_COLD void zval_undefined_cv(uint32_t var EXECUTE_DATA_DC)
+static zend_never_inline ZEND_COLD zval* zval_undefined_cv(uint32_t var EXECUTE_DATA_DC)
{
if (EXPECTED(EG(exception) == NULL)) {
zend_string *cv = CV_DEF_OF(EX_VAR_TO_NUM(var));
zend_error(E_NOTICE, "Undefined variable: %s", ZSTR_VAL(cv));
}
+ return &EG(uninitialized_zval);
+}
+
+static zend_never_inline ZEND_COLD zval* ZEND_FASTCALL _zval_undefined_op1(EXECUTE_DATA_D)
+{
+ return zval_undefined_cv(EX(opline)->op1.var EXECUTE_DATA_CC);
}
+static zend_never_inline ZEND_COLD zval* ZEND_FASTCALL _zval_undefined_op2(EXECUTE_DATA_D)
+{
+ return zval_undefined_cv(EX(opline)->op2.var EXECUTE_DATA_CC);
+}
+
+#define ZVAL_UNDEFINED_OP1() _zval_undefined_op1(EXECUTE_DATA_C)
+#define ZVAL_UNDEFINED_OP2() _zval_undefined_op2(EXECUTE_DATA_C)
+
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:
case BP_VAR_UNSET:
- zval_undefined_cv(var EXECUTE_DATA_CC);
- /* break missing intentionally */
+ ptr = zval_undefined_cv(var EXECUTE_DATA_CC);
+ break;
case BP_VAR_IS:
ptr = &EG(uninitialized_zval);
break;
@@ -290,25 +310,6 @@ static zend_never_inline ZEND_COLD zval *_get_zval_cv_lookup(zval *ptr, uint32_t
return ptr;
}
-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_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_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_ptr_cv(uint32_t var, int type EXECUTE_DATA_DC)
{
zval *ret = EX_VAR(var);
@@ -344,7 +345,7 @@ static zend_always_inline zval *_get_zval_ptr_cv_BP_VAR_R(uint32_t var EXECUTE_D
zval *ret = EX_VAR(var);
if (UNEXPECTED(Z_TYPE_P(ret) == IS_UNDEF)) {
- return _get_zval_cv_lookup_BP_VAR_R(ret, var EXECUTE_DATA_CC);
+ return zval_undefined_cv(var EXECUTE_DATA_CC);
}
return ret;
}
@@ -354,28 +355,7 @@ static zend_always_inline zval *_get_zval_ptr_cv_deref_BP_VAR_R(uint32_t var EXE
zval *ret = EX_VAR(var);
if (UNEXPECTED(Z_TYPE_P(ret) == IS_UNDEF)) {
- return _get_zval_cv_lookup_BP_VAR_R(ret, var EXECUTE_DATA_CC);
- }
- ZVAL_DEREF(ret);
- return ret;
-}
-
-static zend_always_inline zval *_get_zval_ptr_cv_BP_VAR_UNSET(uint32_t var EXECUTE_DATA_DC)
-{
- zval *ret = EX_VAR(var);
-
- if (UNEXPECTED(Z_TYPE_P(ret) == IS_UNDEF)) {
- return _get_zval_cv_lookup_BP_VAR_UNSET(ret, var EXECUTE_DATA_CC);
- }
- return ret;
-}
-
-static zend_always_inline zval *_get_zval_ptr_cv_deref_BP_VAR_UNSET(uint32_t var EXECUTE_DATA_DC)
-{
- zval *ret = EX_VAR(var);
-
- if (UNEXPECTED(Z_TYPE_P(ret) == IS_UNDEF)) {
- return _get_zval_cv_lookup_BP_VAR_UNSET(ret, var EXECUTE_DATA_CC);
+ return zval_undefined_cv(var EXECUTE_DATA_CC);
}
ZVAL_DEREF(ret);
return ret;
@@ -388,65 +368,36 @@ static zend_always_inline zval *_get_zval_ptr_cv_BP_VAR_IS(uint32_t var EXECUTE_
return ret;
}
-static zend_always_inline zval *_get_zval_ptr_cv_deref_BP_VAR_IS(uint32_t var EXECUTE_DATA_DC)
-{
- zval *ret = EX_VAR(var);
-
- ZVAL_DEREF(ret);
- return ret;
-}
-
static zend_always_inline zval *_get_zval_ptr_cv_BP_VAR_RW(uint32_t var EXECUTE_DATA_DC)
{
zval *ret = EX_VAR(var);
if (UNEXPECTED(Z_TYPE_P(ret) == IS_UNDEF)) {
- return _get_zval_cv_lookup_BP_VAR_RW(ret, var EXECUTE_DATA_CC);
- }
- return ret;
-}
-
-static zend_always_inline zval *_get_zval_ptr_cv_deref_BP_VAR_RW(uint32_t var EXECUTE_DATA_DC)
-{
- zval *ret = EX_VAR(var);
-
- if (UNEXPECTED(Z_TYPE_P(ret) == IS_UNDEF)) {
- return _get_zval_cv_lookup_BP_VAR_RW(ret, var EXECUTE_DATA_CC);
- }
- ZVAL_DEREF(ret);
- return ret;
-}
-
-static zend_always_inline zval *_get_zval_ptr_cv_BP_VAR_W(uint32_t var EXECUTE_DATA_DC)
-{
- zval *ret = EX_VAR(var);
-
- if (Z_TYPE_P(ret) == IS_UNDEF) {
ZVAL_NULL(ret);
+ zval_undefined_cv(var EXECUTE_DATA_CC);
+ return ret;
}
return ret;
}
-static zend_always_inline zval *_get_zval_ptr_cv_deref_BP_VAR_W(uint32_t var EXECUTE_DATA_DC)
+static zend_always_inline zval *_get_zval_ptr_cv_BP_VAR_W(uint32_t var EXECUTE_DATA_DC)
{
zval *ret = EX_VAR(var);
if (Z_TYPE_P(ret) == IS_UNDEF) {
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 OPLINE_DC)
{
if (op_type & (IS_TMP_VAR|IS_VAR)) {
- if (op_type == IS_TMP_VAR) {
- return _get_zval_ptr_tmp(node.var, should_free EXECUTE_DATA_CC);
- } else {
- ZEND_ASSERT(op_type == IS_VAR);
+ if (!ZEND_DEBUG || op_type == IS_VAR) {
return _get_zval_ptr_var(node.var, should_free EXECUTE_DATA_CC);
+ } else {
+ ZEND_ASSERT(op_type == IS_TMP_VAR);
+ return _get_zval_ptr_tmp(node.var, should_free EXECUTE_DATA_CC);
}
} else {
*should_free = NULL;
@@ -463,11 +414,11 @@ static zend_always_inline zval *_get_zval_ptr(int op_type, znode_op node, zend_f
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) {
- return _get_zval_ptr_tmp(node.var, should_free EXECUTE_DATA_CC);
- } else {
- ZEND_ASSERT(op_type == IS_VAR);
+ if (!ZEND_DEBUG || op_type == IS_VAR) {
return _get_zval_ptr_var(node.var, should_free EXECUTE_DATA_CC);
+ } else {
+ ZEND_ASSERT(op_type == IS_TMP_VAR);
+ return _get_zval_ptr_tmp(node.var, should_free EXECUTE_DATA_CC);
}
} else {
*should_free = NULL;
@@ -481,7 +432,7 @@ static zend_always_inline zval *_get_op_data_zval_ptr_r(int op_type, znode_op no
}
}
-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)
+static zend_always_inline ZEND_ATTRIBUTE_UNUSED 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) {
@@ -502,7 +453,7 @@ static zend_always_inline zval *_get_zval_ptr_deref(int op_type, znode_op node,
}
}
-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)
+static zend_always_inline ZEND_ATTRIBUTE_UNUSED 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) {
@@ -526,11 +477,11 @@ static zend_always_inline zval *_get_op_data_zval_ptr_deref_r(int op_type, znode
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) {
- return _get_zval_ptr_tmp(node.var, should_free EXECUTE_DATA_CC);
- } else {
- ZEND_ASSERT(op_type == IS_VAR);
+ if (!ZEND_DEBUG || op_type == IS_VAR) {
return _get_zval_ptr_var(node.var, should_free EXECUTE_DATA_CC);
+ } else {
+ ZEND_ASSERT(op_type == IS_TMP_VAR);
+ return _get_zval_ptr_tmp(node.var, should_free EXECUTE_DATA_CC);
}
} else {
*should_free = NULL;
@@ -568,7 +519,7 @@ static inline zval *_get_zval_ptr_ptr(int op_type, znode_op node, zend_free_op *
}
}
-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)
+static inline ZEND_ATTRIBUTE_UNUSED 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;
@@ -577,7 +528,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 OPLINE_DC)
+static inline ZEND_ATTRIBUTE_UNUSED 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;
@@ -586,7 +537,7 @@ static inline zval *_get_obj_zval_ptr_undef(int op_type, znode_op op, zend_free_
return get_zval_ptr_undef(op_type, op, should_free, type);
}
-static inline zval *_get_obj_zval_ptr_ptr(int op_type, znode_op node, zend_free_op *should_free, int type EXECUTE_DATA_DC)
+static inline ZEND_ATTRIBUTE_UNUSED zval *_get_obj_zval_ptr_ptr(int op_type, znode_op node, zend_free_op *should_free, int type EXECUTE_DATA_DC)
{
if (op_type == IS_UNUSED) {
*should_free = NULL;
@@ -621,42 +572,91 @@ 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)
+static zend_never_inline zval* zend_assign_to_typed_property_reference(zend_property_info *prop_info, zval *prop, zval *value_ptr EXECUTE_DATA_DC)
+{
+ if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) {
+ return &EG(uninitialized_zval);
+ }
+ if (Z_ISREF_P(prop)) {
+ ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(prop), prop_info);
+ }
+ zend_assign_to_variable_reference(prop, value_ptr);
+ ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(prop), prop_info);
+ return prop;
+}
+
+static zend_never_inline ZEND_COLD int zend_wrong_assign_to_variable_reference(zval *variable_ptr, zval *value_ptr 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);
+ /* Use IS_TMP_VAR instead of IS_VAR to avoid ISREF check */
+ Z_TRY_ADDREF_P(value_ptr);
+ value_ptr = zend_assign_to_variable(variable_ptr, value_ptr, IS_TMP_VAR, EX_USES_STRICT_TYPES());
- 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));
+static void zend_format_type(zend_type type, const char **part1, const char **part2) {
+ *part1 = ZEND_TYPE_ALLOW_NULL(type) ? "?" : "";
+ if (ZEND_TYPE_IS_CLASS(type)) {
+ if (ZEND_TYPE_IS_CE(type)) {
+ *part2 = ZSTR_VAL(ZEND_TYPE_CE(type)->name);
+ } else {
+ *part2 = ZSTR_VAL(ZEND_TYPE_NAME(type));
+ }
+ } else {
+ *part2 = zend_get_type_by_const(ZEND_TYPE_CODE(type));
}
}
+static zend_never_inline ZEND_COLD void zend_throw_auto_init_in_prop_error(zend_property_info *prop, const char *type) {
+ const char *prop_type1, *prop_type2;
+ zend_format_type(prop->type, &prop_type1, &prop_type2);
+ zend_type_error(
+ "Cannot auto-initialize an %s inside property %s::$%s of type %s%s",
+ type,
+ ZSTR_VAL(prop->ce->name), zend_get_unmangled_property_name(prop->name),
+ prop_type1, prop_type2
+ );
+}
+
+static zend_never_inline ZEND_COLD void zend_throw_auto_init_in_ref_error(zend_property_info *prop, const char *type) {
+ const char *prop_type1, *prop_type2;
+ zend_format_type(prop->type, &prop_type1, &prop_type2);
+ zend_type_error(
+ "Cannot auto-initialize an %s inside a reference held by property %s::$%s of type %s%s",
+ type,
+ ZSTR_VAL(prop->ce->name), zend_get_unmangled_property_name(prop->name),
+ prop_type1, prop_type2
+ );
+}
+
+static zend_never_inline ZEND_COLD void zend_throw_access_uninit_prop_by_ref_error(
+ zend_property_info *prop) {
+ zend_throw_error(NULL,
+ "Cannot access uninitialized non-nullable property %s::$%s by reference",
+ ZSTR_VAL(prop->ce->name),
+ zend_get_unmangled_property_name(prop->name));
+}
+
+static zend_never_inline zend_bool zend_verify_ref_stdClass_assignable(zend_reference *ref);
+static zend_never_inline zend_bool zend_verify_ref_array_assignable(zend_reference *ref);
+
/* this should modify object only if it's empty */
-static zend_never_inline ZEND_COLD int ZEND_FASTCALL make_real_object(zval *object, zval *property OPLINE_DC EXECUTE_DATA_DC)
+static zend_never_inline ZEND_COLD zval* ZEND_FASTCALL make_real_object(zval *object, zval *property OPLINE_DC EXECUTE_DATA_DC)
{
zend_object *obj;
+ zval *ref = NULL;
+ if (Z_ISREF_P(object)) {
+ ref = object;
+ object = Z_REFVAL_P(object);
+ }
- if (EXPECTED(Z_TYPE_P(object) <= IS_FALSE)) {
- /* nothing to destroy */
- } else if (EXPECTED((Z_TYPE_P(object) == IS_STRING && Z_STRLEN_P(object) == 0))) {
- zval_ptr_dtor_nogc(object);
- } else {
+ if (UNEXPECTED(Z_TYPE_P(object) > IS_FALSE &&
+ (Z_TYPE_P(object) != IS_STRING || Z_STRLEN_P(object) != 0))) {
if (opline->op1_type != IS_VAR || EXPECTED(!Z_ISERROR_P(object))) {
zend_string *tmp_property_name;
zend_string *property_name = zval_get_tmp_string(property, &tmp_property_name);
@@ -666,6 +666,11 @@ static zend_never_inline ZEND_COLD int ZEND_FASTCALL make_real_object(zval *obje
|| 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 if (opline->opcode == ZEND_FETCH_OBJ_W
+ || opline->opcode == ZEND_FETCH_OBJ_RW
+ || opline->opcode == ZEND_FETCH_OBJ_FUNC_ARG
+ || opline->opcode == ZEND_ASSIGN_OBJ_REF) {
+ zend_error(E_WARNING, "Attempt to modify 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));
}
@@ -674,8 +679,19 @@ static zend_never_inline ZEND_COLD int ZEND_FASTCALL make_real_object(zval *obje
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_NULL(EX_VAR(opline->result.var));
}
- return 0;
+ return NULL;
+ }
+
+ if (ref && ZEND_REF_HAS_TYPE_SOURCES(Z_REF_P(ref))) {
+ if (UNEXPECTED(!zend_verify_ref_stdClass_assignable(Z_REF_P(ref)))) {
+ if (RETURN_VALUE_USED(opline)) {
+ ZVAL_UNDEF(EX_VAR(opline->result.var));
+ }
+ return NULL;
+ }
}
+
+ zval_ptr_dtor_nogc(object);
object_init(object);
Z_ADDREF_P(object);
obj = Z_OBJ_P(object);
@@ -686,29 +702,10 @@ static zend_never_inline ZEND_COLD int ZEND_FASTCALL make_real_object(zval *obje
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_NULL(EX_VAR(opline->result.var));
}
- return 0;
+ return NULL;
}
Z_DELREF_P(object);
- return 1;
-}
-
-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;
+ return object;
}
static ZEND_COLD void zend_verify_type_error_common(
@@ -792,6 +789,12 @@ static ZEND_COLD void zend_verify_arg_error(
const char *fname, *fsep, *fclass;
const char *need_msg, *need_kind, *need_or_null, *given_msg, *given_kind;
+ if (EG(exception)) {
+ /* The type verification itself might have already thrown an exception
+ * through a promoted warning. */
+ return;
+ }
+
if (value) {
zend_verify_type_error_common(
zf, arg_info, ce, value,
@@ -867,10 +870,7 @@ static zend_bool zend_verify_weak_scalar_type_hint(zend_uchar type_hint, zval *a
zend_string *dest;
/* on success "arg" is converted to IS_STRING */
- if (!zend_parse_arg_str_weak(arg, &dest)) {
- return 0;
- }
- return 1;
+ return zend_parse_arg_str_weak(arg, &dest);
}
default:
return 0;
@@ -891,17 +891,141 @@ static zend_bool zend_verify_scalar_type_hint(zend_uchar type_hint, zval *arg, z
return zend_verify_weak_scalar_type_hint(type_hint, arg);
}
+ZEND_COLD zend_never_inline void zend_verify_property_type_error(zend_property_info *info, zval *property)
+{
+ const char *prop_type1, *prop_type2;
+
+ /* we _may_ land here in case reading already errored and runtime cache thus has not been updated (i.e. it contains a valid but unrelated info) */
+ if (EG(exception)) {
+ return;
+ }
+
+ // TODO Switch to a more standard error message?
+ zend_format_type(info->type, &prop_type1, &prop_type2);
+ (void) prop_type1;
+ if (ZEND_TYPE_IS_CLASS(info->type)) {
+ zend_type_error("Typed property %s::$%s must be an instance of %s%s, %s used",
+ ZSTR_VAL(info->ce->name),
+ zend_get_unmangled_property_name(info->name),
+ prop_type2,
+ ZEND_TYPE_ALLOW_NULL(info->type) ? " or null" : "",
+ Z_TYPE_P(property) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(property)->name) : zend_get_type_by_const(Z_TYPE_P(property)));
+ } else {
+ zend_type_error("Typed property %s::$%s must be %s%s, %s used",
+ ZSTR_VAL(info->ce->name),
+ zend_get_unmangled_property_name(info->name),
+ prop_type2,
+ ZEND_TYPE_ALLOW_NULL(info->type) ? " or null" : "",
+ Z_TYPE_P(property) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(property)->name) : zend_get_type_by_const(Z_TYPE_P(property)));
+ }
+}
+
+static zend_bool zend_resolve_class_type(zend_type *type, zend_class_entry *self_ce) {
+ zend_class_entry *ce;
+ zend_string *name = ZEND_TYPE_NAME(*type);
+ if (zend_string_equals_literal_ci(name, "self")) {
+ /* We need to explicitly check for this here, to avoid updating the type in the trait and
+ * later using the wrong "self" when the trait is used in a class. */
+ if (UNEXPECTED((self_ce->ce_flags & ZEND_ACC_TRAIT) != 0)) {
+ zend_throw_error(NULL, "Cannot write a%s value to a 'self' typed static property of a trait", ZEND_TYPE_ALLOW_NULL(*type) ? " non-null" : "");
+ return 0;
+ }
+ ce = self_ce;
+ } else if (zend_string_equals_literal_ci(name, "parent")) {
+ if (UNEXPECTED(!self_ce->parent)) {
+ zend_throw_error(NULL, "Cannot access parent:: when current class scope has no parent");
+ return 0;
+ }
+ ce = self_ce->parent;
+ } else {
+ ce = zend_lookup_class_ex(name, NULL, ZEND_FETCH_CLASS_NO_AUTOLOAD);
+ if (UNEXPECTED(!ce)) {
+ return 0;
+ }
+ }
+
+ zend_string_release(name);
+ *type = ZEND_TYPE_ENCODE_CE(ce, ZEND_TYPE_ALLOW_NULL(*type));
+ return 1;
+}
+
+
+static zend_always_inline zend_bool i_zend_check_property_type(zend_property_info *info, zval *property, zend_bool strict)
+{
+ ZEND_ASSERT(!Z_ISREF_P(property));
+ if (ZEND_TYPE_IS_CLASS(info->type)) {
+ if (UNEXPECTED(Z_TYPE_P(property) != IS_OBJECT)) {
+ return Z_TYPE_P(property) == IS_NULL && ZEND_TYPE_ALLOW_NULL(info->type);
+ }
+
+ if (UNEXPECTED(!ZEND_TYPE_IS_CE(info->type)) && UNEXPECTED(!zend_resolve_class_type(&info->type, info->ce))) {
+ return 0;
+ }
+
+ return instanceof_function(Z_OBJCE_P(property), ZEND_TYPE_CE(info->type));
+ }
+
+ ZEND_ASSERT(ZEND_TYPE_CODE(info->type) != IS_CALLABLE);
+ if (EXPECTED(ZEND_TYPE_CODE(info->type) == Z_TYPE_P(property))) {
+ return 1;
+ } else if (EXPECTED(Z_TYPE_P(property) == IS_NULL)) {
+ return ZEND_TYPE_ALLOW_NULL(info->type);
+ } else if (ZEND_TYPE_CODE(info->type) == _IS_BOOL && EXPECTED(Z_TYPE_P(property) == IS_FALSE || Z_TYPE_P(property) == IS_TRUE)) {
+ return 1;
+ } else if (ZEND_TYPE_CODE(info->type) == IS_ITERABLE) {
+ return zend_is_iterable(property);
+ } else {
+ return zend_verify_scalar_type_hint(ZEND_TYPE_CODE(info->type), property, strict);
+ }
+}
+
+static zend_bool zend_always_inline i_zend_verify_property_type(zend_property_info *info, zval *property, zend_bool strict)
+{
+ if (i_zend_check_property_type(info, property, strict)) {
+ return 1;
+ }
+
+ zend_verify_property_type_error(info, property);
+ return 0;
+}
+
+zend_bool zend_never_inline zend_verify_property_type(zend_property_info *info, zval *property, zend_bool strict) {
+ return i_zend_verify_property_type(info, property, strict);
+}
+
+static zend_never_inline zval* zend_assign_to_typed_prop(zend_property_info *info, zval *property_val, zval *value EXECUTE_DATA_DC)
+{
+ zval tmp;
+
+ ZVAL_DEREF(value);
+ ZVAL_COPY(&tmp, value);
+
+ if (UNEXPECTED(!i_zend_verify_property_type(info, &tmp, EX_USES_STRICT_TYPES()))) {
+ zval_ptr_dtor(&tmp);
+ return &EG(uninitialized_zval);
+ }
+
+ return zend_assign_to_variable(property_val, &tmp, IS_TMP_VAR, EX_USES_STRICT_TYPES());
+}
+
+
static zend_always_inline zend_bool zend_check_type(
zend_type type,
zval *arg, zend_class_entry **ce, void **cache_slot,
zval *default_value, zend_class_entry *scope,
zend_bool is_return_type)
{
+ zend_reference *ref = NULL;
+
if (!ZEND_TYPE_IS_SET(type)) {
return 1;
}
- ZVAL_DEREF(arg);
+ if (UNEXPECTED(Z_ISREF_P(arg))) {
+ ref = Z_REF_P(arg);
+ arg = Z_REFVAL_P(arg);
+ }
+
if (ZEND_TYPE_IS_CLASS(type)) {
if (EXPECTED(*cache_slot)) {
*ce = (zend_class_entry *) *cache_slot;
@@ -932,6 +1056,8 @@ static zend_always_inline zend_bool zend_check_type(
} else if (ZEND_TYPE_CODE(type) == _IS_BOOL &&
EXPECTED(Z_TYPE_P(arg) == IS_FALSE || Z_TYPE_P(arg) == IS_TRUE)) {
return 1;
+ } else if (ref && ZEND_REF_HAS_TYPE_SOURCES(ref)) {
+ return 0; /* we cannot have conversions for typed refs */
} else {
return zend_verify_scalar_type_hint(ZEND_TYPE_CODE(type), arg,
is_return_type ? ZEND_RET_USES_STRICT_TYPES() : ZEND_ARG_USES_STRICT_TYPES());
@@ -963,6 +1089,41 @@ static zend_always_inline int zend_verify_arg_type(zend_function *zf, uint32_t a
return 1;
}
+static zend_always_inline int zend_verify_recv_arg_type(zend_function *zf, uint32_t arg_num, zval *arg, zval *default_value, void **cache_slot)
+{
+ zend_arg_info *cur_arg_info = &zf->common.arg_info[arg_num-1];
+ zend_class_entry *ce;
+
+ ZEND_ASSERT(arg_num <= zf->common.num_args);
+ cur_arg_info = &zf->common.arg_info[arg_num-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;
+ }
+
+ return 1;
+}
+
+static zend_always_inline int zend_verify_variadic_arg_type(zend_function *zf, uint32_t arg_num, zval *arg, zval *default_value, void **cache_slot)
+{
+ zend_arg_info *cur_arg_info;
+ zend_class_entry *ce;
+
+ ZEND_ASSERT(arg_num > zf->common.num_args);
+ ZEND_ASSERT(zf->common.fn_flags & ZEND_ACC_VARIADIC);
+ cur_arg_info = &zf->common.arg_info[zf->common.num_args];
+
+ 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;
+ }
+
+ return 1;
+}
+
static zend_never_inline int zend_verify_internal_arg_types(zend_function *fbc, zend_execute_data *call)
{
uint32_t i;
@@ -974,7 +1135,6 @@ static zend_never_inline int zend_verify_internal_arg_types(zend_function *fbc,
dummy_cache_slot = NULL;
if (UNEXPECTED(!zend_verify_arg_type(fbc, i + 1, p, NULL, &dummy_cache_slot))) {
EG(current_execute_data) = call->prev_execute_data;
- zend_vm_stack_free_args(call);
return 0;
}
p++;
@@ -1123,14 +1283,6 @@ static zend_never_inline ZEND_COLD void ZEND_FASTCALL zend_illegal_offset(void)
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_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))) {
@@ -1138,13 +1290,37 @@ static zend_never_inline void zend_assign_to_object_dim(zval *object, zval *dim,
}
}
-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)
+static zend_always_inline int zend_binary_op(zval *ret, zval *op1, zval *op2 OPLINE_DC)
+{
+ static const binary_op_type zend_binary_ops[] = {
+ add_function,
+ sub_function,
+ mul_function,
+ div_function,
+ mod_function,
+ shift_left_function,
+ shift_right_function,
+ concat_function,
+ bitwise_or_function,
+ bitwise_and_function,
+ bitwise_xor_function,
+ pow_function
+ };
+ /* size_t cast makes GCC to better optimize 64-bit PIC code */
+ size_t opcode = (size_t)opline->extended_value;
+
+ return zend_binary_ops[opcode - ZEND_ADD](ret, op1, op2);
+}
+
+static zend_never_inline void zend_binary_assign_op_obj_dim(zval *object, zval *property OPLINE_DC EXECUTE_DATA_DC)
{
+ zend_free_op free_op_data1;
+ zval *value;
zval *z;
zval rv, res;
- if (Z_OBJ_HT_P(object)->read_dimension &&
- (z = Z_OBJ_HT_P(object)->read_dimension(object, property, BP_VAR_R, &rv)) != NULL) {
+ value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data1);
+ if ((z = Z_OBJ_HT_P(object)->read_dimension(object, property, BP_VAR_R, &rv)) != NULL) {
if (Z_TYPE_P(z) == IS_OBJECT && Z_OBJ_HT_P(z)->get) {
zval rv2;
@@ -1155,21 +1331,49 @@ static zend_never_inline void zend_binary_assign_op_obj_dim(zval *object, zval *
}
ZVAL_COPY_VALUE(z, value);
}
- binary_op(&res, Z_ISREF_P(z) ? Z_REFVAL_P(z) : z, value);
- Z_OBJ_HT_P(object)->write_dimension(object, property, &res);
+ if (zend_binary_op(&res, z, value OPLINE_CC) == SUCCESS) {
+ Z_OBJ_HT_P(object)->write_dimension(object, property, &res);
+ }
if (z == &rv) {
zval_ptr_dtor(&rv);
}
- if (retval) {
- ZVAL_COPY(retval, &res);
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+ ZVAL_COPY(EX_VAR(opline->result.var), &res);
}
zval_ptr_dtor(&res);
} else {
zend_use_object_as_array();
- if (retval) {
- ZVAL_NULL(retval);
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+ ZVAL_NULL(EX_VAR(opline->result.var));
}
}
+ FREE_OP(free_op_data1);
+}
+
+static zend_never_inline void zend_binary_assign_op_typed_ref(zend_reference *ref, zval *value OPLINE_DC EXECUTE_DATA_DC)
+{
+ zval z_copy;
+
+ zend_binary_op(&z_copy, &ref->val, value OPLINE_CC);
+ if (EXPECTED(zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()))) {
+ zval_ptr_dtor(&ref->val);
+ ZVAL_COPY_VALUE(&ref->val, &z_copy);
+ } else {
+ zval_ptr_dtor(&z_copy);
+ }
+}
+
+static zend_never_inline void zend_binary_assign_op_typed_prop(zend_property_info *prop_info, zval *zptr, zval *value OPLINE_DC EXECUTE_DATA_DC)
+{
+ zval z_copy;
+
+ zend_binary_op(&z_copy, zptr, value OPLINE_CC);
+ if (EXPECTED(zend_verify_property_type(prop_info, &z_copy, EX_USES_STRICT_TYPES()))) {
+ zval_ptr_dtor(zptr);
+ ZVAL_COPY_VALUE(zptr, &z_copy);
+ } else {
+ zval_ptr_dtor(&z_copy);
+ }
}
static zend_never_inline zend_long zend_check_string_offset(zval *dim, int type EXECUTE_DATA_DC)
@@ -1188,7 +1392,7 @@ try_again:
}
break;
case IS_UNDEF:
- zval_undefined_cv(EX(opline)->op2.var EXECUTE_DATA_CC);
+ ZVAL_UNDEFINED_OP2();
case IS_DOUBLE:
case IS_NULL:
case IS_FALSE:
@@ -1223,18 +1427,10 @@ static zend_never_inline ZEND_COLD void zend_wrong_string_offset(EXECUTE_DATA_D)
}
switch (opline->opcode) {
- case ZEND_ASSIGN_ADD:
- case ZEND_ASSIGN_SUB:
- case ZEND_ASSIGN_MUL:
- case ZEND_ASSIGN_DIV:
- case ZEND_ASSIGN_MOD:
- case ZEND_ASSIGN_SL:
- case ZEND_ASSIGN_SR:
- case ZEND_ASSIGN_CONCAT:
- case ZEND_ASSIGN_BW_OR:
- case ZEND_ASSIGN_BW_AND:
- case ZEND_ASSIGN_BW_XOR:
- case ZEND_ASSIGN_POW:
+ case ZEND_ASSIGN_OP:
+ case ZEND_ASSIGN_DIM_OP:
+ case ZEND_ASSIGN_OBJ_OP:
+ case ZEND_ASSIGN_STATIC_PROP_OP:
msg = "Cannot use assign-op operators with string offsets";
break;
case ZEND_FETCH_DIM_W:
@@ -1250,25 +1446,27 @@ static zend_never_inline ZEND_COLD void zend_wrong_string_offset(EXECUTE_DATA_D)
while (opline < end) {
if (opline->op1_type == IS_VAR && opline->op1.var == var) {
switch (opline->opcode) {
- case ZEND_ASSIGN_ADD:
- case ZEND_ASSIGN_SUB:
- case ZEND_ASSIGN_MUL:
- case ZEND_ASSIGN_DIV:
- case ZEND_ASSIGN_MOD:
- case ZEND_ASSIGN_SL:
- case ZEND_ASSIGN_SR:
- case ZEND_ASSIGN_CONCAT:
- case ZEND_ASSIGN_BW_OR:
- case ZEND_ASSIGN_BW_AND:
- case ZEND_ASSIGN_BW_XOR:
- case ZEND_ASSIGN_POW:
- if (opline->extended_value == ZEND_ASSIGN_OBJ) {
- msg = "Cannot use string offset as an object";
- } else if (opline->extended_value == ZEND_ASSIGN_DIM) {
- msg = "Cannot use string offset as an array";
- } else {
- msg = "Cannot use assign-op operators with string offsets";
- }
+ case ZEND_FETCH_OBJ_W:
+ case ZEND_FETCH_OBJ_RW:
+ case ZEND_FETCH_OBJ_FUNC_ARG:
+ case ZEND_FETCH_OBJ_UNSET:
+ case ZEND_ASSIGN_OBJ:
+ case ZEND_ASSIGN_OBJ_OP:
+ case ZEND_ASSIGN_OBJ_REF:
+ msg = "Cannot use string offset as an object";
+ break;
+ case ZEND_FETCH_DIM_W:
+ 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:
+ case ZEND_ASSIGN_DIM_OP:
+ msg = "Cannot use string offset as an array";
+ break;
+ case ZEND_ASSIGN_STATIC_PROP_OP:
+ case ZEND_ASSIGN_OP:
+ msg = "Cannot use assign-op operators with string offsets";
break;
case ZEND_PRE_INC_OBJ:
case ZEND_PRE_DEC_OBJ:
@@ -1280,21 +1478,6 @@ static zend_never_inline ZEND_COLD void zend_wrong_string_offset(EXECUTE_DATA_D)
case ZEND_POST_DEC:
msg = "Cannot increment/decrement string offsets";
break;
- case ZEND_FETCH_DIM_W:
- 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;
- case ZEND_FETCH_OBJ_W:
- case ZEND_FETCH_OBJ_RW:
- case ZEND_FETCH_OBJ_FUNC_ARG:
- case ZEND_FETCH_OBJ_UNSET:
- case ZEND_ASSIGN_OBJ:
- msg = "Cannot use string offset as an object";
- break;
case ZEND_ASSIGN_REF:
case ZEND_ADD_ARRAY_ELEMENT:
case ZEND_INIT_ARRAY:
@@ -1345,22 +1528,6 @@ static zend_never_inline ZEND_COLD void ZEND_FASTCALL zend_wrong_property_read(z
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",
@@ -1369,6 +1536,12 @@ static zend_never_inline ZEND_COLD void ZEND_FASTCALL zend_deprecated_function(c
ZSTR_VAL(fbc->common.function_name));
}
+static zend_never_inline ZEND_COLD void ZEND_FASTCALL zend_abstract_method(const zend_function *fbc)
+{
+ zend_throw_error(NULL, "Cannot call abstract method %s::%s()",
+ ZSTR_VAL(fbc->common.scope->name), ZSTR_VAL(fbc->common.function_name));
+}
+
static zend_never_inline void zend_assign_to_string_offset(zval *str, zval *dim, zval *value OPLINE_DC EXECUTE_DATA_DC)
{
zend_uchar c;
@@ -1387,7 +1560,13 @@ static zend_never_inline void zend_assign_to_string_offset(zval *str, zval *dim,
if (Z_TYPE_P(value) != IS_STRING) {
/* Convert to string, just the time to pick the 1st byte */
- zend_string *tmp = zval_get_string_func(value);
+ zend_string *tmp = zval_try_get_string_func(value);
+ if (UNEXPECTED(!tmp)) {
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+ ZVAL_UNDEF(EX_VAR(opline->result.var));
+ }
+ return;
+ }
string_len = ZSTR_LEN(tmp);
c = (zend_uchar)ZSTR_VAL(tmp)[0];
@@ -1433,135 +1612,298 @@ static zend_never_inline void zend_assign_to_string_offset(zval *str, zval *dim,
}
}
-static zend_never_inline void zend_post_incdec_overloaded_property(zval *object, zval *property, void **cache_slot, int inc OPLINE_DC EXECUTE_DATA_DC)
+static zend_property_info *zend_get_prop_not_accepting_double(zend_reference *ref)
{
- if (Z_OBJ_HT_P(object)->read_property && Z_OBJ_HT_P(object)->write_property) {
- zval rv, obj;
- zval *z;
- zval z_copy;
-
- ZVAL_OBJ(&obj, Z_OBJ_P(object));
- Z_ADDREF(obj);
- 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(EX_VAR(opline->result.var));
- return;
+ zend_property_info *prop;
+ ZEND_REF_FOREACH_TYPE_SOURCES(ref, prop) {
+ if (ZEND_TYPE_CODE(prop->type) != IS_DOUBLE) {
+ return prop;
}
+ } ZEND_REF_FOREACH_TYPE_SOURCES_END();
+ return NULL;
+}
- if (UNEXPECTED(Z_TYPE_P(z) == IS_OBJECT) && Z_OBJ_HT_P(z)->get) {
- zval rv2;
- zval *value = Z_OBJ_HT_P(z)->get(z, &rv2);
- if (z == &rv) {
- zval_ptr_dtor(&rv);
- }
- ZVAL_COPY_VALUE(z, value);
- }
+static ZEND_COLD zend_long zend_throw_incdec_ref_error(zend_reference *ref OPLINE_DC)
+{
+ zend_property_info *error_prop = zend_get_prop_not_accepting_double(ref);
+ /* Currently there should be no way for a typed reference to accept both int and double.
+ * Generalize this and the related property code once this becomes possible. */
+ ZEND_ASSERT(error_prop);
+ if (ZEND_IS_INCREMENT(opline->opcode)) {
+ zend_type_error(
+ "Cannot increment a reference held by property %s::$%s of type %sint past its maximal value",
+ ZSTR_VAL(error_prop->ce->name),
+ zend_get_unmangled_property_name(error_prop->name),
+ ZEND_TYPE_ALLOW_NULL(error_prop->type) ? "?" : "");
+ return ZEND_LONG_MAX;
+ } else {
+ zend_type_error(
+ "Cannot decrement a reference held by property %s::$%s of type %sint past its minimal value",
+ ZSTR_VAL(error_prop->ce->name),
+ zend_get_unmangled_property_name(error_prop->name),
+ ZEND_TYPE_ALLOW_NULL(error_prop->type) ? "?" : "");
+ return ZEND_LONG_MIN;
+ }
+}
+
+static ZEND_COLD zend_long zend_throw_incdec_prop_error(zend_property_info *prop OPLINE_DC) {
+ const char *prop_type1, *prop_type2;
+ zend_format_type(prop->type, &prop_type1, &prop_type2);
+ if (ZEND_IS_INCREMENT(opline->opcode)) {
+ zend_type_error("Cannot increment property %s::$%s of type %s%s past its maximal value",
+ ZSTR_VAL(prop->ce->name),
+ zend_get_unmangled_property_name(prop->name),
+ prop_type1, prop_type2);
+ return ZEND_LONG_MAX;
+ } else {
+ zend_type_error("Cannot decrement property %s::$%s of type %s%s past its minimal value",
+ ZSTR_VAL(prop->ce->name),
+ zend_get_unmangled_property_name(prop->name),
+ prop_type1, prop_type2);
+ return ZEND_LONG_MIN;
+ }
+}
- ZVAL_COPY_DEREF(&z_copy, z);
- ZVAL_COPY(EX_VAR(opline->result.var), &z_copy);
- if (inc) {
- increment_function(&z_copy);
- } else {
- decrement_function(&z_copy);
- }
- Z_OBJ_HT(obj)->write_property(&obj, property, &z_copy, cache_slot);
- OBJ_RELEASE(Z_OBJ(obj));
- zval_ptr_dtor(&z_copy);
- zval_ptr_dtor(z);
+static void zend_incdec_typed_ref(zend_reference *ref, zval *copy OPLINE_DC EXECUTE_DATA_DC)
+{
+ zval tmp;
+ zval *var_ptr = &ref->val;
+
+ if (!copy) {
+ copy = &tmp;
+ }
+
+ ZVAL_COPY(copy, var_ptr);
+
+ if (ZEND_IS_INCREMENT(opline->opcode)) {
+ increment_function(var_ptr);
} else {
- zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
- ZVAL_NULL(EX_VAR(opline->result.var));
+ decrement_function(var_ptr);
+ }
+
+ if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_DOUBLE) && Z_TYPE_P(copy) == IS_LONG) {
+ zend_long val = zend_throw_incdec_ref_error(ref OPLINE_CC);
+ ZVAL_LONG(var_ptr, val);
+ } else if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) {
+ zval_ptr_dtor(var_ptr);
+ ZVAL_COPY_VALUE(var_ptr, copy);
+ ZVAL_UNDEF(copy);
+ } else if (copy == &tmp) {
+ zval_ptr_dtor(&tmp);
}
}
-static zend_never_inline void zend_pre_incdec_overloaded_property(zval *object, zval *property, void **cache_slot, int inc OPLINE_DC EXECUTE_DATA_DC)
+static void zend_incdec_typed_prop(zend_property_info *prop_info, zval *var_ptr, zval *copy OPLINE_DC EXECUTE_DATA_DC)
{
- zval rv;
+ zval tmp;
- if (Z_OBJ_HT_P(object)->read_property && Z_OBJ_HT_P(object)->write_property) {
- zval *z, obj;
- zval z_copy;
+ if (!copy) {
+ copy = &tmp;
+ }
- ZVAL_OBJ(&obj, Z_OBJ_P(object));
- Z_ADDREF(obj);
- 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 (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
- return;
+ ZVAL_COPY(copy, var_ptr);
+
+ if (ZEND_IS_INCREMENT(opline->opcode)) {
+ increment_function(var_ptr);
+ } else {
+ decrement_function(var_ptr);
+ }
+
+ if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_DOUBLE) && Z_TYPE_P(copy) == IS_LONG) {
+ zend_long val = zend_throw_incdec_prop_error(prop_info OPLINE_CC);
+ ZVAL_LONG(var_ptr, val);
+ } else if (UNEXPECTED(!zend_verify_property_type(prop_info, var_ptr, EX_USES_STRICT_TYPES()))) {
+ zval_ptr_dtor(var_ptr);
+ ZVAL_COPY_VALUE(var_ptr, copy);
+ ZVAL_UNDEF(copy);
+ } else if (copy == &tmp) {
+ zval_ptr_dtor(&tmp);
+ }
+}
+
+static void zend_pre_incdec_property_zval(zval *prop, zend_property_info *prop_info OPLINE_DC EXECUTE_DATA_DC)
+{
+ if (EXPECTED(Z_TYPE_P(prop) == IS_LONG)) {
+ if (ZEND_IS_INCREMENT(opline->opcode)) {
+ fast_long_increment_function(prop);
+ } else {
+ fast_long_decrement_function(prop);
}
+ if (UNEXPECTED(Z_TYPE_P(prop) != IS_LONG) && UNEXPECTED(prop_info)) {
+ zend_long val = zend_throw_incdec_prop_error(prop_info OPLINE_CC);
+ ZVAL_LONG(prop, val);
+ }
+ } else {
+ do {
+ if (Z_ISREF_P(prop)) {
+ zend_reference *ref = Z_REF_P(prop);
+ prop = Z_REFVAL_P(prop);
+ if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) {
+ zend_incdec_typed_ref(ref, NULL OPLINE_CC EXECUTE_DATA_CC);
+ break;
+ }
+ }
- if (UNEXPECTED(Z_TYPE_P(z) == IS_OBJECT) && Z_OBJ_HT_P(z)->get) {
- zval rv2;
- zval *value = Z_OBJ_HT_P(z)->get(z, &rv2);
+ if (UNEXPECTED(prop_info)) {
+ zend_incdec_typed_prop(prop_info, prop, NULL OPLINE_CC EXECUTE_DATA_CC);
+ } else if (ZEND_IS_INCREMENT(opline->opcode)) {
+ increment_function(prop);
+ } else {
+ decrement_function(prop);
+ }
+ } while (0);
+ }
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+ ZVAL_COPY(EX_VAR(opline->result.var), prop);
+ }
+}
- if (z == &rv) {
- zval_ptr_dtor(&rv);
+static void zend_post_incdec_property_zval(zval *prop, zend_property_info *prop_info OPLINE_DC EXECUTE_DATA_DC)
+{
+ if (EXPECTED(Z_TYPE_P(prop) == IS_LONG)) {
+ ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(prop));
+ if (ZEND_IS_INCREMENT(opline->opcode)) {
+ fast_long_increment_function(prop);
+ } else {
+ fast_long_decrement_function(prop);
+ }
+ if (UNEXPECTED(Z_TYPE_P(prop) != IS_LONG) && UNEXPECTED(prop_info)) {
+ zend_long val = zend_throw_incdec_prop_error(prop_info OPLINE_CC);
+ ZVAL_LONG(prop, val);
+ }
+ } else {
+ if (Z_ISREF_P(prop)) {
+ zend_reference *ref = Z_REF_P(prop);
+ prop = Z_REFVAL_P(prop);
+ if (ZEND_REF_HAS_TYPE_SOURCES(ref)) {
+ zend_incdec_typed_ref(ref, EX_VAR(opline->result.var) OPLINE_CC EXECUTE_DATA_CC);
+ return;
}
- ZVAL_COPY_VALUE(z, value);
}
- ZVAL_COPY_DEREF(&z_copy, z);
- if (inc) {
- increment_function(&z_copy);
+
+ if (UNEXPECTED(prop_info)) {
+ zend_incdec_typed_prop(prop_info, prop, EX_VAR(opline->result.var) OPLINE_CC EXECUTE_DATA_CC);
} else {
- decrement_function(&z_copy);
- }
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY(EX_VAR(opline->result.var), &z_copy);
+ ZVAL_COPY(EX_VAR(opline->result.var), prop);
+ if (ZEND_IS_INCREMENT(opline->opcode)) {
+ increment_function(prop);
+ } else {
+ decrement_function(prop);
+ }
}
- Z_OBJ_HT(obj)->write_property(&obj, property, &z_copy, cache_slot);
+ }
+}
+
+static zend_never_inline void zend_post_incdec_overloaded_property(zval *object, zval *property, void **cache_slot OPLINE_DC EXECUTE_DATA_DC)
+{
+ zval rv, obj;
+ zval *z;
+ zval z_copy;
+
+ ZVAL_OBJ(&obj, Z_OBJ_P(object));
+ Z_ADDREF(obj);
+ 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_ptr_dtor(&z_copy);
- zval_ptr_dtor(z);
+ ZVAL_UNDEF(EX_VAR(opline->result.var));
+ return;
+ }
+
+ if (UNEXPECTED(Z_TYPE_P(z) == IS_OBJECT) && Z_OBJ_HT_P(z)->get) {
+ zval rv2;
+ zval *value = Z_OBJ_HT_P(z)->get(z, &rv2);
+ if (z == &rv) {
+ zval_ptr_dtor(&rv);
+ }
+ ZVAL_COPY_VALUE(z, value);
+ }
+
+ ZVAL_COPY_DEREF(&z_copy, z);
+ ZVAL_COPY(EX_VAR(opline->result.var), &z_copy);
+ if (ZEND_IS_INCREMENT(opline->opcode)) {
+ increment_function(&z_copy);
} else {
- zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
+ decrement_function(&z_copy);
+ }
+ Z_OBJ_HT(obj)->write_property(&obj, property, &z_copy, cache_slot);
+ OBJ_RELEASE(Z_OBJ(obj));
+ zval_ptr_dtor(&z_copy);
+ zval_ptr_dtor(z);
+}
+
+static zend_never_inline void zend_pre_incdec_overloaded_property(zval *object, zval *property, void **cache_slot OPLINE_DC EXECUTE_DATA_DC)
+{
+ zval rv;
+ zval *z, obj;
+ zval z_copy;
+
+ ZVAL_OBJ(&obj, Z_OBJ_P(object));
+ Z_ADDREF(obj);
+ 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 (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_NULL(EX_VAR(opline->result.var));
}
+ return;
+ }
+
+ if (UNEXPECTED(Z_TYPE_P(z) == IS_OBJECT) && Z_OBJ_HT_P(z)->get) {
+ zval rv2;
+ zval *value = Z_OBJ_HT_P(z)->get(z, &rv2);
+
+ if (z == &rv) {
+ zval_ptr_dtor(&rv);
+ }
+ ZVAL_COPY_VALUE(z, value);
+ }
+ ZVAL_COPY_DEREF(&z_copy, z);
+ if (ZEND_IS_INCREMENT(opline->opcode)) {
+ increment_function(&z_copy);
+ } else {
+ decrement_function(&z_copy);
+ }
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+ ZVAL_COPY(EX_VAR(opline->result.var), &z_copy);
}
+ Z_OBJ_HT(obj)->write_property(&obj, property, &z_copy, cache_slot);
+ OBJ_RELEASE(Z_OBJ(obj));
+ zval_ptr_dtor(&z_copy);
+ zval_ptr_dtor(z);
}
-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)
+static zend_never_inline void zend_assign_op_overloaded_property(zval *object, zval *property, void **cache_slot, zval *value OPLINE_DC EXECUTE_DATA_DC)
{
zval *z;
zval rv, obj, res;
ZVAL_OBJ(&obj, Z_OBJ_P(object));
Z_ADDREF(obj);
- if (EXPECTED(Z_OBJ_HT(obj)->read_property)) {
- 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 (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- }
- return;
+ 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 (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+ ZVAL_UNDEF(EX_VAR(opline->result.var));
}
- if (Z_TYPE_P(z) == IS_OBJECT && Z_OBJ_HT_P(z)->get) {
- zval rv2;
- zval *value = Z_OBJ_HT_P(z)->get(z, &rv2);
+ return;
+ }
+ if (Z_TYPE_P(z) == IS_OBJECT && Z_OBJ_HT_P(z)->get) {
+ zval rv2;
+ zval *value = Z_OBJ_HT_P(z)->get(z, &rv2);
- if (z == &rv) {
- zval_ptr_dtor(&rv);
- }
- ZVAL_COPY_VALUE(z, value);
+ if (z == &rv) {
+ zval_ptr_dtor(&rv);
}
- binary_op(&res, z, value);
+ ZVAL_COPY_VALUE(z, value);
+ }
+ if (zend_binary_op(&res, z, value OPLINE_CC) == SUCCESS) {
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(z);
- zval_ptr_dtor(&res);
- } else {
- zend_error(E_WARNING, "Attempt to assign property of non-object");
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
}
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+ ZVAL_COPY(EX_VAR(opline->result.var), &res);
+ }
+ zval_ptr_dtor(z);
+ zval_ptr_dtor(&res);
OBJ_RELEASE(Z_OBJ(obj));
}
@@ -1616,6 +1958,44 @@ static zend_never_inline ZEND_COLD void ZEND_FASTCALL zend_undefined_index(const
zend_error(E_NOTICE, "Undefined index: %s", ZSTR_VAL(offset));
}
+static zend_never_inline ZEND_COLD int ZEND_FASTCALL zend_undefined_offset_write(
+ HashTable *ht, zend_long lval)
+{
+ /* The array may be destroyed while throwing the notice.
+ * Temporarily increase the refcount to detect this situation. */
+ if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE)) {
+ GC_ADDREF(ht);
+ }
+ zend_undefined_offset(lval);
+ if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE) && !GC_DELREF(ht)) {
+ zend_array_destroy(ht);
+ return FAILURE;
+ }
+ if (EG(exception)) {
+ return FAILURE;
+ }
+ return SUCCESS;
+}
+
+static zend_never_inline ZEND_COLD int ZEND_FASTCALL zend_undefined_index_write(
+ HashTable *ht, zend_string *offset)
+{
+ /* The array may be destroyed while throwing the notice.
+ * Temporarily increase the refcount to detect this situation. */
+ if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE)) {
+ GC_ADDREF(ht);
+ }
+ zend_undefined_index(offset);
+ if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE) && !GC_DELREF(ht)) {
+ zend_array_destroy(ht);
+ return FAILURE;
+ }
+ if (EG(exception)) {
+ return FAILURE;
+ }
+ return SUCCESS;
+}
+
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));
@@ -1669,14 +2049,63 @@ static zend_never_inline ZEND_COLD void ZEND_FASTCALL zend_use_new_element_for_s
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)
+static ZEND_COLD void zend_binary_assign_op_dim_slow(zval *container, zval *dim OPLINE_DC EXECUTE_DATA_DC)
{
- zend_throw_error(NULL, "Cannot access undefined property for object with overloaded property access");
+ zend_free_op free_op_data1;
+
+ if (UNEXPECTED(Z_TYPE_P(container) == IS_STRING)) {
+ if (opline->op2_type == 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);
+ }
+ } else if (EXPECTED(!Z_ISERROR_P(container))) {
+ zend_use_scalar_as_array();
+ }
+ get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data1);
+ FREE_OP(free_op_data1);
}
-static zend_never_inline ZEND_COLD void ZEND_FASTCALL zend_unsupported_property_reference(void)
+static zend_never_inline zend_uchar slow_index_convert(HashTable *ht, const zval *dim, zend_value *value EXECUTE_DATA_DC)
{
- zend_error(E_WARNING, "This object doesn't support property references");
+ switch (Z_TYPE_P(dim)) {
+ case IS_UNDEF: {
+ /* The array may be destroyed while throwing the notice.
+ * Temporarily increase the refcount to detect this situation. */
+ if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE)) {
+ GC_ADDREF(ht);
+ }
+ ZVAL_UNDEFINED_OP2();
+ if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE) && !GC_DELREF(ht)) {
+ zend_array_destroy(ht);
+ return IS_NULL;
+ }
+ if (EG(exception)) {
+ return IS_NULL;
+ }
+ /* break missing intentionally */
+ }
+ case IS_NULL:
+ value->str = ZSTR_EMPTY_ALLOC();
+ return IS_STRING;
+ case IS_DOUBLE:
+ value->lval = zend_dval_to_lval(Z_DVAL_P(dim));
+ return IS_LONG;
+ case IS_RESOURCE:
+ zend_use_resource_as_offset(dim);
+ value->lval = Z_RES_HANDLE_P(dim);
+ return IS_LONG;
+ case IS_FALSE:
+ value->lval = 0;
+ return IS_LONG;
+ case IS_TRUE:
+ value->lval = 1;
+ return IS_LONG;
+ default:
+ zend_illegal_offset();
+ return IS_NULL;
+ }
}
static zend_always_inline zval *zend_fetch_dimension_address_inner(HashTable *ht, const zval *dim, int dim_type, int type EXECUTE_DATA_DC)
@@ -1701,22 +2130,23 @@ num_undef:
retval = &EG(uninitialized_zval);
break;
case BP_VAR_RW:
- zend_undefined_offset(hval);
- retval = zend_hash_index_update(ht, hval, &EG(uninitialized_zval));
- break;
+ if (UNEXPECTED(zend_undefined_offset_write(ht, hval) == FAILURE)) {
+ return NULL;
+ }
+ /* break missing intentionally */
case BP_VAR_W:
retval = zend_hash_index_add_new(ht, hval, &EG(uninitialized_zval));
break;
}
} else if (EXPECTED(Z_TYPE_P(dim) == IS_STRING)) {
offset_key = Z_STR_P(dim);
- if (dim_type != IS_CONST) {
+ if (ZEND_CONST_COND(dim_type != IS_CONST, 1)) {
if (ZEND_HANDLE_NUMERIC(offset_key, hval)) {
goto num_index;
}
}
str_index:
- retval = zend_hash_find_ex(ht, offset_key, dim_type == IS_CONST);
+ retval = zend_hash_find_ex(ht, offset_key, ZEND_CONST_COND(dim_type == IS_CONST, 0));
if (retval) {
/* support for $GLOBALS[...] */
if (UNEXPECTED(Z_TYPE_P(retval) == IS_INDIRECT)) {
@@ -1731,7 +2161,9 @@ str_index:
retval = &EG(uninitialized_zval);
break;
case BP_VAR_RW:
- zend_undefined_index(offset_key);
+ if (UNEXPECTED(zend_undefined_index_write(ht, offset_key))) {
+ return NULL;
+ }
/* break missing intentionally */
case BP_VAR_W:
ZVAL_NULL(retval);
@@ -1749,41 +2181,35 @@ str_index:
retval = &EG(uninitialized_zval);
break;
case BP_VAR_RW:
- zend_undefined_index(offset_key);
- retval = zend_hash_update(ht, offset_key, &EG(uninitialized_zval));
+ /* Key may be released while throwing the undefined index warning. */
+ zend_string_addref(offset_key);
+ if (UNEXPECTED(zend_undefined_index_write(ht, offset_key) == FAILURE)) {
+ zend_string_release(offset_key);
+ return NULL;
+ }
+ retval = zend_hash_add_new(ht, offset_key, &EG(uninitialized_zval));
+ zend_string_release(offset_key);
break;
case BP_VAR_W:
retval = zend_hash_add_new(ht, offset_key, &EG(uninitialized_zval));
break;
}
}
+ } else if (EXPECTED(Z_TYPE_P(dim) == IS_REFERENCE)) {
+ dim = Z_REFVAL_P(dim);
+ goto try_again;
} else {
- switch (Z_TYPE_P(dim)) {
- case IS_UNDEF:
- zval_undefined_cv(EX(opline)->op2.var EXECUTE_DATA_CC);
- /* break missing intentionally */
- case IS_NULL:
- offset_key = ZSTR_EMPTY_ALLOC();
- goto str_index;
- case IS_DOUBLE:
- hval = zend_dval_to_lval(Z_DVAL_P(dim));
- goto num_index;
- case IS_RESOURCE:
- zend_use_resource_as_offset(dim);
- hval = Z_RES_HANDLE_P(dim);
- goto num_index;
- case IS_FALSE:
- hval = 0;
- goto num_index;
- case IS_TRUE:
- hval = 1;
- goto num_index;
- case IS_REFERENCE:
- dim = Z_REFVAL_P(dim);
- goto try_again;
- default:
- zend_illegal_offset();
- retval = (type == BP_VAR_W || type == BP_VAR_RW) ?
+ zend_value val;
+ zend_uchar t = slow_index_convert(ht, dim, &val EXECUTE_DATA_CC);
+
+ if (t == IS_STRING) {
+ offset_key = val.str;
+ goto str_index;
+ } else if (t == IS_LONG) {
+ hval = val.lval;
+ goto num_index;
+ } else {
+ retval = (type == BP_VAR_W || type == BP_VAR_RW) ?
NULL : &EG(uninitialized_zval);
}
}
@@ -1812,7 +2238,7 @@ static zend_never_inline zval* ZEND_FASTCALL zend_fetch_dimension_address_inner_
static zend_always_inline void zend_fetch_dimension_address(zval *result, zval *container, zval *dim, int dim_type, int type EXECUTE_DATA_DC)
{
- zval *retval;
+ zval *retval;
if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
try_array:
@@ -1835,9 +2261,23 @@ fetch_from_array:
ZVAL_INDIRECT(result, retval);
return;
} else if (EXPECTED(Z_TYPE_P(container) == IS_REFERENCE)) {
+ zend_reference *ref = Z_REF_P(container);
container = Z_REFVAL_P(container);
if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
goto try_array;
+ } else if (EXPECTED(Z_TYPE_P(container) <= IS_FALSE)) {
+ if (type != BP_VAR_UNSET) {
+ if (ZEND_REF_HAS_TYPE_SOURCES(ref)) {
+ if (UNEXPECTED(!zend_verify_ref_array_assignable(ref))) {
+ ZVAL_ERROR(result);
+ return;
+ }
+ }
+ array_init(container);
+ goto fetch_from_array;
+ } else {
+ goto return_null;
+ }
}
}
if (UNEXPECTED(Z_TYPE_P(container) == IS_STRING)) {
@@ -1849,57 +2289,52 @@ fetch_from_array:
}
ZVAL_ERROR(result);
} else if (EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
- if (/*dim_type == IS_CV &&*/ dim && UNEXPECTED(Z_TYPE_P(dim) == IS_UNDEF)) {
- zval_undefined_cv(EX(opline)->op2.var EXECUTE_DATA_CC);
- dim = &EG(uninitialized_zval);
+ if (ZEND_CONST_COND(dim_type == IS_CV, dim != NULL) && UNEXPECTED(Z_TYPE_P(dim) == IS_UNDEF)) {
+ dim = ZVAL_UNDEFINED_OP2();
}
- if (!Z_OBJ_HT_P(container)->read_dimension) {
- 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 (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))) {
- zend_class_entry *ce = Z_OBJCE_P(container);
+ if (UNEXPECTED(retval == &EG(uninitialized_zval))) {
+ zend_class_entry *ce = Z_OBJCE_P(container);
- ZVAL_NULL(result);
- zend_error(E_NOTICE, "Indirect modification of overloaded element of %s has no effect", ZSTR_VAL(ce->name));
- } else if (EXPECTED(retval && Z_TYPE_P(retval) != IS_UNDEF)) {
- if (!Z_ISREF_P(retval)) {
- if (result != retval) {
- ZVAL_COPY(result, retval);
- retval = result;
- }
- if (Z_TYPE_P(retval) != IS_OBJECT) {
- zend_class_entry *ce = Z_OBJCE_P(container);
- zend_error(E_NOTICE, "Indirect modification of overloaded element of %s has no effect", ZSTR_VAL(ce->name));
- }
- } else if (UNEXPECTED(Z_REFCOUNT_P(retval) == 1)) {
- ZVAL_UNREF(retval);
- }
+ ZVAL_NULL(result);
+ zend_error(E_NOTICE, "Indirect modification of overloaded element of %s has no effect", ZSTR_VAL(ce->name));
+ } else if (EXPECTED(retval && Z_TYPE_P(retval) != IS_UNDEF)) {
+ if (!Z_ISREF_P(retval)) {
if (result != retval) {
- ZVAL_INDIRECT(result, retval);
+ ZVAL_COPY(result, retval);
+ retval = result;
}
- } else {
- ZVAL_ERROR(result);
+ if (Z_TYPE_P(retval) != IS_OBJECT) {
+ zend_class_entry *ce = Z_OBJCE_P(container);
+ zend_error(E_NOTICE, "Indirect modification of overloaded element of %s has no effect", ZSTR_VAL(ce->name));
+ }
+ } else if (UNEXPECTED(Z_REFCOUNT_P(retval) == 1)) {
+ ZVAL_UNREF(retval);
}
+ if (result != retval) {
+ ZVAL_INDIRECT(result, retval);
+ }
+ } else {
+ ZVAL_ERROR(result);
}
} else {
- if (type != BP_VAR_W && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
- zval_undefined_cv(EX(opline)->op1.var EXECUTE_DATA_CC);
- }
- if (/*dim_type == IS_CV &&*/ dim && UNEXPECTED(Z_TYPE_P(dim) == IS_UNDEF)) {
- zval_undefined_cv(EX(opline)->op2.var EXECUTE_DATA_CC);
- }
if (EXPECTED(Z_TYPE_P(container) <= IS_FALSE)) {
+ if (type != BP_VAR_W && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
+ ZVAL_UNDEFINED_OP1();
+ }
if (type != BP_VAR_UNSET) {
array_init(container);
goto fetch_from_array;
} else {
+return_null:
/* for read-mode only */
+ if (ZEND_CONST_COND(dim_type == IS_CV, dim != NULL) && UNEXPECTED(Z_TYPE_P(dim) == IS_UNDEF)) {
+ ZVAL_UNDEFINED_OP2();
+ }
ZVAL_NULL(result);
}
} else if (EXPECTED(Z_ISERROR_P(container))) {
@@ -1934,7 +2369,7 @@ static zend_never_inline void ZEND_FASTCALL zend_fetch_dimension_address_UNSET(z
zend_fetch_dimension_address(result, container_ptr, dim, dim_type, BP_VAR_UNSET EXECUTE_DATA_CC);
}
-static zend_always_inline void zend_fetch_dimension_address_read(zval *result, zval *container, zval *dim, int dim_type, int type, int support_strings, int slow EXECUTE_DATA_DC)
+static zend_always_inline void zend_fetch_dimension_address_read(zval *result, zval *container, zval *dim, int dim_type, int type, int is_list, int slow EXECUTE_DATA_DC)
{
zval *retval;
@@ -1951,7 +2386,7 @@ try_array:
}
}
}
- if (support_strings && EXPECTED(Z_TYPE_P(container) == IS_STRING)) {
+ if (!is_list && EXPECTED(Z_TYPE_P(container) == IS_STRING)) {
zend_long offset;
try_string_offset:
@@ -1969,7 +2404,7 @@ try_string_offset:
zend_error(E_WARNING, "Illegal string offset '%s'", Z_STRVAL_P(dim));
break;
case IS_UNDEF:
- zval_undefined_cv(EX(opline)->op2.var EXECUTE_DATA_CC);
+ ZVAL_UNDEFINED_OP2();
case IS_DOUBLE:
case IS_NULL:
case IS_FALSE:
@@ -1991,7 +2426,7 @@ try_string_offset:
offset = Z_LVAL_P(dim);
}
- if (UNEXPECTED(Z_STRLEN_P(container) < (size_t)((offset < 0) ? -offset : (offset + 1)))) {
+ if (UNEXPECTED(Z_STRLEN_P(container) < ((offset < 0) ? -(size_t)offset : ((size_t)offset + 1)))) {
if (type != BP_VAR_IS) {
zend_error(E_NOTICE, "Uninitialized string offset: " ZEND_LONG_FMT, offset);
ZVAL_EMPTY_STRING(result);
@@ -2009,36 +2444,34 @@ try_string_offset:
ZVAL_INTERNED_STR(result, ZSTR_CHAR(c));
}
} else if (EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
- if (/*dim_type == IS_CV &&*/ UNEXPECTED(Z_TYPE_P(dim) == IS_UNDEF)) {
- zval_undefined_cv(EX(opline)->op2.var EXECUTE_DATA_CC);
- dim = &EG(uninitialized_zval);
+ if (ZEND_CONST_COND(dim_type == IS_CV, 1) && UNEXPECTED(Z_TYPE_P(dim) == IS_UNDEF)) {
+ dim = ZVAL_UNDEFINED_OP2();
}
- if (!Z_OBJ_HT_P(container)->read_dimension) {
- 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);
+ 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_DEREF(result, retval);
- } else if (UNEXPECTED(Z_ISREF_P(retval))) {
- zend_unwrap_reference(result);
- }
- } else {
- ZVAL_NULL(result);
+ ZEND_ASSERT(result != NULL);
+ if (retval) {
+ if (result != retval) {
+ ZVAL_COPY_DEREF(result, retval);
+ } else if (UNEXPECTED(Z_ISREF_P(retval))) {
+ zend_unwrap_reference(result);
}
+ } else {
+ ZVAL_NULL(result);
}
} else {
if (type != BP_VAR_IS && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
- zval_undefined_cv(EX(opline)->op1.var EXECUTE_DATA_CC);
+ container = ZVAL_UNDEFINED_OP1();
}
- if (/*dim_type == IS_CV &&*/ UNEXPECTED(Z_TYPE_P(dim) == IS_UNDEF)) {
- zval_undefined_cv(EX(opline)->op2.var EXECUTE_DATA_CC);
+ if (ZEND_CONST_COND(dim_type == IS_CV, 1) && UNEXPECTED(Z_TYPE_P(dim) == IS_UNDEF)) {
+ ZVAL_UNDEFINED_OP2();
+ }
+ if (!is_list && type != BP_VAR_IS) {
+ zend_error(E_NOTICE, "Trying to access array offset on value of type %s",
+ zend_zval_type_name(container));
}
ZVAL_NULL(result);
}
@@ -2047,30 +2480,30 @@ try_string_offset:
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);
+ zend_fetch_dimension_address_read(result, container, dim, dim_type, BP_VAR_R, 0, 0 EXECUTE_DATA_CC);
}
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);
+ zend_fetch_dimension_address_read(result, container, dim, IS_CV, BP_VAR_R, 0, 1 EXECUTE_DATA_CC);
}
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);
+ zend_fetch_dimension_address_read(result, container, dim, dim_type, BP_VAR_IS, 0, 0 EXECUTE_DATA_CC);
}
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)
{
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_fetch_dimension_address_read(result, container, dim, dim_type, BP_VAR_R, 1, 0 EXECUTE_DATA_CC);
}
ZEND_API void zend_fetch_dimension_const(zval *result, zval *container, zval *dim, int type)
{
- zend_fetch_dimension_address_read(result, container, dim, IS_TMP_VAR, type, 1, 0 NO_EXECUTE_DATA_CC);
+ zend_fetch_dimension_address_read(result, container, dim, IS_TMP_VAR, type, 0, 0 NO_EXECUTE_DATA_CC);
}
static zend_never_inline zval* ZEND_FASTCALL zend_find_array_dim_slow(HashTable *ht, zval *offset EXECUTE_DATA_DC)
@@ -2094,7 +2527,7 @@ str_idx:
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);
+ ZVAL_UNDEFINED_OP2();
goto str_idx;
} else {
zend_error(E_WARNING, "Illegal offset type in isset or empty");
@@ -2105,17 +2538,11 @@ str_idx:
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);
+ offset = ZVAL_UNDEFINED_OP2();
}
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;
- }
+ return Z_OBJ_HT_P(container)->has_dimension(container, offset, 0);
} else if (EXPECTED(Z_TYPE_P(container) == IS_STRING)) { /* string offsets */
zend_long lval;
@@ -2150,17 +2577,11 @@ str_offset:
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);
+ offset = ZVAL_UNDEFINED_OP2();
}
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;
- }
+ return !Z_OBJ_HT_P(container)->has_dimension(container, offset, 1);
} else if (EXPECTED(Z_TYPE_P(container) == IS_STRING)) { /* string offsets */
zend_long lval;
@@ -2192,20 +2613,224 @@ str_offset:
}
}
-static zend_always_inline void zend_fetch_property_address(zval *result, zval *container, uint32_t container_op_type, zval *prop_ptr, uint32_t prop_op_type, void **cache_slot, int type OPLINE_DC)
+static zend_never_inline uint32_t ZEND_FASTCALL zend_array_key_exists_fast(HashTable *ht, zval *key OPLINE_DC EXECUTE_DATA_DC)
+{
+ zend_string *str;
+ zend_ulong hval;
+
+try_again:
+ if (EXPECTED(Z_TYPE_P(key) == IS_STRING)) {
+ str = Z_STR_P(key);
+ if (ZEND_HANDLE_NUMERIC(str, hval)) {
+ goto num_key;
+ }
+str_key:
+ return zend_hash_find_ind(ht, str) != NULL ? IS_TRUE : IS_FALSE;
+ } else if (EXPECTED(Z_TYPE_P(key) == IS_LONG)) {
+ hval = Z_LVAL_P(key);
+num_key:
+ return zend_hash_index_find(ht, hval) != NULL ? IS_TRUE : IS_FALSE;
+ } else if (EXPECTED(Z_ISREF_P(key))) {
+ key = Z_REFVAL_P(key);
+ goto try_again;
+ } else if (Z_TYPE_P(key) <= IS_NULL) {
+ if (UNEXPECTED(Z_TYPE_P(key) == IS_UNDEF)) {
+ ZVAL_UNDEFINED_OP1();
+ }
+ str = ZSTR_EMPTY_ALLOC();
+ goto str_key;
+ } else {
+ zend_error(E_WARNING, "array_key_exists(): The first argument should be either a string or an integer");
+ return IS_FALSE;
+ }
+}
+
+static zend_never_inline uint32_t ZEND_FASTCALL zend_array_key_exists_slow(zval *subject, zval *key OPLINE_DC EXECUTE_DATA_DC)
+{
+ if (EXPECTED(Z_TYPE_P(subject) == IS_OBJECT)) {
+ zend_error(E_DEPRECATED, "array_key_exists(): "
+ "Using array_key_exists() on objects is deprecated. "
+ "Use isset() or property_exists() instead");
+
+ HashTable *ht = zend_get_properties_for(subject, ZEND_PROP_PURPOSE_ARRAY_CAST);
+ uint32_t result = zend_array_key_exists_fast(ht, key OPLINE_CC EXECUTE_DATA_CC);
+ zend_release_properties(ht);
+ return result;
+ } else {
+ if (UNEXPECTED(Z_TYPE_P(key) == IS_UNDEF)) {
+ ZVAL_UNDEFINED_OP1();
+ }
+ if (UNEXPECTED(Z_TYPE_INFO_P(subject) == IS_UNDEF)) {
+ ZVAL_UNDEFINED_OP2();
+ }
+ zend_internal_type_error(EX_USES_STRICT_TYPES(), "array_key_exists() expects parameter 2 to be array, %s given", zend_get_type_by_const(Z_TYPE_P(subject)));
+ return IS_NULL;
+ }
+}
+
+static zend_always_inline zend_bool promotes_to_array(zval *val) {
+ return Z_TYPE_P(val) <= IS_FALSE
+ || (Z_ISREF_P(val) && Z_TYPE_P(Z_REFVAL_P(val)) <= IS_FALSE);
+}
+
+static zend_always_inline zend_bool promotes_to_object(zval *val) {
+ ZVAL_DEREF(val);
+ return Z_TYPE_P(val) <= IS_FALSE
+ || (Z_TYPE_P(val) == IS_STRING && Z_STRLEN_P(val) == 0);
+}
+
+static zend_always_inline zend_bool check_type_array_assignable(zend_type type) {
+ if (!type) {
+ return 1;
+ }
+ return ZEND_TYPE_IS_CODE(type)
+ && (ZEND_TYPE_CODE(type) == IS_ARRAY || ZEND_TYPE_CODE(type) == IS_ITERABLE);
+}
+
+static zend_always_inline zend_bool check_type_stdClass_assignable(zend_type type) {
+ if (!type) {
+ return 1;
+ }
+ if (ZEND_TYPE_IS_CLASS(type)) {
+ if (ZEND_TYPE_IS_CE(type)) {
+ return ZEND_TYPE_CE(type) == zend_standard_class_def;
+ } else {
+ return zend_string_equals_literal_ci(ZEND_TYPE_NAME(type), "stdclass");
+ }
+ } else {
+ return ZEND_TYPE_CODE(type) == IS_OBJECT;
+ }
+}
+
+/* Checks whether an array can be assigned to the reference. Returns conflicting property if
+ * assignment is not possible, NULL otherwise. */
+static zend_never_inline zend_bool zend_verify_ref_array_assignable(zend_reference *ref) {
+ zend_property_info *prop;
+ ZEND_ASSERT(ZEND_REF_HAS_TYPE_SOURCES(ref));
+ ZEND_REF_FOREACH_TYPE_SOURCES(ref, prop) {
+ if (!check_type_array_assignable(prop->type)) {
+ zend_throw_auto_init_in_ref_error(prop, "array");
+ return 0;
+ }
+ } ZEND_REF_FOREACH_TYPE_SOURCES_END();
+ return 1;
+}
+
+/* Checks whether an stdClass can be assigned to the reference. Returns conflicting property if
+ * assignment is not possible, NULL otherwise. */
+static zend_never_inline zend_bool zend_verify_ref_stdClass_assignable(zend_reference *ref) {
+ zend_property_info *prop;
+ ZEND_ASSERT(ZEND_REF_HAS_TYPE_SOURCES(ref));
+ ZEND_REF_FOREACH_TYPE_SOURCES(ref, prop) {
+ if (!check_type_stdClass_assignable(prop->type)) {
+ zend_throw_auto_init_in_ref_error(prop, "stdClass");
+ return 0;
+ }
+ } ZEND_REF_FOREACH_TYPE_SOURCES_END();
+ return 1;
+}
+
+static zend_property_info *zend_object_fetch_property_type_info(
+ zend_object *obj, zval *slot)
{
- if (container_op_type != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
+ if (EXPECTED(!ZEND_CLASS_HAS_TYPE_HINTS(obj->ce))) {
+ return NULL;
+ }
+
+ /* Not a declared property */
+ if (UNEXPECTED(slot < obj->properties_table ||
+ slot >= obj->properties_table + obj->ce->default_properties_count)) {
+ return NULL;
+ }
+
+ return zend_get_typed_property_info_for_slot(obj, slot);
+}
+
+static zend_never_inline zend_bool zend_handle_fetch_obj_flags(
+ zval *result, zval *ptr, zend_object *obj, zend_property_info *prop_info, uint32_t flags)
+{
+ switch (flags) {
+ case ZEND_FETCH_DIM_WRITE:
+ if (promotes_to_array(ptr)) {
+ if (!prop_info) {
+ prop_info = zend_object_fetch_property_type_info(obj, ptr);
+ if (!prop_info) {
+ break;
+ }
+ }
+ if (!check_type_array_assignable(prop_info->type)) {
+ zend_throw_auto_init_in_prop_error(prop_info, "array");
+ if (result) ZVAL_ERROR(result);
+ return 0;
+ }
+ }
+ break;
+ case ZEND_FETCH_OBJ_WRITE:
+ if (promotes_to_object(ptr)) {
+ if (!prop_info) {
+ prop_info = zend_object_fetch_property_type_info(obj, ptr);
+ if (!prop_info) {
+ break;
+ }
+ }
+ if (!check_type_stdClass_assignable(prop_info->type)) {
+ zend_throw_auto_init_in_prop_error(prop_info, "stdClass");
+ if (result) ZVAL_ERROR(result);
+ return 0;
+ }
+ }
+ break;
+ case ZEND_FETCH_REF:
+ if (Z_TYPE_P(ptr) != IS_REFERENCE) {
+ if (!prop_info) {
+ prop_info = zend_object_fetch_property_type_info(obj, ptr);
+ if (!prop_info) {
+ break;
+ }
+ }
+ if (Z_TYPE_P(ptr) == IS_UNDEF) {
+ if (!ZEND_TYPE_ALLOW_NULL(prop_info->type)) {
+ zend_throw_access_uninit_prop_by_ref_error(prop_info);
+ if (result) ZVAL_ERROR(result);
+ return 0;
+ }
+ ZVAL_NULL(ptr);
+ }
+
+ ZVAL_NEW_REF(ptr, ptr);
+ ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(ptr), prop_info);
+ }
+ break;
+ EMPTY_SWITCH_DEFAULT_CASE()
+ }
+ return 1;
+}
+
+static zend_always_inline void zend_fetch_property_address(zval *result, zval *container, uint32_t container_op_type, zval *prop_ptr, uint32_t prop_op_type, void **cache_slot, int type, uint32_t flags, zend_bool init_undef OPLINE_DC EXECUTE_DATA_DC)
+{
+ zval *ptr;
+
+ if (container_op_type != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
do {
- if (Z_ISREF_P(container)) {
+ if (Z_ISREF_P(container) && Z_TYPE_P(Z_REFVAL_P(container)) == IS_OBJECT) {
container = Z_REFVAL_P(container);
- if (EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
- break;
- }
+ break;
+ }
+
+ if (container_op_type == IS_CV
+ && type != BP_VAR_W
+ && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
+ ZVAL_UNDEFINED_OP1();
}
/* this should modify object only if it's empty */
- if (type == BP_VAR_UNSET ||
- UNEXPECTED(!make_real_object_rw(container, prop_ptr OPLINE_CC))) {
+ if (type == BP_VAR_UNSET) {
+ ZVAL_NULL(result);
+ return;
+ }
+
+ container = make_real_object(container, prop_ptr OPLINE_CC EXECUTE_DATA_CC);
+ if (UNEXPECTED(!container)) {
ZVAL_ERROR(result);
return;
}
@@ -2215,12 +2840,17 @@ static zend_always_inline void zend_fetch_property_address(zval *result, zval *c
EXPECTED(Z_OBJCE_P(container) == CACHED_PTR_EX(cache_slot))) {
uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1);
zend_object *zobj = Z_OBJ_P(container);
- zval *retval;
if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
- retval = OBJ_PROP(zobj, prop_offset);
- if (EXPECTED(Z_TYPE_P(retval) != IS_UNDEF)) {
- ZVAL_INDIRECT(result, retval);
+ ptr = OBJ_PROP(zobj, prop_offset);
+ if (EXPECTED(Z_TYPE_P(ptr) != IS_UNDEF)) {
+ ZVAL_INDIRECT(result, ptr);
+ if (flags) {
+ zend_property_info *prop_info = CACHED_PTR_EX(cache_slot + 2);
+ if (prop_info) {
+ zend_handle_fetch_obj_flags(result, ptr, NULL, prop_info, flags);
+ }
+ }
return;
}
} else if (EXPECTED(zobj->properties != NULL)) {
@@ -2230,36 +2860,498 @@ static zend_always_inline void zend_fetch_property_address(zval *result, zval *c
}
zobj->properties = zend_array_dup(zobj->properties);
}
- retval = zend_hash_find_ex(zobj->properties, Z_STR_P(prop_ptr), 1);
- if (EXPECTED(retval)) {
- ZVAL_INDIRECT(result, retval);
+ ptr = zend_hash_find_ex(zobj->properties, Z_STR_P(prop_ptr), 1);
+ if (EXPECTED(ptr)) {
+ ZVAL_INDIRECT(result, ptr);
return;
}
}
}
- if (EXPECTED(Z_OBJ_HT_P(container)->get_property_ptr_ptr)) {
- zval *ptr = Z_OBJ_HT_P(container)->get_property_ptr_ptr(container, prop_ptr, type, cache_slot);
- if (NULL == ptr) {
- if (EXPECTED(Z_OBJ_HT_P(container)->read_property)) {
-use_read_property:
- ptr = Z_OBJ_HT_P(container)->read_property(container, prop_ptr, type, cache_slot, result);
- if (ptr != result) {
- ZVAL_INDIRECT(result, ptr);
- } else if (UNEXPECTED(Z_ISREF_P(ptr) && Z_REFCOUNT_P(ptr) == 1)) {
- ZVAL_UNREF(ptr);
+ ptr = Z_OBJ_HT_P(container)->get_property_ptr_ptr(container, prop_ptr, type, cache_slot);
+ if (NULL == ptr) {
+ ptr = Z_OBJ_HT_P(container)->read_property(container, prop_ptr, type, cache_slot, result);
+ if (ptr == result) {
+ if (UNEXPECTED(Z_ISREF_P(ptr) && Z_REFCOUNT_P(ptr) == 1)) {
+ ZVAL_UNREF(ptr);
+ }
+ return;
+ }
+ } else if (UNEXPECTED(Z_ISERROR_P(ptr))) {
+ ZVAL_ERROR(result);
+ return;
+ }
+
+ ZVAL_INDIRECT(result, ptr);
+ if (flags) {
+ zend_property_info *prop_info;
+
+ if (prop_op_type == IS_CONST) {
+ prop_info = CACHED_PTR_EX(cache_slot + 2);
+ if (prop_info) {
+ if (UNEXPECTED(!zend_handle_fetch_obj_flags(result, ptr, NULL, prop_info, flags))) {
+ return;
}
- } else {
- zend_access_undefined_propery_in_overloaded_object();
- ZVAL_ERROR(result);
}
} else {
- ZVAL_INDIRECT(result, ptr);
+ if (UNEXPECTED(!zend_handle_fetch_obj_flags(result, ptr, Z_OBJ_P(container), NULL, flags))) {
+ return;
+ }
+ }
+ }
+ if (init_undef && UNEXPECTED(Z_TYPE_P(ptr) == IS_UNDEF)) {
+ ZVAL_NULL(ptr);
+ }
+}
+
+static zend_always_inline void zend_assign_to_property_reference(zval *container, uint32_t container_op_type, zval *prop_ptr, uint32_t prop_op_type, zval *value_ptr OPLINE_DC EXECUTE_DATA_DC)
+{
+ zval variable, *variable_ptr = &variable;
+ void **cache_addr = (prop_op_type == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL;
+
+ zend_fetch_property_address(variable_ptr, container, container_op_type, prop_ptr, prop_op_type,
+ cache_addr, BP_VAR_W, 0, 0 OPLINE_CC EXECUTE_DATA_CC);
+
+ if (Z_TYPE_P(variable_ptr) == IS_INDIRECT) {
+ variable_ptr = Z_INDIRECT_P(variable_ptr);
+ }
+
+ if (UNEXPECTED(Z_ISERROR_P(variable_ptr))) {
+ variable_ptr = &EG(uninitialized_zval);
+ } else if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT)) {
+ zend_throw_error(NULL, "Cannot assign by reference to overloaded object");
+ zval_ptr_dtor(&variable);
+ variable_ptr = &EG(uninitialized_zval);
+ } else if (/*OP_DATA_TYPE == IS_VAR &&*/ UNEXPECTED(Z_ISERROR_P(value_ptr))) {
+ variable_ptr = &EG(uninitialized_zval);
+ } else if (/*OP_DATA_TYPE == IS_VAR &&*/
+ (opline->extended_value & ZEND_RETURNS_FUNCTION) &&
+ UNEXPECTED(!Z_ISREF_P(value_ptr))) {
+
+ if (UNEXPECTED(!zend_wrong_assign_to_variable_reference(
+ variable_ptr, value_ptr OPLINE_CC EXECUTE_DATA_CC))) {
+ variable_ptr = &EG(uninitialized_zval);
}
- } else if (EXPECTED(Z_OBJ_HT_P(container)->read_property)) {
- goto use_read_property;
} else {
- zend_unsupported_property_reference();
- ZVAL_ERROR(result);
+ zend_property_info *prop_info = NULL;
+
+ if (prop_op_type == IS_CONST) {
+ prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2);
+ } else {
+ ZVAL_DEREF(container);
+ prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(container), variable_ptr);
+ }
+
+ if (UNEXPECTED(prop_info)) {
+ variable_ptr = zend_assign_to_typed_property_reference(prop_info, variable_ptr, value_ptr EXECUTE_DATA_CC);
+ } 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);
+ }
+}
+
+static zend_never_inline void zend_assign_to_property_reference_this_const(zval *container, zval *prop_ptr, zval *value_ptr OPLINE_DC EXECUTE_DATA_DC)
+{
+ zend_assign_to_property_reference(container, IS_UNUSED, prop_ptr, IS_CONST, value_ptr
+ OPLINE_CC EXECUTE_DATA_CC);
+}
+
+static zend_never_inline void zend_assign_to_property_reference_var_const(zval *container, zval *prop_ptr, zval *value_ptr OPLINE_DC EXECUTE_DATA_DC)
+{
+ zend_assign_to_property_reference(container, IS_VAR, prop_ptr, IS_CONST, value_ptr
+ OPLINE_CC EXECUTE_DATA_CC);
+}
+
+static zend_never_inline void zend_assign_to_property_reference_this_var(zval *container, zval *prop_ptr, zval *value_ptr OPLINE_DC EXECUTE_DATA_DC)
+{
+ zend_assign_to_property_reference(container, IS_UNUSED, prop_ptr, IS_VAR, value_ptr
+ OPLINE_CC EXECUTE_DATA_CC);
+}
+
+static zend_never_inline void zend_assign_to_property_reference_var_var(zval *container, zval *prop_ptr, zval *value_ptr OPLINE_DC EXECUTE_DATA_DC)
+{
+ zend_assign_to_property_reference(container, IS_VAR, prop_ptr, IS_VAR, value_ptr
+ OPLINE_CC EXECUTE_DATA_CC);
+}
+
+static zend_never_inline int zend_fetch_static_property_address_ex(zval **retval, zend_property_info **prop_info, uint32_t cache_slot, int fetch_type OPLINE_DC EXECUTE_DATA_DC) {
+ zend_free_op free_op1;
+ zend_string *name, *tmp_name;
+ zend_class_entry *ce;
+ zend_property_info *property_info;
+
+ zend_uchar op1_type = opline->op1_type, op2_type = opline->op2_type;
+
+ if (EXPECTED(op2_type == IS_CONST)) {
+ zval *class_name = RT_CONSTANT(opline, opline->op2);
+
+ ZEND_ASSERT(op1_type != IS_CONST || CACHED_PTR(cache_slot) == NULL);
+
+ if (EXPECTED((ce = CACHED_PTR(cache_slot)) == NULL)) {
+ ce = zend_fetch_class_by_name(Z_STR_P(class_name), Z_STR_P(class_name + 1), ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
+ if (UNEXPECTED(ce == NULL)) {
+ FREE_UNFETCHED_OP(op1_type, opline->op1.var);
+ return FAILURE;
+ }
+ if (UNEXPECTED(op1_type != IS_CONST)) {
+ CACHE_PTR(cache_slot, ce);
+ }
+ }
+ } else {
+ if (EXPECTED(op2_type == IS_UNUSED)) {
+ ce = zend_fetch_class(NULL, opline->op2.num);
+ if (UNEXPECTED(ce == NULL)) {
+ FREE_UNFETCHED_OP(op1_type, opline->op1.var);
+ return FAILURE;
+ }
+ } else {
+ ce = Z_CE_P(EX_VAR(opline->op2.var));
+ }
+ if (EXPECTED(op1_type == IS_CONST) && EXPECTED(CACHED_PTR(cache_slot) == ce)) {
+ *retval = CACHED_PTR(cache_slot + sizeof(void *));
+ *prop_info = CACHED_PTR(cache_slot + sizeof(void *) * 2);
+ return SUCCESS;
+ }
+ }
+
+ if (EXPECTED(op1_type == IS_CONST)) {
+ name = Z_STR_P(RT_CONSTANT(opline, opline->op1));
+ } else {
+ zval *varname = get_zval_ptr_undef(opline->op1_type, opline->op1, &free_op1, BP_VAR_R);
+ if (EXPECTED(Z_TYPE_P(varname) == IS_STRING)) {
+ name = Z_STR_P(varname);
+ tmp_name = NULL;
+ } else {
+ if (op1_type == IS_CV && UNEXPECTED(Z_TYPE_P(varname) == IS_UNDEF)) {
+ zval_undefined_cv(opline->op1.var EXECUTE_DATA_CC);
+ }
+ name = zval_get_tmp_string(varname, &tmp_name);
+ }
+ }
+
+ *retval = zend_std_get_static_property_with_info(ce, name, fetch_type, &property_info);
+
+ if (UNEXPECTED(op1_type != IS_CONST)) {
+ zend_tmp_string_release(tmp_name);
+
+ if (op1_type != IS_CV) {
+ zval_ptr_dtor_nogc(free_op1);
+ }
+ }
+
+ if (UNEXPECTED(*retval == NULL)) {
+ return FAILURE;
+ }
+
+ *prop_info = property_info;
+
+ if (EXPECTED(op1_type == IS_CONST)) {
+ CACHE_POLYMORPHIC_PTR(cache_slot, ce, *retval);
+ CACHE_PTR(cache_slot + sizeof(void *) * 2, property_info);
+ }
+
+ return SUCCESS;
+}
+
+
+static zend_always_inline int zend_fetch_static_property_address(zval **retval, zend_property_info **prop_info, uint32_t cache_slot, int fetch_type, int flags OPLINE_DC EXECUTE_DATA_DC) {
+ int success;
+ zend_property_info *property_info;
+
+ if (opline->op1_type == IS_CONST && (opline->op2_type == IS_CONST || (opline->op2_type == IS_UNUSED && (opline->op2.num == ZEND_FETCH_CLASS_SELF || opline->op2.num == ZEND_FETCH_CLASS_PARENT))) && EXPECTED(CACHED_PTR(cache_slot) != NULL)) {
+ *retval = CACHED_PTR(cache_slot + sizeof(void *));
+ property_info = CACHED_PTR(cache_slot + sizeof(void *) * 2);
+
+ if ((fetch_type == BP_VAR_R || fetch_type == BP_VAR_RW)
+ && UNEXPECTED(Z_TYPE_P(*retval) == IS_UNDEF) && UNEXPECTED(property_info->type != 0)) {
+ zend_throw_error(NULL, "Typed static property %s::$%s must not be accessed before initialization",
+ ZSTR_VAL(property_info->ce->name),
+ zend_get_unmangled_property_name(property_info->name));
+ return FAILURE;
+ }
+ } else {
+ success = zend_fetch_static_property_address_ex(retval, &property_info, cache_slot, fetch_type OPLINE_CC EXECUTE_DATA_CC);
+ if (UNEXPECTED(success != SUCCESS)) {
+ return FAILURE;
+ }
+ }
+
+ if (flags && property_info->type) {
+ zend_handle_fetch_obj_flags(NULL, *retval, NULL, property_info, flags);
+ }
+
+ if (prop_info) {
+ *prop_info = property_info;
+ }
+
+ return SUCCESS;
+}
+
+ZEND_API ZEND_COLD void zend_throw_ref_type_error_type(zend_property_info *prop1, zend_property_info *prop2, zval *zv) {
+ const char *prop1_type1, *prop1_type2, *prop2_type1, *prop2_type2;
+ zend_format_type(prop1->type, &prop1_type1, &prop1_type2);
+ zend_format_type(prop2->type, &prop2_type1, &prop2_type2);
+ zend_type_error("Reference with value of type %s held by property %s::$%s of type %s%s is not compatible with property %s::$%s of type %s%s",
+ Z_TYPE_P(zv) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(zv)->name) : zend_get_type_by_const(Z_TYPE_P(zv)),
+ ZSTR_VAL(prop1->ce->name),
+ zend_get_unmangled_property_name(prop1->name),
+ prop1_type1, prop1_type2,
+ ZSTR_VAL(prop2->ce->name),
+ zend_get_unmangled_property_name(prop2->name),
+ prop2_type1, prop2_type2
+ );
+}
+
+ZEND_API ZEND_COLD void zend_throw_ref_type_error_zval(zend_property_info *prop, zval *zv) {
+ const char *prop_type1, *prop_type2;
+ zend_format_type(prop->type, &prop_type1, &prop_type2);
+ zend_type_error("Cannot assign %s to reference held by property %s::$%s of type %s%s",
+ Z_TYPE_P(zv) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(zv)->name) : zend_get_type_by_const(Z_TYPE_P(zv)),
+ ZSTR_VAL(prop->ce->name),
+ zend_get_unmangled_property_name(prop->name),
+ prop_type1, prop_type2
+ );
+}
+
+ZEND_API ZEND_COLD void zend_throw_conflicting_coercion_error(zend_property_info *prop1, zend_property_info *prop2, zval *zv) {
+ const char *prop1_type1, *prop1_type2, *prop2_type1, *prop2_type2;
+ zend_format_type(prop1->type, &prop1_type1, &prop1_type2);
+ zend_format_type(prop2->type, &prop2_type1, &prop2_type2);
+ zend_type_error("Cannot assign %s to reference held by property %s::$%s of type %s%s and property %s::$%s of type %s%s, as this would result in an inconsistent type conversion",
+ Z_TYPE_P(zv) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(zv)->name) : zend_get_type_by_const(Z_TYPE_P(zv)),
+ ZSTR_VAL(prop1->ce->name),
+ zend_get_unmangled_property_name(prop1->name),
+ prop1_type1, prop1_type2,
+ ZSTR_VAL(prop2->ce->name),
+ zend_get_unmangled_property_name(prop2->name),
+ prop2_type1, prop2_type2
+ );
+}
+
+/* 1: valid, 0: invalid, -1: may be valid after type coercion */
+static zend_always_inline int i_zend_verify_type_assignable_zval(
+ zend_type *type_ptr, zend_class_entry *self_ce, zval *zv, zend_bool strict) {
+ zend_type type = *type_ptr;
+ zend_uchar type_code;
+ zend_uchar zv_type = Z_TYPE_P(zv);
+
+ if (ZEND_TYPE_ALLOW_NULL(type) && zv_type == IS_NULL) {
+ return 1;
+ }
+
+ if (ZEND_TYPE_IS_CLASS(type)) {
+ if (!ZEND_TYPE_IS_CE(type)) {
+ if (!zend_resolve_class_type(type_ptr, self_ce)) {
+ return 0;
+ }
+ type = *type_ptr;
+ }
+ return zv_type == IS_OBJECT && instanceof_function(Z_OBJCE_P(zv), ZEND_TYPE_CE(type));
+ }
+
+ type_code = ZEND_TYPE_CODE(type);
+ if (type_code == zv_type ||
+ (type_code == _IS_BOOL && (zv_type == IS_FALSE || zv_type == IS_TRUE))) {
+ return 1;
+ }
+
+ if (type_code == IS_ITERABLE) {
+ return zend_is_iterable(zv);
+ }
+
+ /* SSTH Exception: IS_LONG may be accepted as IS_DOUBLE (converted) */
+ if (strict) {
+ if (type_code == IS_DOUBLE && zv_type == IS_LONG) {
+ return -1;
+ }
+ return 0;
+ }
+
+ /* No weak conversions for arrays and objects */
+ if (type_code == IS_ARRAY || type_code == IS_OBJECT) {
+ return 0;
+ }
+
+ /* NULL may be accepted only by nullable hints (this is already checked) */
+ if (zv_type == IS_NULL) {
+ return 0;
+ }
+
+ /* Coercion may be necessary, check separately */
+ return -1;
+}
+
+ZEND_API zend_bool ZEND_FASTCALL zend_verify_ref_assignable_zval(zend_reference *ref, zval *zv, zend_bool strict)
+{
+ zend_property_info *prop;
+
+ /* The value must satisfy each property type, and coerce to the same value for each property
+ * type. Right now, the latter rule means that *if* coercion is necessary, then all types
+ * must be the same (modulo nullability). To handle this, remember the first type we see and
+ * compare against it when coercion becomes necessary. */
+ zend_property_info *seen_prop = NULL;
+ zend_uchar seen_type;
+ zend_bool needs_coercion = 0;
+
+ ZEND_ASSERT(Z_TYPE_P(zv) != IS_REFERENCE);
+ ZEND_REF_FOREACH_TYPE_SOURCES(ref, prop) {
+ int result = i_zend_verify_type_assignable_zval(&prop->type, prop->ce, zv, strict);
+ if (result == 0) {
+ zend_throw_ref_type_error_zval(prop, zv);
+ return 0;
+ }
+
+ if (result < 0) {
+ needs_coercion = 1;
+ }
+
+ if (!seen_prop) {
+ seen_prop = prop;
+ seen_type = ZEND_TYPE_IS_CLASS(prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(prop->type);
+ } else if (needs_coercion && seen_type != ZEND_TYPE_CODE(prop->type)) {
+ zend_throw_conflicting_coercion_error(seen_prop, prop, zv);
+ return 0;
+ }
+ } ZEND_REF_FOREACH_TYPE_SOURCES_END();
+
+ if (UNEXPECTED(needs_coercion && !zend_verify_weak_scalar_type_hint(seen_type, zv))) {
+ zend_throw_ref_type_error_zval(seen_prop, zv);
+ return 0;
+ }
+
+ return 1;
+}
+
+static zend_always_inline void i_zval_ptr_dtor_noref(zval *zval_ptr) {
+ if (Z_REFCOUNTED_P(zval_ptr)) {
+ zend_refcounted *ref = Z_COUNTED_P(zval_ptr);
+ ZEND_ASSERT(Z_TYPE_P(zval_ptr) != IS_REFERENCE);
+ if (!GC_DELREF(ref)) {
+ rc_dtor_func(ref);
+ } else if (UNEXPECTED(GC_MAY_LEAK(ref))) {
+ gc_possible_root(ref);
+ }
+ }
+}
+
+ZEND_API zval* zend_assign_to_typed_ref(zval *variable_ptr, zval *orig_value, zend_uchar value_type, zend_bool strict, zend_refcounted *ref)
+{
+ zend_bool ret;
+ zval value;
+ ZVAL_COPY(&value, orig_value);
+ ret = zend_verify_ref_assignable_zval(Z_REF_P(variable_ptr), &value, strict);
+ variable_ptr = Z_REFVAL_P(variable_ptr);
+ if (EXPECTED(ret)) {
+ i_zval_ptr_dtor_noref(variable_ptr);
+ ZVAL_COPY_VALUE(variable_ptr, &value);
+ } else {
+ zval_ptr_dtor_nogc(&value);
+ }
+ if (value_type & (IS_VAR|IS_TMP_VAR)) {
+ if (UNEXPECTED(ref)) {
+ if (UNEXPECTED(GC_DELREF(ref) == 0)) {
+ zval_ptr_dtor(orig_value);
+ efree_size(ref, sizeof(zend_reference));
+ }
+ } else {
+ i_zval_ptr_dtor_noref(orig_value);
+ }
+ }
+ return variable_ptr;
+}
+
+ZEND_API zend_bool ZEND_FASTCALL zend_verify_prop_assignable_by_ref(zend_property_info *prop_info, zval *orig_val, zend_bool strict) {
+ zval *val = orig_val;
+ if (Z_ISREF_P(val) && ZEND_REF_HAS_TYPE_SOURCES(Z_REF_P(val))) {
+ int result;
+
+ val = Z_REFVAL_P(val);
+ result = i_zend_verify_type_assignable_zval(&prop_info->type, prop_info->ce, val, strict);
+ if (result > 0) {
+ return 1;
+ }
+
+ if (result < 0) {
+ zend_property_info *ref_prop = ZEND_REF_FIRST_SOURCE(Z_REF_P(orig_val));
+ if (ZEND_TYPE_CODE(prop_info->type) != ZEND_TYPE_CODE(ref_prop->type)) {
+ /* Invalid due to conflicting coercion */
+ zend_throw_ref_type_error_type(ref_prop, prop_info, val);
+ return 0;
+ }
+ if (zend_verify_weak_scalar_type_hint(ZEND_TYPE_CODE(prop_info->type), val)) {
+ return 1;
+ }
+ }
+ } else {
+ ZVAL_DEREF(val);
+ if (i_zend_check_property_type(prop_info, val, strict)) {
+ return 1;
+ }
+ }
+
+ zend_verify_property_type_error(prop_info, val);
+ return 0;
+}
+
+ZEND_API void ZEND_FASTCALL zend_ref_add_type_source(zend_property_info_source_list *source_list, zend_property_info *prop)
+{
+ zend_property_info_list *list;
+ if (source_list->ptr == NULL) {
+ source_list->ptr = prop;
+ return;
+ }
+
+ list = ZEND_PROPERTY_INFO_SOURCE_TO_LIST(source_list->list);
+ if (!ZEND_PROPERTY_INFO_SOURCE_IS_LIST(source_list->list)) {
+ list = emalloc(sizeof(zend_property_info_list) + (4 - 1) * sizeof(zend_property_info *));
+ list->ptr[0] = source_list->ptr;
+ list->num_allocated = 4;
+ list->num = 1;
+ } else if (list->num_allocated == list->num) {
+ list->num_allocated = list->num * 2;
+ list = erealloc(list, sizeof(zend_property_info_list) + (list->num_allocated - 1) * sizeof(zend_property_info *));
+ }
+
+ list->ptr[list->num++] = prop;
+ source_list->list = ZEND_PROPERTY_INFO_SOURCE_FROM_LIST(list);
+}
+
+ZEND_API void ZEND_FASTCALL zend_ref_del_type_source(zend_property_info_source_list *source_list, zend_property_info *prop)
+{
+ zend_property_info_list *list = ZEND_PROPERTY_INFO_SOURCE_TO_LIST(source_list->list);
+ zend_property_info **ptr, **end;
+
+ if (!ZEND_PROPERTY_INFO_SOURCE_IS_LIST(source_list->list)) {
+ ZEND_ASSERT(source_list->ptr == prop);
+ source_list->ptr = NULL;
+ return;
+ }
+
+ if (list->num == 1) {
+ ZEND_ASSERT(*list->ptr == prop);
+ efree(list);
+ source_list->ptr = NULL;
+ return;
+ }
+
+ /* Checking against end here to get a more graceful failure mode if we missed adding a type
+ * source at some point. */
+ ptr = list->ptr;
+ end = ptr + list->num;
+ while (ptr < end && *ptr != prop) {
+ ptr++;
+ }
+ ZEND_ASSERT(*ptr == prop);
+
+ /* Copy the last list element into the deleted slot. */
+ *ptr = list->ptr[--list->num];
+
+ if (list->num >= 4 && list->num * 4 == list->num_allocated) {
+ list->num_allocated = list->num * 2;
+ source_list->list = ZEND_PROPERTY_INFO_SOURCE_FROM_LIST(erealloc(list, sizeof(zend_property_info_list) + (list->num_allocated - 1) * sizeof(zend_property_info *)));
}
}
@@ -2298,6 +3390,10 @@ static zend_never_inline void zend_fetch_this_var(int type OPLINE_DC EXECUTE_DAT
}
}
+static zend_never_inline ZEND_COLD void ZEND_FASTCALL zend_wrong_clone_call(zend_function *clone, zend_class_entry *scope)
+{
+ zend_throw_error(NULL, "Call to %s %s::__clone() from context '%s'", zend_visibility_string(clone->common.fn_flags), ZSTR_VAL(clone->common.scope->name), scope ? ZSTR_VAL(scope->name) : "");
+}
#if ZEND_INTENSIVE_DEBUGGING
@@ -2346,7 +3442,7 @@ ZEND_API void zend_clean_and_cache_symbol_table(zend_array *symbol_table) /* {{{
/* clean before putting into the cache, since clean
could call dtors, which could use cached hash */
zend_symtable_clean(symbol_table);
- *(++EG(symtable_cache_ptr)) = symbol_table;
+ *(EG(symtable_cache_ptr)++) = symbol_table;
}
}
/* }}} */
@@ -2396,7 +3492,7 @@ ZEND_API void zend_free_compiled_variables(zend_execute_data *execute_data) /* {
* +========================================+
* EG(current_execute_data) -> | zend_execute_data |
* +----------------------------------------+
- * EX_CV_NUM(0) ---------> | VAR[0] = ARG[1] |
+ * EX_VAR_NUM(0) --------> | VAR[0] = ARG[1] |
* | ... |
* | VAR[op_array->num_args-1] = ARG[N] |
* | ... |
@@ -2409,6 +3505,15 @@ ZEND_API void zend_free_compiled_variables(zend_execute_data *execute_data) /* {
* +----------------------------------------+
*/
+/* zend_copy_extra_args is used when the actually passed number of arguments
+ * (EX_NUM_ARGS) is greater than what the function defined (op_array->num_args).
+ *
+ * The extra arguments will be copied into the call frame after all the compiled variables.
+ *
+ * If there are extra arguments copied, a flag "ZEND_CALL_FREE_EXTRA_ARGS" will be set
+ * on the zend_execute_data, and when the executor leaves the function, the
+ * args will be freed in zend_leave_helper.
+ */
static zend_never_inline void zend_copy_extra_args(EXECUTE_DATA_D)
{
zend_op_array *op_array = &EX(func)->op_array;
@@ -2421,7 +3526,7 @@ static zend_never_inline void zend_copy_extra_args(EXECUTE_DATA_D)
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))
+#if defined(ZEND_VM_IP_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;
@@ -2473,7 +3578,7 @@ static zend_always_inline void i_init_func_execute_data(zend_op_array *op_array,
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))
+#if defined(ZEND_VM_IP_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;
@@ -2490,7 +3595,7 @@ static zend_always_inline void i_init_func_execute_data(zend_op_array *op_array,
}
} 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))
+#if defined(ZEND_VM_IP_GLOBAL_REG) && ((ZEND_VM_KIND == ZEND_VM_KIND_CALL) || (ZEND_VM_KIND == ZEND_VM_KIND_HYBRID))
opline += num_args;
#else
EX(opline) += num_args;
@@ -2500,48 +3605,26 @@ static zend_always_inline void i_init_func_execute_data(zend_op_array *op_array,
/* Initialize CV variables (skip arguments) */
zend_init_cvs(num_args, op_array->last_var EXECUTE_DATA_CC);
- EX_LOAD_RUN_TIME_CACHE(op_array);
+ EX(run_time_cache) = RUN_TIME_CACHE(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
-}
-/* }}} */
-
-static zend_never_inline void ZEND_FASTCALL init_func_run_time_cache(zend_op_array *op_array) /* {{{ */
-{
- ZEND_ASSERT(op_array->run_time_cache == NULL);
- 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);
}
/* }}} */
-static zend_always_inline zend_function* ZEND_FASTCALL init_func_run_time_cache_i(zval *zv) /* {{{ */
+static zend_always_inline void init_func_run_time_cache_i(zend_op_array *op_array) /* {{{ */
{
- zend_op_array *op_array = Z_PTR_P(zv);
+ void **run_time_cache;
- 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;
- }
+ ZEND_ASSERT(RUN_TIME_CACHE(op_array) == NULL);
+ run_time_cache = zend_arena_alloc(&CG(arena), op_array->cache_size);
+ memset(run_time_cache, 0, op_array->cache_size);
+ ZEND_MAP_PTR_SET(op_array->run_time_cache, run_time_cache);
}
/* }}} */
-static zend_never_inline zend_function* init_func_run_time_cache_ex(zval *zv) /* {{{ */
+static zend_never_inline void ZEND_FASTCALL init_func_run_time_cache(zend_op_array *op_array) /* {{{ */
{
- return init_func_run_time_cache_i(zv);
+ init_func_run_time_cache_i(op_array);
}
/* }}} */
@@ -2552,8 +3635,8 @@ ZEND_API zend_function * ZEND_FASTCALL zend_fetch_function(zend_string *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);
+ if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!RUN_TIME_CACHE(&fbc->op_array))) {
+ init_func_run_time_cache_i(&fbc->op_array);
}
return fbc;
}
@@ -2567,14 +3650,21 @@ ZEND_API zend_function * ZEND_FASTCALL zend_fetch_function_str(const char *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);
+ if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!RUN_TIME_CACHE(&fbc->op_array))) {
+ init_func_run_time_cache_i(&fbc->op_array);
}
return fbc;
}
return NULL;
} /* }}} */
+ZEND_API void ZEND_FASTCALL zend_init_func_run_time_cache(zend_op_array *op_array) /* {{{ */
+{
+ if (!RUN_TIME_CACHE(op_array)) {
+ init_func_run_time_cache_i(op_array);
+ }
+} /* }}} */
+
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);
@@ -2585,11 +3675,17 @@ static zend_always_inline void i_init_code_execute_data(zend_execute_data *execu
zend_attach_symbol_table(execute_data);
- if (!op_array->run_time_cache) {
- op_array->run_time_cache = emalloc(op_array->cache_size);
- memset(op_array->run_time_cache, 0, op_array->cache_size);
+ if (!ZEND_MAP_PTR(op_array->run_time_cache)) {
+ void *ptr;
+
+ ZEND_ASSERT(op_array->fn_flags & ZEND_ACC_HEAP_RT_CACHE);
+ ptr = emalloc(op_array->cache_size + sizeof(void*));
+ ZEND_MAP_PTR_INIT(op_array->run_time_cache, ptr);
+ ptr = (char*)ptr + sizeof(void*);
+ ZEND_MAP_PTR_SET(op_array->run_time_cache, ptr);
+ memset(ptr, 0, op_array->cache_size);
}
- EX_LOAD_RUN_TIME_CACHE(op_array);
+ EX(run_time_cache) = RUN_TIME_CACHE(op_array);
EG(current_execute_data) = execute_data;
}
@@ -2599,21 +3695,27 @@ ZEND_API void zend_init_func_execute_data(zend_execute_data *ex, zend_op_array *
{
#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;
+#endif
+#if defined(ZEND_VM_IP_GLOBAL_REG) && ((ZEND_VM_KIND == ZEND_VM_KIND_CALL) || (ZEND_VM_KIND == ZEND_VM_KIND_HYBRID))
const zend_op *orig_opline = opline;
+#endif
+#if defined(ZEND_VM_FP_GLOBAL_REG) && ((ZEND_VM_KIND == ZEND_VM_KIND_CALL) || (ZEND_VM_KIND == ZEND_VM_KIND_HYBRID))
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) {
+ if (!RUN_TIME_CACHE(op_array)) {
init_func_run_time_cache(op_array);
}
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))
+#if defined(ZEND_VM_IP_GLOBAL_REG) && ((ZEND_VM_KIND == ZEND_VM_KIND_CALL) || (ZEND_VM_KIND == ZEND_VM_KIND_HYBRID))
EX(opline) = opline;
opline = orig_opline;
+#endif
+#if defined(ZEND_VM_FP_GLOBAL_REG) && ((ZEND_VM_KIND == ZEND_VM_KIND_CALL) || (ZEND_VM_KIND == ZEND_VM_KIND_HYBRID))
execute_data = orig_execute_data;
#endif
}
@@ -2622,10 +3724,6 @@ ZEND_API void zend_init_func_execute_data(zend_execute_data *ex, zend_op_array *
ZEND_API void zend_init_code_execute_data(zend_execute_data *execute_data, zend_op_array *op_array, zval *return_value) /* {{{ */
{
EX(prev_execute_data) = EG(current_execute_data);
- if (!op_array->run_time_cache) {
- op_array->run_time_cache = emalloc(op_array->cache_size);
- memset(op_array->run_time_cache, 0, op_array->cache_size);
- }
i_init_code_execute_data(execute_data, op_array, return_value);
}
/* }}} */
@@ -2640,15 +3738,6 @@ 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(uint32_t arg_num, zend_function *func) /* {{{ */
-{
- if (EXPECTED(arg_num <= MAX_ARG_FLAG_NUM)) {
- return QUICK_ARG_SHOULD_BE_SENT_BY_REF(func, arg_num);
- }
- return ARG_SHOULD_BE_SENT_BY_REF(func, arg_num);
-}
-/* }}} */
-
static zend_execute_data *zend_vm_stack_copy_call_frame(zend_execute_data *call, uint32_t passed_args, uint32_t additional_args) /* {{{ */
{
zend_execute_data *new_call;
@@ -2673,7 +3762,7 @@ static zend_execute_data *zend_vm_stack_copy_call_frame(zend_execute_data *call,
/* delete old call_frame from previous stack segment */
EG(vm_stack)->prev->top = (zval*)call;
- /* delete previous stack segment if it becames empty */
+ /* delete previous stack segment if it became empty */
if (UNEXPECTED(EG(vm_stack)->prev->top == ZEND_VM_STACK_ELEMENTS(EG(vm_stack)->prev))) {
zend_vm_stack r = EG(vm_stack)->prev;
@@ -2812,12 +3901,6 @@ static void cleanup_unfinished_calls(zend_execute_data *execute_data, uint32_t o
zend_vm_stack_free_args(EX(call));
if (ZEND_CALL_INFO(call) & ZEND_CALL_RELEASE_THIS) {
- if (ZEND_CALL_INFO(call) & ZEND_CALL_CTOR) {
- GC_DELREF(Z_OBJ(call->This));
- if (GC_REFCOUNT(Z_OBJ(call->This)) == 1) {
- zend_object_store_ctor_failed(Z_OBJ(call->This));
- }
- }
OBJ_RELEASE(Z_OBJ(call->This));
}
if (call->func->common.fn_flags & ZEND_ACC_CLOSURE) {
@@ -2866,6 +3949,12 @@ static void cleanup_live_vars(zend_execute_data *execute_data, uint32_t op_num,
if (kind == ZEND_LIVE_TMPVAR) {
zval_ptr_dtor_nogc(var);
+ } else if (kind == ZEND_LIVE_NEW) {
+ zend_object *obj;
+ ZEND_ASSERT(Z_TYPE_P(var) == IS_OBJECT);
+ obj = Z_OBJ_P(var);
+ zend_object_store_ctor_failed(obj);
+ OBJ_RELEASE(obj);
} else if (kind == ZEND_LIVE_LOOP) {
if (Z_TYPE_P(var) != IS_ARRAY && Z_FE_ITER_P(var) != (uint32_t)-1) {
zend_hash_iterator_del(Z_FE_ITER_P(var));
@@ -2904,6 +3993,7 @@ ZEND_API void zend_cleanup_unfinished_execution(zend_execute_data *execute_data,
cleanup_live_vars(execute_data, op_num, catch_op_num);
}
+#if ZEND_VM_SPEC
static void zend_swap_operands(zend_op *op) /* {{{ */
{
znode_op tmp;
@@ -2917,6 +4007,7 @@ static void zend_swap_operands(zend_op *op) /* {{{ */
op->op2_type = tmp_type;
}
/* }}} */
+#endif
static zend_never_inline zend_execute_data *zend_init_dynamic_call_string(zend_string *function, uint32_t num_args) /* {{{ */
{
@@ -2967,7 +4058,7 @@ static zend_never_inline zend_execute_data *zend_init_dynamic_call_string(zend_s
return NULL;
}
}
- if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
+ if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!RUN_TIME_CACHE(&fbc->op_array))) {
init_func_run_time_cache(&fbc->op_array);
}
} else {
@@ -2985,20 +4076,21 @@ static zend_never_inline zend_execute_data *zend_init_dynamic_call_string(zend_s
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);
+ if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!RUN_TIME_CACHE(&fbc->op_array))) {
+ init_func_run_time_cache(&fbc->op_array);
}
called_scope = NULL;
}
return zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION | ZEND_CALL_DYNAMIC,
- fbc, num_args, called_scope, NULL);
+ fbc, num_args, called_scope);
}
/* }}} */
static zend_never_inline zend_execute_data *zend_init_dynamic_call_object(zval *function, uint32_t num_args) /* {{{ */
{
zend_function *fbc;
+ void *object_or_called_scope;
zend_class_entry *called_scope;
zend_object *object;
uint32_t call_info = ZEND_CALL_NESTED_FUNCTION | ZEND_CALL_DYNAMIC;
@@ -3006,6 +4098,7 @@ static zend_never_inline zend_execute_data *zend_init_dynamic_call_object(zval *
if (EXPECTED(Z_OBJ_HANDLER_P(function, get_closure)) &&
EXPECTED(Z_OBJ_HANDLER_P(function, get_closure)(function, &called_scope, &fbc, &object) == SUCCESS)) {
+ object_or_called_scope = called_scope;
if (fbc->common.fn_flags & ZEND_ACC_CLOSURE) {
/* Delay closure destruction until its invocation */
GC_ADDREF(ZEND_CLOSURE_OBJECT(fbc));
@@ -3013,29 +4106,33 @@ static zend_never_inline zend_execute_data *zend_init_dynamic_call_object(zval *
if (fbc->common.fn_flags & ZEND_ACC_FAKE_CLOSURE) {
call_info |= ZEND_CALL_FAKE_CLOSURE;
}
+ if (object) {
+ call_info |= ZEND_CALL_HAS_THIS;
+ object_or_called_scope = object;
+ }
} else if (object) {
- call_info |= ZEND_CALL_RELEASE_THIS;
+ call_info |= ZEND_CALL_RELEASE_THIS | ZEND_CALL_HAS_THIS;
GC_ADDREF(object); /* For $this pointer */
+ object_or_called_scope = object;
}
} else {
zend_throw_error(NULL, "Function name must be a string");
return NULL;
}
- if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
+ if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!RUN_TIME_CACHE(&fbc->op_array))) {
init_func_run_time_cache(&fbc->op_array);
}
return zend_vm_stack_push_call_frame(call_info,
- fbc, num_args, called_scope, object);
+ fbc, num_args, object_or_called_scope);
}
/* }}} */
static zend_never_inline zend_execute_data *zend_init_dynamic_call_array(zend_array *function, uint32_t num_args) /* {{{ */
{
zend_function *fbc;
- zend_class_entry *called_scope;
- zend_object *object;
+ void *object_or_called_scope;
uint32_t call_info = ZEND_CALL_NESTED_FUNCTION | ZEND_CALL_DYNAMIC;
if (zend_hash_num_elements(function) == 2) {
@@ -3062,8 +4159,8 @@ static zend_never_inline zend_execute_data *zend_init_dynamic_call_array(zend_ar
}
if (Z_TYPE_P(obj) == IS_STRING) {
- object = NULL;
- called_scope = zend_fetch_class_by_name(Z_STR_P(obj), NULL, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
+ zend_class_entry *called_scope = zend_fetch_class_by_name(Z_STR_P(obj), NULL, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
+
if (UNEXPECTED(called_scope == NULL)) {
return NULL;
}
@@ -3085,9 +4182,9 @@ static zend_never_inline zend_execute_data *zend_init_dynamic_call_array(zend_ar
return NULL;
}
}
+ object_or_called_scope = called_scope;
} else {
- called_scope = Z_OBJCE_P(obj);
- object = Z_OBJ_P(obj);
+ zend_object *object = Z_OBJ_P(obj);
fbc = Z_OBJ_HT_P(obj)->get_method(&object, Z_STR_P(method), NULL);
if (UNEXPECTED(fbc == NULL)) {
@@ -3098,10 +4195,11 @@ static zend_never_inline zend_execute_data *zend_init_dynamic_call_array(zend_ar
}
if ((fbc->common.fn_flags & ZEND_ACC_STATIC) != 0) {
- object = NULL;
+ object_or_called_scope = object->ce;
} else {
- call_info |= ZEND_CALL_RELEASE_THIS;
+ call_info |= ZEND_CALL_RELEASE_THIS | ZEND_CALL_HAS_THIS;
GC_ADDREF(object); /* For $this pointer */
+ object_or_called_scope = object;
}
}
} else {
@@ -3109,12 +4207,12 @@ static zend_never_inline zend_execute_data *zend_init_dynamic_call_array(zend_ar
return NULL;
}
- if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
+ if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!RUN_TIME_CACHE(&fbc->op_array))) {
init_func_run_time_cache(&fbc->op_array);
}
return zend_vm_stack_push_call_frame(call_info,
- fbc, num_args, called_scope, object);
+ fbc, num_args, object_or_called_scope);
}
/* }}} */
@@ -3127,7 +4225,12 @@ 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_func(inc_filename));
+ zend_string *tmp = zval_try_get_string_func(inc_filename);
+
+ if (UNEXPECTED(!tmp)) {
+ return NULL;
+ }
+ ZVAL_STR(&tmp_inc_filename, tmp);
inc_filename = &tmp_inc_filename;
}
@@ -3142,6 +4245,8 @@ static zend_never_inline zend_op_array* ZEND_FASTCALL zend_include_or_eval(zval
if (zend_hash_exists(&EG(included_files), resolved_path)) {
goto already_compiled;
}
+ } else if (UNEXPECTED(EG(exception))) {
+ break;
} else if (UNEXPECTED(strlen(Z_STRVAL_P(inc_filename)) != Z_STRLEN_P(inc_filename))) {
zend_message_dispatcher(
(type == ZEND_INCLUDE_ONCE) ?
@@ -3207,7 +4312,7 @@ already_compiled:
}
/* }}} */
-ZEND_API int ZEND_FASTCALL zend_do_fcall_overloaded(zend_execute_data *call, zval *ret) /* {{{ */
+static ZEND_COLD int ZEND_FASTCALL zend_do_fcall_overloaded(zend_execute_data *call, zval *ret) /* {{{ */
{
zend_function *fbc = call->func;
zend_object *object;
@@ -3404,6 +4509,39 @@ static zend_never_inline int ZEND_FASTCALL zend_quick_check_constant(
return _zend_quick_get_constant(key, 0, 1 OPLINE_CC EXECUTE_DATA_CC);
} /* }}} */
+#if defined(ZEND_VM_IP_GLOBAL_REG) && ((ZEND_VM_KIND == ZEND_VM_KIND_CALL) || (ZEND_VM_KIND == ZEND_VM_KIND_HYBRID))
+/* Special versions of functions that sets EX(opline) before calling zend_vm_stack_extend() */
+static zend_always_inline zend_execute_data *_zend_vm_stack_push_call_frame_ex(uint32_t used_stack, uint32_t call_info, zend_function *func, uint32_t num_args, void *object_or_called_scope) /* {{{ */
+{
+ zend_execute_data *call = (zend_execute_data*)EG(vm_stack_top);
+
+ ZEND_ASSERT_VM_STACK_GLOBAL;
+
+ if (UNEXPECTED(used_stack > (size_t)(((char*)EG(vm_stack_end)) - (char*)call))) {
+ EX(opline) = opline; /* this is the only difference */
+ call = (zend_execute_data*)zend_vm_stack_extend(used_stack);
+ ZEND_ASSERT_VM_STACK_GLOBAL;
+ zend_vm_init_call_frame(call, call_info | ZEND_CALL_ALLOCATED, func, num_args, object_or_called_scope);
+ return call;
+ } else {
+ EG(vm_stack_top) = (zval*)((char*)call + used_stack);
+ zend_vm_init_call_frame(call, call_info, func, num_args, object_or_called_scope);
+ return call;
+ }
+} /* }}} */
+
+static zend_always_inline zend_execute_data *_zend_vm_stack_push_call_frame(uint32_t call_info, zend_function *func, uint32_t num_args, void *object_or_called_scope) /* {{{ */
+{
+ uint32_t used_stack = zend_vm_calc_used_stack(num_args, func);
+
+ return _zend_vm_stack_push_call_frame_ex(used_stack, call_info,
+ func, num_args, object_or_called_scope);
+} /* }}} */
+#else
+# define _zend_vm_stack_push_call_frame_ex zend_vm_stack_push_call_frame_ex
+# define _zend_vm_stack_push_call_frame zend_vm_stack_push_call_frame
+#endif
+
#ifdef ZEND_VM_TRACE_HANDLERS
# include "zend_vm_trace_handlers.h"
#elif defined(ZEND_VM_TRACE_MAP)
@@ -3464,29 +4602,29 @@ static zend_never_inline int ZEND_FASTCALL zend_quick_check_constant(
OPLINE = opline; \
ZEND_VM_CONTINUE()
# define ZEND_VM_SMART_BRANCH(_result, _check) do { \
- int __result; \
+ if ((_check) && UNEXPECTED(EG(exception))) { \
+ break; \
+ } \
if (EXPECTED((opline+1)->opcode == ZEND_JMPZ)) { \
- __result = (_result); \
+ if (_result) { \
+ ZEND_VM_SET_NEXT_OPCODE(opline + 2); \
+ } else { \
+ ZEND_VM_SET_OPCODE(OP_JMP_ADDR(opline + 1, (opline+1)->op2)); \
+ } \
} else if (EXPECTED((opline+1)->opcode == ZEND_JMPNZ)) { \
- __result = !(_result); \
+ if (!(_result)) { \
+ ZEND_VM_SET_NEXT_OPCODE(opline + 2); \
+ } else { \
+ ZEND_VM_SET_OPCODE(OP_JMP_ADDR(opline + 1, (opline+1)->op2)); \
+ } \
} else { \
break; \
} \
- if ((_check) && UNEXPECTED(EG(exception))) { \
- ZVAL_UNDEF(EX_VAR(opline->result.var)); \
- HANDLE_EXCEPTION(); \
- } \
- if (__result) { \
- ZEND_VM_SET_NEXT_OPCODE(opline + 2); \
- } else { \
- ZEND_VM_SET_OPCODE(OP_JMP_ADDR(opline + 1, (opline+1)->op2)); \
- } \
ZEND_VM_CONTINUE(); \
} while (0)
# define ZEND_VM_SMART_BRANCH_JMPZ(_result, _check) do { \
if ((_check) && UNEXPECTED(EG(exception))) { \
- ZVAL_UNDEF(EX_VAR(opline->result.var)); \
- HANDLE_EXCEPTION(); \
+ break; \
} \
if (_result) { \
ZEND_VM_SET_NEXT_OPCODE(opline + 2); \
@@ -3497,8 +4635,7 @@ static zend_never_inline int ZEND_FASTCALL zend_quick_check_constant(
} while (0)
# define ZEND_VM_SMART_BRANCH_JMPNZ(_result, _check) do { \
if ((_check) && UNEXPECTED(EG(exception))) { \
- ZVAL_UNDEF(EX_VAR(opline->result.var)); \
- HANDLE_EXCEPTION(); \
+ break; \
} \
if (!(_result)) { \
ZEND_VM_SET_NEXT_OPCODE(opline + 2); \
@@ -3507,12 +4644,48 @@ static zend_never_inline int ZEND_FASTCALL zend_quick_check_constant(
} \
ZEND_VM_CONTINUE(); \
} while (0)
+#define ZEND_VM_SMART_BRANCH_TRUE() do { \
+ if (EXPECTED((opline+1)->opcode == ZEND_JMPNZ)) { \
+ ZEND_VM_SET_OPCODE(OP_JMP_ADDR(opline + 1, (opline+1)->op2)); \
+ ZEND_VM_CONTINUE(); \
+ } else if (EXPECTED((opline+1)->opcode == ZEND_JMPZ)) { \
+ ZEND_VM_SET_NEXT_OPCODE(opline + 2); \
+ ZEND_VM_CONTINUE(); \
+ } \
+ } while (0)
+#define ZEND_VM_SMART_BRANCH_TRUE_JMPZ() do { \
+ ZEND_VM_SET_NEXT_OPCODE(opline + 2); \
+ ZEND_VM_CONTINUE(); \
+ } while (0)
+#define ZEND_VM_SMART_BRANCH_TRUE_JMPNZ() do { \
+ ZEND_VM_SET_OPCODE(OP_JMP_ADDR(opline + 1, (opline+1)->op2)); \
+ ZEND_VM_CONTINUE(); \
+ } while (0)
+#define ZEND_VM_SMART_BRANCH_FALSE() do { \
+ if (EXPECTED((opline+1)->opcode == ZEND_JMPNZ)) { \
+ ZEND_VM_SET_NEXT_OPCODE(opline + 2); \
+ ZEND_VM_CONTINUE(); \
+ } else if (EXPECTED((opline+1)->opcode == ZEND_JMPZ)) { \
+ ZEND_VM_SET_OPCODE(OP_JMP_ADDR(opline + 1, (opline+1)->op2)); \
+ ZEND_VM_CONTINUE(); \
+ } \
+ } while (0)
+#define ZEND_VM_SMART_BRANCH_FALSE_JMPZ() do { \
+ ZEND_VM_SET_OPCODE(OP_JMP_ADDR(opline + 1, (opline+1)->op2)); \
+ ZEND_VM_CONTINUE(); \
+ } while (0)
+#define ZEND_VM_SMART_BRANCH_FALSE_JMPNZ() do { \
+ ZEND_VM_SET_NEXT_OPCODE(opline + 2); \
+ ZEND_VM_CONTINUE(); \
+ } while (0)
#else
# define ZEND_VM_REPEATABLE_OPCODE
# define ZEND_VM_REPEAT_OPCODE(_opcode)
# define ZEND_VM_SMART_BRANCH(_result, _check)
# define ZEND_VM_SMART_BRANCH_JMPZ(_result, _check)
# define ZEND_VM_SMART_BRANCH_JMPNZ(_result, _check)
+# define ZEND_VM_SMART_BRANCH_TRUE()
+# define ZEND_VM_SMART_BRANCH_FALSE()
#endif
#ifdef __GNUC__
@@ -3521,29 +4694,14 @@ static zend_never_inline int ZEND_FASTCALL zend_quick_check_constant(
# define ZEND_VM_GUARD(name)
#endif
-#define GET_OP1_UNDEF_CV(ptr, type) \
- _get_zval_cv_lookup_ ## type(ptr, opline->op1.var EXECUTE_DATA_CC)
-#define GET_OP2_UNDEF_CV(ptr, type) \
- _get_zval_cv_lookup_ ## type(ptr, opline->op2.var EXECUTE_DATA_CC)
-
#define UNDEF_RESULT() do { \
if (opline->result_type & (IS_VAR | IS_TMP_VAR)) { \
ZVAL_UNDEF(EX_VAR(opline->result.var)); \
} \
} 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) {
@@ -3589,25 +4747,3 @@ ZEND_API zval *zend_get_zval_ptr(const zend_op *opline, int op_type, const znode
}
return ret;
}
-
-ZEND_API void ZEND_FASTCALL zend_check_internal_arg_type(zend_function *zf, uint32_t arg_num, zval *arg)
-{
- void *dummy_cache_slot = NULL;
-
- zend_verify_arg_type(zf, arg_num, arg, NULL, &dummy_cache_slot);
-}
-
-ZEND_API int ZEND_FASTCALL zend_check_arg_type(zend_function *zf, uint32_t arg_num, zval *arg, zval *default_value, void **cache_slot)
-{
- return zend_verify_arg_type(zf, arg_num, arg, default_value, cache_slot);
-}
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * indent-tabs-mode: t
- * End:
- * vim600: sw=4 ts=4 fdm=marker
- * vim<600: sw=4 ts=4
- */
diff --git a/Zend/zend_execute.h b/Zend/zend_execute.h
index af329194bc..cb100f55e9 100644
--- a/Zend/zend_execute.h
+++ b/Zend/zend_execute.h
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| Zend Engine |
+----------------------------------------------------------------------+
- | Copyright (c) 1998-2018 Zend Technologies Ltd. (http://www.zend.com) |
+ | Copyright (c) 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 |
@@ -41,7 +41,7 @@ ZEND_API void zend_execute(zend_op_array *op_array, zval *return_value);
ZEND_API void execute_ex(zend_execute_data *execute_data);
ZEND_API void execute_internal(zend_execute_data *execute_data, zval *return_value);
ZEND_API zend_class_entry *zend_lookup_class(zend_string *name);
-ZEND_API zend_class_entry *zend_lookup_class_ex(zend_string *name, const zval *key, int use_autoload);
+ZEND_API zend_class_entry *zend_lookup_class_ex(zend_string *name, zend_string *lcname, uint32_t flags);
ZEND_API zend_class_entry *zend_get_called_scope(zend_execute_data *ex);
ZEND_API zend_object *zend_get_this_object(zend_execute_data *ex);
ZEND_API int zend_eval_string(char *str, zval *retval_ptr, char *string_name);
@@ -52,11 +52,52 @@ ZEND_API int zend_eval_stringl_ex(char *str, size_t str_len, zval *retval_ptr, c
/* export zend_pass_function to allow comparisons against it */
extern ZEND_API const zend_internal_function zend_pass_function;
-ZEND_API void ZEND_FASTCALL zend_check_internal_arg_type(zend_function *zf, uint32_t arg_num, zval *arg);
-ZEND_API int ZEND_FASTCALL zend_check_arg_type(zend_function *zf, uint32_t arg_num, zval *arg, zval *default_value, void **cache_slot);
ZEND_API ZEND_COLD void ZEND_FASTCALL zend_missing_arg_error(zend_execute_data *execute_data);
-static zend_always_inline zval* zend_assign_to_variable(zval *variable_ptr, zval *value, zend_uchar value_type)
+ZEND_API zend_bool ZEND_FASTCALL zend_verify_ref_assignable_zval(zend_reference *ref, zval *zv, zend_bool strict);
+ZEND_API zend_bool ZEND_FASTCALL zend_verify_prop_assignable_by_ref(zend_property_info *prop_info, zval *orig_val, zend_bool strict);
+
+ZEND_API ZEND_COLD void zend_throw_ref_type_error_zval(zend_property_info *prop, zval *zv);
+ZEND_API ZEND_COLD void zend_throw_ref_type_error_type(zend_property_info *prop1, zend_property_info *prop2, zval *zv);
+
+#define ZEND_REF_TYPE_SOURCES(ref) \
+ (ref)->sources
+
+#define ZEND_REF_HAS_TYPE_SOURCES(ref) \
+ (ZEND_REF_TYPE_SOURCES(ref).ptr != NULL)
+
+#define ZEND_REF_FIRST_SOURCE(ref) \
+ (ZEND_PROPERTY_INFO_SOURCE_IS_LIST((ref)->sources.list) \
+ ? ZEND_PROPERTY_INFO_SOURCE_TO_LIST((ref)->sources.list)->ptr[0] \
+ : (ref)->sources.ptr)
+
+
+ZEND_API void ZEND_FASTCALL zend_ref_add_type_source(zend_property_info_source_list *source_list, zend_property_info *prop);
+ZEND_API void ZEND_FASTCALL zend_ref_del_type_source(zend_property_info_source_list *source_list, zend_property_info *prop);
+
+ZEND_API zval* zend_assign_to_typed_ref(zval *variable_ptr, zval *value, zend_uchar value_type, zend_bool strict, zend_refcounted *ref);
+
+static zend_always_inline void zend_copy_to_variable(zval *variable_ptr, zval *value, zend_uchar value_type, zend_refcounted *ref)
+{
+ ZVAL_COPY_VALUE(variable_ptr, value);
+ 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_DELREF(ref) == 0)) {
+ efree_size(ref, sizeof(zend_reference));
+ } else if (Z_OPT_REFCOUNTED_P(variable_ptr)) {
+ Z_ADDREF_P(variable_ptr);
+ }
+ }
+}
+
+static zend_always_inline zval* zend_assign_to_variable(zval *variable_ptr, zval *value, zend_uchar value_type, zend_bool strict)
{
zend_refcounted *ref = NULL;
@@ -70,6 +111,10 @@ static zend_always_inline zval* zend_assign_to_variable(zval *variable_ptr, zval
zend_refcounted *garbage;
if (Z_ISREF_P(variable_ptr)) {
+ if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(Z_REF_P(variable_ptr)))) {
+ return zend_assign_to_typed_ref(variable_ptr, value, value_type, strict, ref);
+ }
+
variable_ptr = Z_REFVAL_P(variable_ptr);
if (EXPECTED(!Z_REFCOUNTED_P(variable_ptr))) {
break;
@@ -80,64 +125,27 @@ static zend_always_inline zval* zend_assign_to_variable(zval *variable_ptr, zval
Z_OBJ_HANDLER_P(variable_ptr, set)(variable_ptr, value);
return variable_ptr;
}
- 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_DELREF(ref);
- }
- return variable_ptr;
- }
garbage = Z_COUNTED_P(variable_ptr);
+ zend_copy_to_variable(variable_ptr, value, value_type, ref);
if (GC_DELREF(garbage) == 0) {
- ZVAL_COPY_VALUE(variable_ptr, value);
- 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_DELREF(ref) == 0)) {
- efree_size(ref, sizeof(zend_reference));
- } else if (Z_OPT_REFCOUNTED_P(variable_ptr)) {
- Z_ADDREF_P(variable_ptr);
- }
- }
rc_dtor_func(garbage);
- return variable_ptr;
} else { /* we need to split */
/* optimized version of GC_ZVAL_CHECK_POSSIBLE_ROOT(variable_ptr) */
if (UNEXPECTED(GC_MAY_LEAK(garbage))) {
gc_possible_root(garbage);
}
}
+ return variable_ptr;
}
} while (0);
- ZVAL_COPY_VALUE(variable_ptr, value);
- 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_DELREF(ref) == 0)) {
- efree_size(ref, sizeof(zend_reference));
- } else if (Z_OPT_REFCOUNTED_P(variable_ptr)) {
- Z_ADDREF_P(variable_ptr);
- }
- }
+ zend_copy_to_variable(variable_ptr, value, value_type, ref);
return variable_ptr;
}
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);
+ZEND_API ZEND_COLD 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 {
@@ -172,20 +180,15 @@ 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);
-static zend_always_inline void zend_vm_init_call_frame(zend_execute_data *call, uint32_t call_info, zend_function *func, uint32_t num_args, zend_class_entry *called_scope, zend_object *object)
+static zend_always_inline void zend_vm_init_call_frame(zend_execute_data *call, uint32_t call_info, zend_function *func, uint32_t num_args, void *object_or_called_scope)
{
call->func = func;
- if (object) {
- Z_OBJ(call->This) = object;
- ZEND_SET_CALL_INFO(call, 1, call_info);
- } else {
- Z_CE(call->This) = called_scope;
- ZEND_SET_CALL_INFO(call, 0, call_info);
- }
+ Z_PTR(call->This) = object_or_called_scope;
+ ZEND_CALL_INFO(call) = call_info;
ZEND_CALL_NUM_ARGS(call) = num_args;
}
-static zend_always_inline zend_execute_data *zend_vm_stack_push_call_frame_ex(uint32_t used_stack, uint32_t call_info, zend_function *func, uint32_t num_args, zend_class_entry *called_scope, zend_object *object)
+static zend_always_inline zend_execute_data *zend_vm_stack_push_call_frame_ex(uint32_t used_stack, uint32_t call_info, zend_function *func, uint32_t num_args, void *object_or_called_scope)
{
zend_execute_data *call = (zend_execute_data*)EG(vm_stack_top);
@@ -194,11 +197,11 @@ static zend_always_inline zend_execute_data *zend_vm_stack_push_call_frame_ex(ui
if (UNEXPECTED(used_stack > (size_t)(((char*)EG(vm_stack_end)) - (char*)call))) {
call = (zend_execute_data*)zend_vm_stack_extend(used_stack);
ZEND_ASSERT_VM_STACK_GLOBAL;
- zend_vm_init_call_frame(call, call_info | ZEND_CALL_ALLOCATED, func, num_args, called_scope, object);
+ zend_vm_init_call_frame(call, call_info | ZEND_CALL_ALLOCATED, func, num_args, object_or_called_scope);
return call;
} else {
EG(vm_stack_top) = (zval*)((char*)call + used_stack);
- zend_vm_init_call_frame(call, call_info, func, num_args, called_scope, object);
+ zend_vm_init_call_frame(call, call_info, func, num_args, object_or_called_scope);
return call;
}
}
@@ -213,12 +216,12 @@ static zend_always_inline uint32_t zend_vm_calc_used_stack(uint32_t num_args, ze
return used_stack * sizeof(zval);
}
-static zend_always_inline zend_execute_data *zend_vm_stack_push_call_frame(uint32_t call_info, zend_function *func, uint32_t num_args, zend_class_entry *called_scope, zend_object *object)
+static zend_always_inline zend_execute_data *zend_vm_stack_push_call_frame(uint32_t call_info, zend_function *func, uint32_t num_args, void *object_or_called_scope)
{
uint32_t used_stack = zend_vm_calc_used_stack(num_args, func);
return zend_vm_stack_push_call_frame_ex(used_stack, call_info,
- func, num_args, called_scope, object);
+ func, num_args, object_or_called_scope);
}
static zend_always_inline void zend_vm_stack_free_extra_args_ex(uint32_t call_info, zend_execute_data *call)
@@ -302,13 +305,13 @@ ZEND_API zend_bool zend_is_executing(void);
ZEND_API void zend_set_timeout(zend_long seconds, int reset_signals);
ZEND_API void zend_unset_timeout(void);
-ZEND_API ZEND_NORETURN void zend_timeout(int dummy);
+ZEND_API ZEND_NORETURN void ZEND_FASTCALL zend_timeout(int dummy);
ZEND_API zend_class_entry *zend_fetch_class(zend_string *class_name, int fetch_type);
-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_class_entry *zend_fetch_class_by_name(zend_string *class_name, zend_string *lcname, int fetch_type);
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_FASTCALL zend_init_func_run_time_cache(zend_op_array *op_array);
ZEND_API void zend_fetch_dimension_const(zval *result, zval *container, zval *dim, int type);
@@ -334,25 +337,23 @@ ZEND_API void zend_clean_and_cache_symbol_table(zend_array *symbol_table);
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);
-
#define CACHE_ADDR(num) \
- ((void**)((char*)EX_RUN_TIME_CACHE() + (num)))
+ ((void**)((char*)EX(run_time_cache) + (num)))
#define CACHED_PTR(num) \
- ((void**)((char*)EX_RUN_TIME_CACHE() + (num)))[0]
+ ((void**)((char*)EX(run_time_cache) + (num)))[0]
#define CACHE_PTR(num, ptr) do { \
- ((void**)((char*)EX_RUN_TIME_CACHE() + (num)))[0] = (ptr); \
+ ((void**)((char*)EX(run_time_cache) + (num)))[0] = (ptr); \
} while (0)
#define CACHED_POLYMORPHIC_PTR(num, ce) \
- (EXPECTED(((void**)((char*)EX_RUN_TIME_CACHE() + (num)))[0] == (void*)(ce)) ? \
- ((void**)((char*)EX_RUN_TIME_CACHE() + (num)))[1] : \
+ (EXPECTED(((void**)((char*)EX(run_time_cache) + (num)))[0] == (void*)(ce)) ? \
+ ((void**)((char*)EX(run_time_cache) + (num)))[1] : \
NULL)
#define CACHE_POLYMORPHIC_PTR(num, ce, ptr) do { \
- void **slot = (void**)((char*)EX_RUN_TIME_CACHE() + (num)); \
+ void **slot = (void**)((char*)EX(run_time_cache) + (num)); \
slot[0] = (ce); \
slot[1] = (ptr); \
} while (0)
@@ -396,16 +397,39 @@ ZEND_API int ZEND_FASTCALL zend_do_fcall_overloaded(zend_execute_data *call, zva
} \
} while (0)
+#define ZEND_CLASS_HAS_TYPE_HINTS(ce) ((ce->ce_flags & ZEND_ACC_HAS_TYPE_HINTS) == ZEND_ACC_HAS_TYPE_HINTS)
+
+zend_bool zend_verify_property_type(zend_property_info *info, zval *property, zend_bool strict);
+ZEND_COLD void zend_verify_property_type_error(zend_property_info *info, zval *property);
+
+#define ZEND_REF_ADD_TYPE_SOURCE(ref, source) \
+ zend_ref_add_type_source(&ZEND_REF_TYPE_SOURCES(ref), source)
+
+#define ZEND_REF_DEL_TYPE_SOURCE(ref, source) \
+ zend_ref_del_type_source(&ZEND_REF_TYPE_SOURCES(ref), source)
+
+#define ZEND_REF_FOREACH_TYPE_SOURCES(ref, prop) do { \
+ zend_property_info_source_list *_source_list = &ZEND_REF_TYPE_SOURCES(ref); \
+ zend_property_info **_prop, **_end; \
+ zend_property_info_list *_list; \
+ if (_source_list->ptr) { \
+ if (ZEND_PROPERTY_INFO_SOURCE_IS_LIST(_source_list->list)) { \
+ _list = ZEND_PROPERTY_INFO_SOURCE_TO_LIST(_source_list->list); \
+ _prop = _list->ptr; \
+ _end = _list->ptr + _list->num; \
+ } else { \
+ _prop = &_source_list->ptr; \
+ _end = _prop + 1; \
+ } \
+ for (; _prop < _end; _prop++) { \
+ prop = *_prop; \
+
+#define ZEND_REF_FOREACH_TYPE_SOURCES_END() \
+ } \
+ } \
+ } while (0)
+
+
END_EXTERN_C()
#endif /* ZEND_EXECUTE_H */
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * indent-tabs-mode: t
- * End:
- * vim600: sw=4 ts=4 fdm=marker
- * vim<600: sw=4 ts=4
- */
diff --git a/Zend/zend_execute_API.c b/Zend/zend_execute_API.c
index 6eb9dfacee..f2881f7054 100644
--- a/Zend/zend_execute_API.c
+++ b/Zend/zend_execute_API.c
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| Zend Engine |
+----------------------------------------------------------------------+
- | Copyright (c) 1998-2018 Zend Technologies Ltd. (http://www.zend.com) |
+ | Copyright (c) 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 |
@@ -33,6 +33,8 @@
#include "zend_generators.h"
#include "zend_vm.h"
#include "zend_float.h"
+#include "zend_weakrefs.h"
+#include "zend_inheritance.h"
#ifdef HAVE_SYS_TIME_H
#include <sys/time.h>
#endif
@@ -130,8 +132,8 @@ void init_executor(void) /* {{{ */
original_sigsegv_handler = signal(SIGSEGV, zend_handle_sigsegv);
#endif
- EG(symtable_cache_ptr) = EG(symtable_cache) - 1;
- EG(symtable_cache_limit) = EG(symtable_cache) + SYMTABLE_CACHE_SIZE - 1;
+ EG(symtable_cache_ptr) = EG(symtable_cache);
+ EG(symtable_cache_limit) = EG(symtable_cache) + SYMTABLE_CACHE_SIZE;
EG(no_extensions) = 0;
EG(function_table) = CG(function_table);
@@ -171,6 +173,7 @@ void init_executor(void) /* {{{ */
EG(prev_exception) = NULL;
EG(fake_scope) = NULL;
+ EG(trampoline).common.function_name = NULL;
EG(ht_iterators_count) = sizeof(EG(ht_iterators_slots)) / sizeof(HashTableIterator);
EG(ht_iterators_used) = 0;
@@ -183,6 +186,8 @@ void init_executor(void) /* {{{ */
EG(persistent_functions_count) = EG(function_table)->nNumUsed;
EG(persistent_classes_count) = EG(class_table)->nNumUsed;
+ zend_weakrefs_init();
+
EG(active) = 1;
}
/* }}} */
@@ -205,11 +210,11 @@ static void zend_unclean_zval_ptr_dtor(zval *zv) /* {{{ */
if (Z_TYPE_P(zv) == IS_INDIRECT) {
zv = Z_INDIRECT_P(zv);
}
- i_zval_ptr_dtor(zv ZEND_FILE_LINE_CC);
+ i_zval_ptr_dtor(zv);
}
/* }}} */
-static void zend_throw_or_error(int fetch_type, zend_class_entry *exception_ce, const char *format, ...) /* {{{ */
+static ZEND_COLD void zend_throw_or_error(int fetch_type, zend_class_entry *exception_ce, const char *format, ...) /* {{{ */
{
va_list va;
char *message = NULL;
@@ -261,41 +266,58 @@ void shutdown_executor(void) /* {{{ */
zend_llist_destroy(&CG(open_files));
} zend_end_try();
+ EG(flags) |= EG_FLAGS_IN_RESOURCE_SHUTDOWN;
zend_try {
zend_close_rsrc_list(&EG(regular_list));
} zend_end_try();
- zend_objects_store_free_object_storage(&EG(objects_store), fast_shutdown);
-
- /* All resources and objects are destroyed. */
- /* No PHP callback functions may be called after this point. */
+ /* No PHP callback functions should be called after this point. */
EG(active) = 0;
- zend_try {
- zend_llist_apply(&zend_extensions, (llist_apply_func_t) zend_extension_deactivator);
- } zend_end_try();
-
- if (fast_shutdown) {
- /* Fast Request Shutdown
- * =====================
- * Zend Memory Manager frees memory by its own. We don't have to free
- * each allocated block separately.
- */
- 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 {
+ if (!fast_shutdown) {
zend_hash_graceful_reverse_destroy(&EG(symbol_table));
-#if ZEND_DEBUG
- if (gc_enabled() && !CG(unclean_shutdown)) {
- gc_collect_cycles();
- }
-#endif
+ /* Release static properties and static variables prior to the final GC run,
+ * as they may hold GC roots. */
+ ZEND_HASH_REVERSE_FOREACH_VAL(EG(function_table), zv) {
+ zend_op_array *op_array = Z_PTR_P(zv);
+ if (op_array->type == ZEND_INTERNAL_FUNCTION) {
+ break;
+ }
+ if (op_array->static_variables) {
+ HashTable *ht = ZEND_MAP_PTR_GET(op_array->static_variables_ptr);
+ if (ht) {
+ if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE) && GC_DELREF(ht) == 0) {
+ zend_array_destroy(ht);
+ }
+ ZEND_MAP_PTR_SET(op_array->static_variables_ptr, NULL);
+ }
+ }
+ } ZEND_HASH_FOREACH_END();
+ ZEND_HASH_REVERSE_FOREACH_VAL(EG(class_table), zv) {
+ zend_class_entry *ce = Z_PTR_P(zv);
+ if (ce->default_static_members_count) {
+ zend_cleanup_internal_class_data(ce);
+ }
+ if (ce->ce_flags & ZEND_HAS_STATIC_IN_METHODS) {
+ zend_op_array *op_array;
+ ZEND_HASH_FOREACH_PTR(&ce->function_table, op_array) {
+ if (op_array->type == ZEND_USER_FUNCTION) {
+ if (op_array->static_variables) {
+ HashTable *ht = ZEND_MAP_PTR_GET(op_array->static_variables_ptr);
+ if (ht) {
+ if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE) && GC_DELREF(ht) == 0) {
+ zend_array_destroy(ht);
+ }
+ ZEND_MAP_PTR_SET(op_array->static_variables_ptr, NULL);
+ }
+ }
+ }
+ } ZEND_HASH_FOREACH_END();
+ }
+ } ZEND_HASH_FOREACH_END();
- /* remove error handlers before destroying classes and functions,
- * so that if handler used some class, crash would not happen */
+ /* Also release error and exception handlers, which may hold objects. */
if (Z_TYPE(EG(user_error_handler)) != IS_UNDEF) {
zval_ptr_dtor(&EG(user_error_handler));
ZVAL_UNDEF(&EG(user_error_handler));
@@ -310,6 +332,32 @@ void shutdown_executor(void) /* {{{ */
zend_stack_clean(&EG(user_error_handlers), (void (*)(void *))ZVAL_PTR_DTOR, 1);
zend_stack_clean(&EG(user_exception_handlers), (void (*)(void *))ZVAL_PTR_DTOR, 1);
+#if ZEND_DEBUG
+ if (gc_enabled() && !CG(unclean_shutdown)) {
+ gc_collect_cycles();
+ }
+#endif
+ }
+
+ zend_objects_store_free_object_storage(&EG(objects_store), fast_shutdown);
+
+ zend_weakrefs_shutdown();
+
+ zend_try {
+ zend_llist_apply(&zend_extensions, (llist_apply_func_t) zend_extension_deactivator);
+ } zend_end_try();
+
+ if (fast_shutdown) {
+ /* Fast Request Shutdown
+ * =====================
+ * Zend Memory Manager frees memory by its own. We don't have to free
+ * each allocated block separately.
+ */
+ 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_vm_stack_destroy();
if (EG(full_tables_cleanup)) {
@@ -319,7 +367,7 @@ 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 (ZEND_CONSTANT_FLAGS(c) & CONST_PERSISTENT) {
+ if (_idx == EG(persistent_constants_count)) {
break;
}
zval_ptr_dtor_nogc(&c->value);
@@ -329,17 +377,18 @@ void shutdown_executor(void) /* {{{ */
efree(c);
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);
- if (func->type == ZEND_INTERNAL_FUNCTION) {
+ if (_idx == EG(persistent_functions_count)) {
break;
}
destroy_op_array(&func->op_array);
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);
- if (ce->type == ZEND_INTERNAL_CLASS) {
+ if (_idx == EG(persistent_classes_count)) {
break;
}
destroy_zend_class(zv);
@@ -347,12 +396,10 @@ void shutdown_executor(void) /* {{{ */
} ZEND_HASH_FOREACH_END_DEL();
}
- zend_cleanup_internal_classes();
-
- while (EG(symtable_cache_ptr)>=EG(symtable_cache)) {
+ while (EG(symtable_cache_ptr) > EG(symtable_cache)) {
+ EG(symtable_cache_ptr)--;
zend_hash_destroy(*EG(symtable_cache_ptr));
FREE_HASHTABLE(*EG(symtable_cache_ptr));
- EG(symtable_cache_ptr)--;
}
zend_hash_destroy(&EG(included_files));
@@ -514,7 +561,7 @@ ZEND_API zend_bool zend_is_executing(void) /* {{{ */
}
/* }}} */
-ZEND_API int zend_use_undefined_constant(zend_string *name, zend_ast_attr attr, zval *result) /* {{{ */
+ZEND_API ZEND_COLD int zend_use_undefined_constant(zend_string *name, zend_ast_attr attr, zval *result) /* {{{ */
{
char *colon;
@@ -605,6 +652,8 @@ int zend_call_function(zend_fcall_info *fci, zend_fcall_info_cache *fci_cache) /
zend_execute_data *call, dummy_execute_data;
zend_fcall_info_cache fci_cache_local;
zend_function *func;
+ uint32_t call_info;
+ void *object_or_called_scope;
ZVAL_UNDEF(fci->retval);
@@ -677,11 +726,18 @@ int zend_call_function(zend_fcall_info *fci, zend_fcall_info_cache *fci_cache) /
}
func = fci_cache->function_handler;
- fci->object = (func->common.fn_flags & ZEND_ACC_STATIC) ?
- NULL : fci_cache->object;
+ if ((func->common.fn_flags & ZEND_ACC_STATIC) || !fci_cache->object) {
+ fci->object = NULL;
+ object_or_called_scope = fci_cache->called_scope;
+ call_info = ZEND_CALL_TOP_FUNCTION | ZEND_CALL_DYNAMIC;
+ } else {
+ fci->object = fci_cache->object;
+ object_or_called_scope = fci->object;
+ call_info = ZEND_CALL_TOP_FUNCTION | ZEND_CALL_DYNAMIC | ZEND_CALL_HAS_THIS;
+ }
- call = zend_vm_stack_push_call_frame(ZEND_CALL_TOP_FUNCTION | ZEND_CALL_DYNAMIC,
- func, fci->param_count, fci_cache->called_scope, fci->object);
+ call = zend_vm_stack_push_call_frame(call_info,
+ func, fci->param_count, object_or_called_scope);
if (UNEXPECTED(func->common.fn_flags & ZEND_ACC_DEPRECATED)) {
zend_error(E_DEPRECATED, "Function %s%s%s() is deprecated",
@@ -692,6 +748,7 @@ int zend_call_function(zend_fcall_info *fci, zend_fcall_info_cache *fci_cache) /
zend_vm_stack_free_call_frame(call);
if (EG(current_execute_data) == &dummy_execute_data) {
EG(current_execute_data) = dummy_execute_data.prev_execute_data;
+ zend_rethrow_exception(EG(current_execute_data));
}
return FAILURE;
}
@@ -763,7 +820,6 @@ int zend_call_function(zend_fcall_info *fci, zend_fcall_info_cache *fci_cache) /
int call_via_handler = (func->common.fn_flags & ZEND_ACC_CALL_VIA_TRAMPOLINE) != 0;
ZVAL_NULL(fci->retval);
call->prev_execute_data = EG(current_execute_data);
- call->return_value = NULL; /* this is not a constructor call */
EG(current_execute_data) = call;
if (EXPECTED(zend_execute_internal == NULL)) {
/* saves one function call if zend_execute_internal is not used */
@@ -828,7 +884,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_API zend_class_entry *zend_lookup_class_ex(zend_string *name, zend_string *key, uint32_t flags) /* {{{ */
{
zend_class_entry *ce = NULL;
zval args[1], *zv;
@@ -839,7 +895,7 @@ ZEND_API zend_class_entry *zend_lookup_class_ex(zend_string *name, const zval *k
zend_class_entry *orig_fake_scope;
if (key) {
- lc_name = Z_STR_P(key);
+ lc_name = key;
} else {
if (name == NULL || !ZSTR_LEN(name)) {
return NULL;
@@ -858,13 +914,23 @@ ZEND_API zend_class_entry *zend_lookup_class_ex(zend_string *name, const zval *k
if (!key) {
zend_string_release_ex(lc_name, 0);
}
- return (zend_class_entry*)Z_PTR_P(zv);
+ ce = (zend_class_entry*)Z_PTR_P(zv);
+ if (UNEXPECTED(!(ce->ce_flags & ZEND_ACC_LINKED))) {
+ if ((flags & ZEND_FETCH_CLASS_ALLOW_UNLINKED) ||
+ ((flags & ZEND_FETCH_CLASS_ALLOW_NEARLY_LINKED) &&
+ (ce->ce_flags & ZEND_ACC_NEARLY_LINKED))) {
+ ce->ce_flags |= ZEND_ACC_HAS_UNLINKED_USES;
+ return ce;
+ }
+ return NULL;
+ }
+ return ce;
}
/* The compiler is not-reentrant. Make sure we __autoload() only during run-time
* (doesn't impact functionality of __autoload()
*/
- if (!use_autoload || zend_is_compiling()) {
+ if ((flags & ZEND_FETCH_CLASS_NO_AUTOLOAD) || zend_is_compiling()) {
if (!key) {
zend_string_release_ex(lc_name, 0);
}
@@ -948,7 +1014,7 @@ ZEND_API zend_class_entry *zend_lookup_class_ex(zend_string *name, const zval *k
ZEND_API zend_class_entry *zend_lookup_class(zend_string *name) /* {{{ */
{
- return zend_lookup_class_ex(name, NULL, 1);
+ return zend_lookup_class_ex(name, NULL, 0);
}
/* }}} */
@@ -1077,7 +1143,7 @@ ZEND_API int zend_eval_string_ex(char *str, zval *retval_ptr, char *string_name,
static void zend_set_timeout_ex(zend_long seconds, int reset_signals);
-ZEND_API ZEND_NORETURN void zend_timeout(int dummy) /* {{{ */
+ZEND_API ZEND_NORETURN void ZEND_FASTCALL zend_timeout(int dummy) /* {{{ */
{
#if defined(PHP_WIN32)
# ifndef ZTS
@@ -1130,7 +1196,7 @@ static void zend_timeout_handler(int dummy) /* {{{ */
output_len = snprintf(log_buffer, sizeof(log_buffer), "\nFatal error: Maximum execution time of " ZEND_LONG_FMT "+" ZEND_LONG_FMT " seconds exceeded (terminated) in %s on line %d\n", EG(timeout_seconds), EG(hard_timeout), error_filename, error_lineno);
if (output_len > 0) {
- write(2, log_buffer, MIN(output_len, sizeof(log_buffer)));
+ zend_quiet_write(2, log_buffer, MIN(output_len, sizeof(log_buffer)));
}
_exit(124);
}
@@ -1197,7 +1263,7 @@ static void zend_set_timeout_ex(zend_long seconds, int reset_signals) /* {{{ */
timer, so we could end up with just an ignored timeout. Instead
delete and recreate. */
if (NULL != tq_timer) {
- if (!DeleteTimerQueueTimer(NULL, tq_timer, NULL)) {
+ if (!DeleteTimerQueueTimer(NULL, tq_timer, INVALID_HANDLE_VALUE)) {
tq_timer = NULL;
zend_error_noreturn(E_ERROR, "Could not delete queued timer");
return;
@@ -1212,8 +1278,7 @@ static void zend_set_timeout_ex(zend_long seconds, int reset_signals) /* {{{ */
zend_error_noreturn(E_ERROR, "Could not queue new timer");
return;
}
-#else
-# ifdef HAVE_SETITIMER
+#elif defined(HAVE_SETITIMER)
{
struct itimerval t_r; /* timeout requested */
int signo;
@@ -1222,39 +1287,38 @@ static void zend_set_timeout_ex(zend_long seconds, int reset_signals) /* {{{ */
t_r.it_value.tv_sec = seconds;
t_r.it_value.tv_usec = t_r.it_interval.tv_sec = t_r.it_interval.tv_usec = 0;
-# ifdef __CYGWIN__
+# ifdef __CYGWIN__
setitimer(ITIMER_REAL, &t_r, NULL);
}
signo = SIGALRM;
-# else
+# else
setitimer(ITIMER_PROF, &t_r, NULL);
}
signo = SIGPROF;
-# endif
+# endif
if (reset_signals) {
-# ifdef ZEND_SIGNALS
+# ifdef ZEND_SIGNALS
zend_signal(signo, zend_timeout_handler);
-# else
+# else
sigset_t sigset;
-# ifdef HAVE_SIGACTION
+# ifdef HAVE_SIGACTION
struct sigaction act;
act.sa_handler = zend_timeout_handler;
sigemptyset(&act.sa_mask);
act.sa_flags = SA_RESETHAND | SA_NODEFER;
sigaction(signo, &act, NULL);
-# else
+# else
signal(signo, zend_timeout_handler);
-# endif /* HAVE_SIGACTION */
+# endif /* HAVE_SIGACTION */
sigemptyset(&sigset);
sigaddset(&sigset, signo);
sigprocmask(SIG_UNBLOCK, &sigset, NULL);
-# endif /* ZEND_SIGNALS */
+# endif /* ZEND_SIGNALS */
}
}
-# endif /* HAVE_SETITIMER */
-#endif
+#endif /* HAVE_SETITIMER */
}
/* }}} */
@@ -1271,7 +1335,7 @@ void zend_unset_timeout(void) /* {{{ */
{
#ifdef ZEND_WIN32
if (NULL != tq_timer) {
- if (!DeleteTimerQueueTimer(NULL, tq_timer, NULL)) {
+ if (!DeleteTimerQueueTimer(NULL, tq_timer, INVALID_HANDLE_VALUE)) {
EG(timed_out) = 0;
tq_timer = NULL;
zend_error_noreturn(E_ERROR, "Could not delete queued timer");
@@ -1279,23 +1343,20 @@ void zend_unset_timeout(void) /* {{{ */
}
tq_timer = NULL;
}
- EG(timed_out) = 0;
-#else
-# ifdef HAVE_SETITIMER
+#elif defined(HAVE_SETITIMER)
if (EG(timeout_seconds)) {
struct itimerval no_timeout;
no_timeout.it_value.tv_sec = no_timeout.it_value.tv_usec = no_timeout.it_interval.tv_sec = no_timeout.it_interval.tv_usec = 0;
-#ifdef __CYGWIN__
+# ifdef __CYGWIN__
setitimer(ITIMER_REAL, &no_timeout, NULL);
-#else
+# else
setitimer(ITIMER_PROF, &no_timeout, NULL);
-#endif
+# endif
}
-# endif
- EG(timed_out) = 0;
#endif
+ EG(timed_out) = 0;
}
/* }}} */
@@ -1339,8 +1400,8 @@ check_fetch_type:
}
if (fetch_type & ZEND_FETCH_CLASS_NO_AUTOLOAD) {
- return zend_lookup_class_ex(class_name, NULL, 0);
- } else if ((ce = zend_lookup_class_ex(class_name, NULL, 1)) == NULL) {
+ return zend_lookup_class_ex(class_name, NULL, fetch_type);
+ } else if ((ce = zend_lookup_class_ex(class_name, NULL, fetch_type)) == NULL) {
if (!(fetch_type & ZEND_FETCH_CLASS_SILENT) && !EG(exception)) {
if (fetch_sub_type == ZEND_FETCH_CLASS_INTERFACE) {
zend_throw_or_error(fetch_type, NULL, "Interface '%s' not found", ZSTR_VAL(class_name));
@@ -1356,84 +1417,39 @@ check_fetch_type:
}
/* }}} */
-zend_class_entry *zend_fetch_class_by_name(zend_string *class_name, const zval *key, int fetch_type) /* {{{ */
+zend_class_entry *zend_fetch_class_by_name(zend_string *class_name, zend_string *key, int fetch_type) /* {{{ */
{
zend_class_entry *ce;
if (fetch_type & ZEND_FETCH_CLASS_NO_AUTOLOAD) {
- return zend_lookup_class_ex(class_name, key, 0);
- } else if ((ce = zend_lookup_class_ex(class_name, key, 1)) == NULL) {
- if ((fetch_type & ZEND_FETCH_CLASS_SILENT) == 0 && !EG(exception)) {
- if ((fetch_type & ZEND_FETCH_CLASS_MASK) == ZEND_FETCH_CLASS_INTERFACE) {
- zend_throw_or_error(fetch_type, NULL, "Interface '%s' not found", ZSTR_VAL(class_name));
- } else if ((fetch_type & ZEND_FETCH_CLASS_MASK) == ZEND_FETCH_CLASS_TRAIT) {
- zend_throw_or_error(fetch_type, NULL, "Trait '%s' not found", ZSTR_VAL(class_name));
- } else {
- zend_throw_or_error(fetch_type, NULL, "Class '%s' not found", ZSTR_VAL(class_name));
- }
- }
- return NULL;
- }
- return ce;
-}
-/* }}} */
-
-#define MAX_ABSTRACT_INFO_CNT 3
-#define MAX_ABSTRACT_INFO_FMT "%s%s%s%s"
-#define DISPLAY_ABSTRACT_FN(idx) \
- ai.afn[idx] ? ZEND_FN_SCOPE_NAME(ai.afn[idx]) : "", \
- ai.afn[idx] ? "::" : "", \
- ai.afn[idx] ? ZSTR_VAL(ai.afn[idx]->common.function_name) : "", \
- ai.afn[idx] && ai.afn[idx + 1] ? ", " : (ai.afn[idx] && ai.cnt > MAX_ABSTRACT_INFO_CNT ? ", ..." : "")
-
-typedef struct _zend_abstract_info {
- zend_function *afn[MAX_ABSTRACT_INFO_CNT + 1];
- int cnt;
- int ctor;
-} zend_abstract_info;
-
-static void zend_verify_abstract_class_function(zend_function *fn, zend_abstract_info *ai) /* {{{ */
-{
- if (fn->common.fn_flags & ZEND_ACC_ABSTRACT) {
- if (ai->cnt < MAX_ABSTRACT_INFO_CNT) {
- ai->afn[ai->cnt] = fn;
+ return zend_lookup_class_ex(class_name, key, fetch_type);
+ } else if ((ce = zend_lookup_class_ex(class_name, key, fetch_type)) == NULL) {
+ if (fetch_type & ZEND_FETCH_CLASS_SILENT) {
+ return NULL;
}
- if (fn->common.fn_flags & ZEND_ACC_CTOR) {
- if (!ai->ctor) {
- ai->cnt++;
- ai->ctor = 1;
- } else {
- ai->afn[ai->cnt] = NULL;
+ if (EG(exception)) {
+ if (!(fetch_type & ZEND_FETCH_CLASS_EXCEPTION)) {
+ zend_string *exception_str;
+ zval exception_zv;
+ ZVAL_OBJ(&exception_zv, EG(exception));
+ Z_ADDREF(exception_zv);
+ zend_clear_exception();
+ exception_str = zval_get_string(&exception_zv);
+ zend_error_noreturn(E_ERROR,
+ "During class fetch: Uncaught %s", ZSTR_VAL(exception_str));
}
- } else {
- ai->cnt++;
+ return NULL;
}
- }
-}
-/* }}} */
-
-void zend_verify_abstract_class(zend_class_entry *ce) /* {{{ */
-{
- zend_function *func;
- zend_abstract_info ai;
-
- if ((ce->ce_flags & ZEND_ACC_IMPLICIT_ABSTRACT_CLASS) && !(ce->ce_flags & (ZEND_ACC_TRAIT | ZEND_ACC_EXPLICIT_ABSTRACT_CLASS))) {
- memset(&ai, 0, sizeof(ai));
-
- ZEND_HASH_FOREACH_PTR(&ce->function_table, func) {
- zend_verify_abstract_class_function(func, &ai);
- } ZEND_HASH_FOREACH_END();
-
- if (ai.cnt) {
- zend_error_noreturn(E_ERROR, "Class %s contains %d abstract method%s and must therefore be declared abstract or implement the remaining methods (" MAX_ABSTRACT_INFO_FMT MAX_ABSTRACT_INFO_FMT MAX_ABSTRACT_INFO_FMT ")",
- ZSTR_VAL(ce->name), ai.cnt,
- ai.cnt > 1 ? "s" : "",
- DISPLAY_ABSTRACT_FN(0),
- DISPLAY_ABSTRACT_FN(1),
- DISPLAY_ABSTRACT_FN(2)
- );
+ if ((fetch_type & ZEND_FETCH_CLASS_MASK) == ZEND_FETCH_CLASS_INTERFACE) {
+ zend_throw_or_error(fetch_type, NULL, "Interface '%s' not found", ZSTR_VAL(class_name));
+ } else if ((fetch_type & ZEND_FETCH_CLASS_MASK) == ZEND_FETCH_CLASS_TRAIT) {
+ zend_throw_or_error(fetch_type, NULL, "Trait '%s' not found", ZSTR_VAL(class_name));
+ } else {
+ zend_throw_or_error(fetch_type, NULL, "Class '%s' not found", ZSTR_VAL(class_name));
}
+ return NULL;
}
+ return ce;
}
/* }}} */
@@ -1461,9 +1477,8 @@ ZEND_API zend_array *zend_rebuild_symbol_table(void) /* {{{ */
}
ZEND_ADD_CALL_FLAG(ex, ZEND_CALL_HAS_SYMBOL_TABLE);
- if (EG(symtable_cache_ptr) >= EG(symtable_cache)) {
- /*printf("Cache hit! Reusing %x\n", symtable_cache[symtable_cache_ptr]);*/
- symbol_table = ex->symbol_table = *(EG(symtable_cache_ptr)--);
+ if (EG(symtable_cache_ptr) > EG(symtable_cache)) {
+ symbol_table = ex->symbol_table = *(--EG(symtable_cache_ptr));
if (!ex->func->op_array.last_var) {
return symbol_table;
}
@@ -1637,27 +1652,3 @@ ZEND_API int zend_set_local_var_str(const char *name, size_t len, zval *value, i
return FAILURE;
}
/* }}} */
-
-ZEND_API int zend_forbid_dynamic_call(const char *func_name) /* {{{ */
-{
- zend_execute_data *ex = EG(current_execute_data);
- ZEND_ASSERT(ex != NULL && ex->func != NULL);
-
- if (ZEND_CALL_INFO(ex) & ZEND_CALL_DYNAMIC) {
- zend_error(E_WARNING, "Cannot call %s dynamically", func_name);
- return FAILURE;
- }
-
- return SUCCESS;
-}
-/* }}} */
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * indent-tabs-mode: t
- * End:
- * vim600: sw=4 ts=4 fdm=marker
- * vim<600: sw=4 ts=4
- */
diff --git a/Zend/zend_extensions.c b/Zend/zend_extensions.c
index b08cef4326..2509daf318 100644
--- a/Zend/zend_extensions.c
+++ b/Zend/zend_extensions.c
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| Zend Engine |
+----------------------------------------------------------------------+
- | Copyright (c) 1998-2018 Zend Technologies Ltd. (http://www.zend.com) |
+ | Copyright (c) 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 |
@@ -21,6 +21,7 @@
ZEND_API zend_llist zend_extensions;
ZEND_API uint32_t zend_extension_flags = 0;
+ZEND_API int zend_op_array_extension_handles = 0;
static int last_resource_number;
int zend_load_extension(const char *path)
@@ -198,6 +199,7 @@ int zend_startup_extensions_mechanism()
{
/* Startup extensions mechanism */
zend_llist_init(&zend_extensions, sizeof(zend_extension), (void (*)(void *)) zend_extension_dtor, 1);
+ zend_op_array_extension_handles = 0;
last_resource_number = 0;
return SUCCESS;
}
@@ -257,6 +259,10 @@ ZEND_API int zend_get_resource_handle(zend_extension *extension)
}
}
+ZEND_API int zend_get_op_array_extension_handle(void)
+{
+ return zend_op_array_extension_handles++;
+}
ZEND_API zend_extension *zend_get_extension(const char *extension_name)
{
@@ -323,13 +329,3 @@ ZEND_API size_t zend_extensions_op_array_persist(zend_op_array *op_array, void *
}
return 0;
}
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * indent-tabs-mode: t
- * End:
- * vim600: sw=4 ts=4 fdm=marker
- * vim<600: sw=4 ts=4
- */
diff --git a/Zend/zend_extensions.h b/Zend/zend_extensions.h
index 9e0e826e08..19cbf557c5 100644
--- a/Zend/zend_extensions.h
+++ b/Zend/zend_extensions.h
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| Zend Engine |
+----------------------------------------------------------------------+
- | Copyright (c) 1998-2018 Zend Technologies Ltd. (http://www.zend.com) |
+ | Copyright (c) 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 |
@@ -44,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 320180731
+#define ZEND_EXTENSION_API_NO 320190902
typedef struct _zend_extension_version_info {
int zend_extension_api_no;
@@ -111,7 +111,10 @@ struct _zend_extension {
};
BEGIN_EXTERN_C()
+extern ZEND_API int zend_op_array_extension_handles;
+
ZEND_API int zend_get_resource_handle(zend_extension *extension);
+ZEND_API int zend_get_op_array_extension_handle(void);
ZEND_API void zend_extension_dispatch_message(int message, void *arg);
END_EXTERN_C()
@@ -151,13 +154,3 @@ ZEND_API size_t zend_extensions_op_array_persist(zend_op_array *op_array, void *
END_EXTERN_C()
#endif /* ZEND_EXTENSIONS_H */
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * indent-tabs-mode: t
- * End:
- * vim600: sw=4 ts=4 fdm=marker
- * vim<600: sw=4 ts=4
- */
diff --git a/Zend/zend_float.c b/Zend/zend_float.c
index 649a61c270..90af0c4a5f 100644
--- a/Zend/zend_float.c
+++ b/Zend/zend_float.c
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| Zend Engine |
+----------------------------------------------------------------------+
- | Copyright (c) 1998-2018 Zend Technologies Ltd. (http://www.zend.com) |
+ | Copyright (c) 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 |
@@ -54,13 +54,3 @@ ZEND_API void zend_ensure_fpu_mode(void) /* {{{ */
XPFPA_SWITCH_DOUBLE();
}
/* }}} */
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * indent-tabs-mode: t
- * End:
- * vim600: sw=4 ts=4 fdm=marker
- * vim<600: sw=4 ts=4
- */
diff --git a/Zend/zend_float.h b/Zend/zend_float.h
index 44c7ff93b8..c8e91122a3 100644
--- a/Zend/zend_float.h
+++ b/Zend/zend_float.h
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| Zend Engine |
+----------------------------------------------------------------------+
- | Copyright (c) 1998-2018 Zend Technologies Ltd. (http://www.zend.com) |
+ | Copyright (c) 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 |
@@ -55,10 +55,9 @@ END_EXTERN_C()
Implementation notes:
x86_64:
- - Since all x86_64 compilers use SSE by default, it is probably unnecessary
- to use these macros there. We define them anyway since we are too lazy
- to differentiate the architecture. Also, the compiler option -mfpmath=i387
- justifies this decision.
+ - Since all x86_64 compilers use SSE by default, we do not define these
+ macros there. We ignore the compiler option -mfpmath=i387, because there is
+ no reason to use it on x86_64.
General:
- It would be nice if one could detect whether SSE if used for math via some
@@ -66,10 +65,8 @@ END_EXTERN_C()
on how to do that?
MS Visual C:
- - Since MSVC users tipically don't use autoconf or CMake, we will detect
- MSVC via compile time define. Floating point precision change isn't
- supported on 64 bit platforms, so it's NOP. See
- http://msdn.microsoft.com/en-us/library/c9676k6h(v=vs.110).aspx
+ - Since MSVC users typically don't use autoconf or CMake, we will detect
+ MSVC via compile time define.
*/
/* MSVC detection (MSVC people usually don't use autoconf) */
@@ -77,7 +74,7 @@ END_EXTERN_C()
# define HAVE__CONTROLFP_S
#endif /* _MSC_VER */
-#ifdef HAVE__CONTROLFP_S
+#if defined(HAVE__CONTROLFP_S) && !defined(__x86_64__)
/* float.h defines _controlfp_s */
# include <float.h>
@@ -141,7 +138,7 @@ END_EXTERN_C()
return _xpfpa_result; \
} while (0)
-#elif defined(HAVE__CONTROLFP)
+#elif defined(HAVE__CONTROLFP) && !defined(__x86_64__)
/* float.h defines _controlfp */
# include <float.h>
@@ -200,7 +197,7 @@ END_EXTERN_C()
return _xpfpa_result; \
} while (0)
-#elif defined(HAVE__FPU_SETCW) /* glibc systems */
+#elif defined(HAVE__FPU_SETCW) && !defined(__x86_64__) /* glibc systems */
/* fpu_control.h defines _FPU_[GS]ETCW */
# include <fpu_control.h>
@@ -259,7 +256,7 @@ END_EXTERN_C()
return _xpfpa_result; \
} while (0)
-#elif defined(HAVE_FPSETPREC) /* FreeBSD */
+#elif defined(HAVE_FPSETPREC) && !defined(__x86_64__) /* FreeBSD */
/* fpu_control.h defines _FPU_[GS]ETCW */
# include <machine/ieeefp.h>
@@ -315,7 +312,7 @@ END_EXTERN_C()
return _xpfpa_result; \
} while (0)
-#elif defined(HAVE_FPU_INLINE_ASM_X86)
+#elif defined(HAVE_FPU_INLINE_ASM_X86) && !defined(__x86_64__)
/*
Custom x86 inline assembler implementation.
@@ -416,13 +413,3 @@ END_EXTERN_C()
#endif /* FPU CONTROL */
#endif
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * indent-tabs-mode: t
- * End:
- * vim600: sw=4 ts=4 fdm=marker
- * vim<600: sw=4 ts=4
- */
diff --git a/Zend/zend_gc.c b/Zend/zend_gc.c
index 3a36a8cc0d..7cecd53410 100644
--- a/Zend/zend_gc.c
+++ b/Zend/zend_gc.c
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| Zend Engine |
+----------------------------------------------------------------------+
- | Copyright (c) 1998-2018 Zend Technologies Ltd. (http://www.zend.com) |
+ | Copyright (c) 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 |
@@ -54,7 +54,7 @@
* gc_scan_black will be called on that node to scan it's subgraph.
* otherwise (refcount == 0), it marks the node white.
*
- * A node MAY be added to possbile roots when ZEND_UNSET_VAR happens or
+ * A node MAY be added to possible roots when ZEND_UNSET_VAR happens or
* zend_assign_to_variable is called only when possible garbage node is
* produced.
* gc_possible_root() will be called to add the nodes to possible roots.
@@ -78,13 +78,13 @@
#endif
/* GC_INFO layout */
-#define GC_ADDRESS 0x0fffff
-#define GC_COLOR 0x300000
+#define GC_ADDRESS 0x0fffffu
+#define GC_COLOR 0x300000u
-#define GC_BLACK 0x000000 /* must be zero */
-#define GC_WHITE 0x100000
-#define GC_GREY 0x200000
-#define GC_PURPLE 0x300000
+#define GC_BLACK 0x000000u /* must be zero */
+#define GC_WHITE 0x100000u
+#define GC_GREY 0x200000u
+#define GC_PURPLE 0x300000u
/* Debug tracing */
#if ZEND_GC_DEBUG > 1
@@ -141,6 +141,7 @@
#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_DTOR_GARBAGE 0x3 /* garbage on which only the dtor should be invoked */
#define GC_GET_PTR(ptr) \
((void*)(((uintptr_t)(ptr)) & ~GC_BITS))
@@ -151,9 +152,13 @@
((((uintptr_t)(ptr)) & GC_BITS) == GC_UNUSED)
#define GC_IS_GARBAGE(ptr) \
((((uintptr_t)(ptr)) & GC_BITS) == GC_GARBAGE)
+#define GC_IS_DTOR_GARBAGE(ptr) \
+ ((((uintptr_t)(ptr)) & GC_BITS) == GC_DTOR_GARBAGE)
#define GC_MAKE_GARBAGE(ptr) \
((void*)(((uintptr_t)(ptr)) | GC_GARBAGE))
+#define GC_MAKE_DTOR_GARBAGE(ptr) \
+ ((void*)(((uintptr_t)(ptr)) | GC_DTOR_GARBAGE))
/* GC address conversion */
#define GC_IDX2PTR(idx) (GC_G(buf) + (idx))
@@ -202,12 +207,13 @@ typedef struct _gc_root_buffer {
} gc_root_buffer;
typedef struct _zend_gc_globals {
+ gc_root_buffer *buf; /* preallocated arrays of buffers */
+
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 */
@@ -229,7 +235,8 @@ typedef struct _zend_gc_globals {
#ifdef ZTS
static int gc_globals_id;
-#define GC_G(v) ZEND_TSRMG(gc_globals_id, zend_gc_globals *, v)
+static size_t gc_globals_offset;
+#define GC_G(v) ZEND_TSRMG_FAST(gc_globals_offset, zend_gc_globals *, v)
#else
#define GC_G(v) (gc_globals.v)
static zend_gc_globals gc_globals;
@@ -398,7 +405,8 @@ static void gc_trace_ref(zend_refcounted *ref) {
fprintf(stderr, "[%p] rc=%d addr=%d %s %s ",
ref, GC_REFCOUNT(ref), GC_REF_ADDRESS(ref),
gc_color_name(GC_REF_COLOR(ref)),
- zend_get_type_by_const(GC_TYPE(ref)));
+ GC_TYPE(ref) == IS_REFERENCE
+ ? "reference" : zend_get_type_by_const(GC_TYPE(ref)));
}
}
#endif
@@ -448,7 +456,7 @@ static void gc_globals_ctor_ex(zend_gc_globals *gc_globals)
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);
+ ts_allocate_fast_id(&gc_globals_id, &gc_globals_offset, sizeof(zend_gc_globals), (ts_allocate_ctor) gc_globals_ctor_ex, (ts_allocate_dtor) root_buffer_dtor);
#else
gc_globals_ctor_ex(&gc_globals);
#endif
@@ -689,17 +697,15 @@ static void gc_scan_black(zend_refcounted *ref, gc_stack *stack)
tail_call:
if (GC_TYPE(ref) == IS_OBJECT) {
- zend_object_get_gc_t get_gc;
zend_object *obj = (zend_object*)ref;
- if (EXPECTED(!(OBJ_FLAGS(ref) & IS_OBJ_FREE_CALLED) &&
- (get_gc = obj->handlers->get_gc) != NULL)) {
+ if (EXPECTED(!(OBJ_FLAGS(ref) & IS_OBJ_FREE_CALLED))) {
int n;
zval *zv, *end;
zval tmp;
ZVAL_OBJ(&tmp, obj);
- ht = get_gc(&tmp, &zv, &n);
+ ht = obj->handlers->get_gc(&tmp, &zv, &n);
end = zv + n;
if (EXPECTED(!ht) || UNEXPECTED(GC_REF_CHECK_COLOR(ht, GC_BLACK))) {
ht = NULL;
@@ -811,17 +817,15 @@ static void gc_mark_grey(zend_refcounted *ref, gc_stack *stack)
GC_BENCH_INC(zval_marked_grey);
if (GC_TYPE(ref) == IS_OBJECT) {
- zend_object_get_gc_t get_gc;
zend_object *obj = (zend_object*)ref;
- if (EXPECTED(!(OBJ_FLAGS(ref) & IS_OBJ_FREE_CALLED) &&
- (get_gc = obj->handlers->get_gc) != NULL)) {
+ if (EXPECTED(!(OBJ_FLAGS(ref) & IS_OBJ_FREE_CALLED))) {
int n;
zval *zv, *end;
zval tmp;
ZVAL_OBJ(&tmp, obj);
- ht = get_gc(&tmp, &zv, &n);
+ ht = obj->handlers->get_gc(&tmp, &zv, &n);
end = zv + n;
if (EXPECTED(!ht) || UNEXPECTED(GC_REF_CHECK_COLOR(ht, GC_GREY))) {
ht = NULL;
@@ -835,7 +839,6 @@ static void gc_mark_grey(zend_refcounted *ref, gc_stack *stack)
while (zv != end) {
if (Z_REFCOUNTED_P(zv)) {
ref = Z_COUNTED_P(zv);
- ZEND_ASSERT(GC_REFCOUNT(ref) > 0);
GC_DELREF(ref);
if (!GC_REF_CHECK_COLOR(ref, GC_GREY)) {
GC_REF_SET_COLOR(ref, GC_GREY);
@@ -846,7 +849,6 @@ static void gc_mark_grey(zend_refcounted *ref, gc_stack *stack)
}
if (EXPECTED(!ht)) {
ref = Z_COUNTED_P(zv);
- ZEND_ASSERT(GC_REFCOUNT(ref) > 0);
GC_DELREF(ref);
if (!GC_REF_CHECK_COLOR(ref, GC_GREY)) {
GC_REF_SET_COLOR(ref, GC_GREY);
@@ -867,7 +869,6 @@ static void gc_mark_grey(zend_refcounted *ref, gc_stack *stack)
} else if (GC_TYPE(ref) == IS_REFERENCE) {
if (Z_REFCOUNTED(((zend_reference*)ref)->val)) {
ref = Z_COUNTED(((zend_reference*)ref)->val);
- ZEND_ASSERT(GC_REFCOUNT(ref) > 0);
GC_DELREF(ref);
if (!GC_REF_CHECK_COLOR(ref, GC_GREY)) {
GC_REF_SET_COLOR(ref, GC_GREY);
@@ -900,7 +901,6 @@ static void gc_mark_grey(zend_refcounted *ref, gc_stack *stack)
}
if (Z_REFCOUNTED_P(zv)) {
ref = Z_COUNTED_P(zv);
- ZEND_ASSERT(GC_REFCOUNT(ref) > 0);
GC_DELREF(ref);
if (!GC_REF_CHECK_COLOR(ref, GC_GREY)) {
GC_REF_SET_COLOR(ref, GC_GREY);
@@ -914,7 +914,6 @@ static void gc_mark_grey(zend_refcounted *ref, gc_stack *stack)
zv = Z_INDIRECT_P(zv);
}
ref = Z_COUNTED_P(zv);
- ZEND_ASSERT(GC_REFCOUNT(ref) > 0);
GC_DELREF(ref);
if (!GC_REF_CHECK_COLOR(ref, GC_GREY)) {
GC_REF_SET_COLOR(ref, GC_GREY);
@@ -1004,17 +1003,15 @@ tail_call:
}
} else {
if (GC_TYPE(ref) == IS_OBJECT) {
- zend_object_get_gc_t get_gc;
zend_object *obj = (zend_object*)ref;
- if (EXPECTED(!(OBJ_FLAGS(ref) & IS_OBJ_FREE_CALLED) &&
- (get_gc = obj->handlers->get_gc) != NULL)) {
+ if (EXPECTED(!(OBJ_FLAGS(ref) & IS_OBJ_FREE_CALLED))) {
int n;
zval *zv, *end;
zval tmp;
ZVAL_OBJ(&tmp, obj);
- ht = get_gc(&tmp, &zv, &n);
+ ht = obj->handlers->get_gc(&tmp, &zv, &n);
end = zv + n;
if (EXPECTED(!ht) || UNEXPECTED(!GC_REF_CHECK_COLOR(ht, GC_GREY))) {
ht = NULL;
@@ -1169,11 +1166,9 @@ static int gc_collect_white(zend_refcounted *ref, uint32_t *flags, gc_stack *sta
}
if (GC_TYPE(ref) == IS_OBJECT) {
- zend_object_get_gc_t get_gc;
zend_object *obj = (zend_object*)ref;
- if (EXPECTED(!(OBJ_FLAGS(ref) & IS_OBJ_FREE_CALLED) &&
- (get_gc = obj->handlers->get_gc) != NULL)) {
+ if (EXPECTED(!(OBJ_FLAGS(ref) & IS_OBJ_FREE_CALLED))) {
int n;
zval *zv, *end;
zval tmp;
@@ -1182,22 +1177,18 @@ static int gc_collect_white(zend_refcounted *ref, uint32_t *flags, gc_stack *sta
if (!GC_INFO(ref)) {
gc_add_garbage(ref);
}
- if (obj->handlers->dtor_obj &&
- ((obj->handlers->dtor_obj != zend_objects_destroy_object) ||
- (obj->ce->destructor != NULL))) {
+ if (!(OBJ_FLAGS(obj) & IS_OBJ_DESTRUCTOR_CALLED)
+ && (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);
+ ht = obj->handlers->get_gc(&tmp, &zv, &n);
end = zv + n;
if (EXPECTED(!ht) || UNEXPECTED(GC_REF_CHECK_COLOR(ht, GC_BLACK))) {
ht = NULL;
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) goto next;
}
} else {
@@ -1211,9 +1202,6 @@ static int gc_collect_white(zend_refcounted *ref, uint32_t *flags, gc_stack *sta
GC_REF_SET_BLACK(ref);
GC_STACK_PUSH(ref);
}
- /* count non-refcounted for compatibility ??? */
- } else if (Z_TYPE_P(zv) != IS_UNDEF) {
- count++;
}
zv++;
}
@@ -1261,10 +1249,6 @@ static int gc_collect_white(zend_refcounted *ref, uint32_t *flags, gc_stack *sta
if (Z_REFCOUNTED_P(zv)) {
break;
}
- /* count non-refcounted for compatibility ??? */
- if (Z_TYPE_P(zv) != IS_UNDEF) {
- count++;
- }
if (p == end) goto next;
}
while (p != end) {
@@ -1279,9 +1263,6 @@ static int gc_collect_white(zend_refcounted *ref, uint32_t *flags, gc_stack *sta
GC_REF_SET_BLACK(ref);
GC_STACK_PUSH(ref);
}
- /* count non-refcounted for compatibility ??? */
- } else if (Z_TYPE_P(zv) != IS_UNDEF) {
- count++;
}
p++;
}
@@ -1343,56 +1324,54 @@ static int gc_collect_roots(uint32_t *flags, gc_stack *stack)
return count;
}
-static void gc_remove_nested_data_from_buffer(zend_refcounted *ref, gc_root_buffer *root)
+static int gc_remove_nested_data_from_buffer(zend_refcounted *ref, gc_root_buffer *root)
{
HashTable *ht = NULL;
Bucket *p, *end;
zval *zv;
+ int count = 0;
tail_call:
do {
if (root) {
- GC_TRACE_REF(ref, "removing from buffer");
- gc_remove_from_roots(root);
- GC_REF_SET_INFO(ref, 0);
root = NULL;
+ count++;
} 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);
+ count++;
} else if (GC_TYPE(ref) == IS_REFERENCE) {
if (Z_REFCOUNTED(((zend_reference*)ref)->val)) {
ref = Z_COUNTED(((zend_reference*)ref)->val);
goto tail_call;
}
- return;
+ return count;
} else {
- return;
+ return count;
}
if (GC_TYPE(ref) == IS_OBJECT) {
- zend_object_get_gc_t get_gc;
zend_object *obj = (zend_object*)ref;
- if (EXPECTED(!(OBJ_FLAGS(ref) & IS_OBJ_FREE_CALLED) &&
- (get_gc = obj->handlers->get_gc) != NULL)) {
+ if (EXPECTED(!(OBJ_FLAGS(ref) & IS_OBJ_FREE_CALLED))) {
int n;
zval *zv, *end;
zval tmp;
ZVAL_OBJ(&tmp, obj);
- ht = get_gc(&tmp, &zv, &n);
+ ht = obj->handlers->get_gc(&tmp, &zv, &n);
end = zv + n;
if (EXPECTED(!ht)) {
- if (!n) return;
+ if (!n) return count;
while (!Z_REFCOUNTED_P(--end)) {
- if (zv == end) return;
+ if (zv == end) return count;
}
}
while (zv != end) {
if (Z_REFCOUNTED_P(zv)) {
ref = Z_COUNTED_P(zv);
- gc_remove_nested_data_from_buffer(ref, NULL);
+ count += gc_remove_nested_data_from_buffer(ref, NULL);
}
zv++;
}
@@ -1405,15 +1384,15 @@ tail_call:
GC_REMOVE_FROM_BUFFER(ht);
}
} else {
- return;
+ return count;
}
} else if (GC_TYPE(ref) == IS_ARRAY) {
ht = (zend_array*)ref;
} else {
- return;
+ return count;
}
- if (!ht->nNumUsed) return;
+ if (!ht->nNumUsed) return count;
p = ht->arData;
end = p + ht->nNumUsed;
while (1) {
@@ -1425,7 +1404,7 @@ tail_call:
if (Z_REFCOUNTED_P(zv)) {
break;
}
- if (p == end) return;
+ if (p == end) return count;
}
while (p != end) {
zv = &p->val;
@@ -1434,7 +1413,7 @@ tail_call:
}
if (Z_REFCOUNTED_P(zv)) {
ref = Z_COUNTED_P(zv);
- gc_remove_nested_data_from_buffer(ref, NULL);
+ count += gc_remove_nested_data_from_buffer(ref, NULL);
}
p++;
}
@@ -1489,80 +1468,90 @@ ZEND_API int zend_gc_collect_cycles(void)
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 */
+ /* During a destructor call, new externally visible references to nested data may
+ * be introduced. These references can be introduced in a way that does not
+ * modify any refcounts, so we have no real way to detect this situation
+ * short of rerunning full GC tracing. What we do instead is to only run
+ * destructors at this point, and leave the actual freeing of the objects
+ * until the next GC run. */
+
+ /* Mark all roots for which a dtor will be invoked as DTOR_GARBAGE. Additionally
+ * color them purple. This serves a double purpose: First, they should be
+ * considered new potential roots for the next GC run. Second, it will prevent
+ * their removal from the root buffer by nested data removal. */
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);
+ if (GC_TYPE(p) == IS_OBJECT && !(OBJ_FLAGS(p) & IS_OBJ_DESTRUCTOR_CALLED)) {
+ zend_object *obj = (zend_object *) p;
+ if (obj->handlers->dtor_obj != zend_objects_destroy_object
+ || obj->ce->destructor) {
+ current->ref = GC_MAKE_DTOR_GARBAGE(obj);
+ GC_REF_SET_COLOR(obj, GC_PURPLE);
+ } else {
+ GC_ADD_FLAGS(obj, IS_OBJ_DESTRUCTOR_CALLED);
+ }
+ }
}
current++;
idx++;
}
- /* Call destructors
- *
- * The root buffer might be reallocated during destructors calls,
- * make sure to reload pointers as necessary. */
+ /* Remove nested data for objects on which a destructor will be called.
+ * This will not remove the objects themselves, as they have been colored
+ * purple. */
idx = GC_FIRST_ROOT;
+ current = GC_IDX2PTR(GC_FIRST_ROOT);
while (idx != end) {
- current = GC_IDX2PTR(idx);
- if (GC_IS_GARBAGE(current->ref)) {
+ if (GC_IS_DTOR_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;
-
- GC_TRACE_REF(obj, "calling destructor");
- 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_ADDREF(obj);
- obj->handlers->dtor_obj(obj);
- GC_DELREF(obj);
- }
- }
+ count -= gc_remove_nested_data_from_buffer(p, current);
}
+ current++;
idx++;
}
- /* Remove values captured in destructors */
+ /* Actually call destructors.
+ *
+ * The root buffer might be reallocated during destructors calls,
+ * make sure to reload pointers as necessary. */
idx = GC_FIRST_ROOT;
- current = GC_IDX2PTR(GC_FIRST_ROOT);
while (idx != end) {
- if (GC_IS_GARBAGE(current->ref)) {
+ current = GC_IDX2PTR(idx);
+ if (GC_IS_DTOR_GARBAGE(current->ref)) {
p = GC_GET_PTR(current->ref);
- if (GC_REFCOUNT(p) > refcounts[idx]) {
- gc_remove_nested_data_from_buffer(p, current);
+ /* Mark this is as a normal root for the next GC run,
+ * it's no longer garbage for this run. */
+ current->ref = p;
+ /* Double check that the destructor hasn't been called yet. It could have
+ * already been invoked indirectly by some other destructor. */
+ if (!(OBJ_FLAGS(p) & IS_OBJ_DESTRUCTOR_CALLED)) {
+ zend_object *obj = (zend_object*)p;
+ GC_TRACE_REF(obj, "calling destructor");
+ GC_ADD_FLAGS(obj, IS_OBJ_DESTRUCTOR_CALLED);
+ GC_ADDREF(obj);
+ obj->handlers->dtor_obj(obj);
+ GC_DELREF(obj);
}
}
- current++;
idx++;
}
- pefree(refcounts, 1);
-
if (GC_G(gc_protected)) {
/* something went wrong */
return 0;
}
}
- /* Destroy zvals */
+ /* Destroy zvals. The root buffer may be reallocated. */
GC_TRACE("Destroying zvals");
- GC_G(gc_protected) = 1;
- current = GC_IDX2PTR(GC_FIRST_ROOT);
- last = GC_IDX2PTR(GC_G(first_unused));
- while (current != last) {
+ idx = GC_FIRST_ROOT;
+ while (idx != end) {
+ current = GC_IDX2PTR(idx);
if (GC_IS_GARBAGE(current->ref)) {
p = GC_GET_PTR(current->ref);
GC_TRACE_REF(p, "destroying");
@@ -1572,17 +1561,16 @@ ZEND_API int zend_gc_collect_cycles(void)
EG(objects_store).object_buckets[obj->handle] = SET_OBJ_INVALID(obj);
GC_TYPE_INFO(obj) = IS_NULL |
(GC_TYPE_INFO(obj) & ~GC_TYPE_MASK);
+ /* Modify current before calling free_obj (bug #78811: free_obj() can cause the root buffer (with current) to be reallocated.) */
+ current->ref = GC_MAKE_GARBAGE(((char*)obj) - obj->handlers->offset);
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);
- }
+ GC_ADDREF(obj);
+ obj->handlers->free_obj(obj);
+ GC_DELREF(obj);
}
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;
@@ -1595,11 +1583,12 @@ ZEND_API int zend_gc_collect_cycles(void)
zend_hash_destroy(arr);
}
}
- current++;
+ idx++;
}
/* Free objects */
current = GC_IDX2PTR(GC_FIRST_ROOT);
+ last = GC_IDX2PTR(end);
while (current != last) {
if (GC_IS_GARBAGE(current->ref)) {
p = GC_GET_PTR(current->ref);
@@ -1612,7 +1601,6 @@ ZEND_API int zend_gc_collect_cycles(void)
GC_TRACE("Collection finished");
GC_G(collected) += count;
- GC_G(gc_protected) = 0;
GC_G(gc_active) = 0;
}
@@ -1629,14 +1617,9 @@ ZEND_API void zend_gc_get_status(zend_gc_status *status)
status->num_roots = GC_G(num_roots);
}
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * indent-tabs-mode: t
- * End:
- * vim600: sw=4 ts=4 fdm=marker
- * vim<600: sw=4 ts=4
- *
- * vim:noexpandtab:
- */
+#ifdef ZTS
+size_t zend_gc_globals_size(void)
+{
+ return sizeof(zend_gc_globals);
+}
+#endif
diff --git a/Zend/zend_gc.h b/Zend/zend_gc.h
index b6df063200..d7b4e1a533 100644
--- a/Zend/zend_gc.h
+++ b/Zend/zend_gc.h
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| Zend Engine |
+----------------------------------------------------------------------+
- | Copyright (c) 1998-2018 Zend Technologies Ltd. (http://www.zend.com) |
+ | Copyright (c) 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 |
@@ -51,6 +51,10 @@ void gc_globals_ctor(void);
void gc_globals_dtor(void);
void gc_reset(void);
+#ifdef ZTS
+size_t zend_gc_globals_size(void);
+#endif
+
END_EXTERN_C()
#define GC_REMOVE_FROM_BUFFER(p) do { \
@@ -67,10 +71,10 @@ END_EXTERN_C()
static zend_always_inline void gc_check_possible_root(zend_refcounted *ref)
{
- if (GC_TYPE_INFO(ref) == IS_REFERENCE) {
+ if (EXPECTED(GC_TYPE_INFO(ref) == IS_REFERENCE)) {
zval *zv = &((zend_reference*)ref)->val;
- if (!Z_REFCOUNTED_P(zv)) {
+ if (!Z_COLLECTABLE_P(zv)) {
return;
}
ref = Z_COUNTED_P(zv);
@@ -81,13 +85,3 @@ static zend_always_inline void gc_check_possible_root(zend_refcounted *ref)
}
#endif /* ZEND_GC_H */
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * indent-tabs-mode: t
- * End:
- * vim600: sw=4 ts=4 fdm=marker
- * vim<600: sw=4 ts=4
- */
diff --git a/Zend/zend_generators.c b/Zend/zend_generators.c
index 4ccb57907f..80d11cfe4a 100644
--- a/Zend/zend_generators.c
+++ b/Zend/zend_generators.c
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| Zend Engine |
+----------------------------------------------------------------------+
- | Copyright (c) 1998-2018 Zend Technologies Ltd. (http://www.zend.com) |
+ | Copyright (c) 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 |
@@ -40,10 +40,7 @@ ZEND_API void zend_generator_restore_call_stack(zend_generator *generator) /* {{
(ZEND_CALL_INFO(call) & ~ZEND_CALL_ALLOCATED),
call->func,
ZEND_CALL_NUM_ARGS(call),
- (Z_TYPE(call->This) == IS_UNDEF) ?
- (zend_class_entry*)Z_OBJ(call->This) : NULL,
- (Z_TYPE(call->This) != IS_UNDEF) ?
- Z_OBJ(call->This) : NULL);
+ Z_PTR(call->This));
memcpy(((zval*)new_call) + ZEND_CALL_FRAME_SLOT, ((zval*)call) + ZEND_CALL_FRAME_SLOT, ZEND_CALL_NUM_ARGS(call) * sizeof(zval));
new_call->prev_execute_data = prev_call;
prev_call = new_call;
@@ -98,9 +95,10 @@ ZEND_API zend_execute_data* zend_generator_freeze_call_stack(zend_execute_data *
static void zend_generator_cleanup_unfinished_execution(
zend_generator *generator, zend_execute_data *execute_data, uint32_t catch_op_num) /* {{{ */
{
- if (execute_data->opline != execute_data->func->op_array.opcodes) {
+ zend_op_array *op_array = &execute_data->func->op_array;
+ if (execute_data->opline != op_array->opcodes) {
/* -1 required because we want the last run opcode, not the next to-be-run one. */
- uint32_t op_num = execute_data->opline - execute_data->func->op_array.opcodes - 1;
+ uint32_t op_num = execute_data->opline - op_array->opcodes - 1;
if (UNEXPECTED(generator->frozen_call_stack)) {
/* Temporarily restore generator->execute_data if it has been NULLed out already. */
@@ -109,6 +107,7 @@ static void zend_generator_cleanup_unfinished_execution(
zend_generator_restore_call_stack(generator);
generator->execute_data = save_ex;
}
+
zend_cleanup_unfinished_execution(execute_data, op_num, catch_op_num);
}
}
@@ -169,7 +168,7 @@ static void zend_generator_dtor_storage(zend_object *object) /* {{{ */
{
zend_generator *generator = (zend_generator*) object;
zend_execute_data *ex = generator->execute_data;
- uint32_t op_num, finally_op_num, finally_op_end;
+ uint32_t op_num, try_catch_offset;
int i;
/* leave yield from mode to properly allow finally execution */
@@ -197,38 +196,57 @@ static void zend_generator_dtor_storage(zend_object *object) /* {{{ */
/* -1 required because we want the last run opcode, not the
* next to-be-run one. */
op_num = ex->opline - ex->func->op_array.opcodes - 1;
+ try_catch_offset = -1;
- /* Find next finally block */
- finally_op_num = 0;
- finally_op_end = 0;
+ /* Find the innermost try/catch that we are inside of. */
for (i = 0; i < ex->func->op_array.last_try_catch; i++) {
zend_try_catch_element *try_catch = &ex->func->op_array.try_catch_array[i];
-
if (op_num < try_catch->try_op) {
break;
}
-
- if (op_num < try_catch->finally_op) {
- finally_op_num = try_catch->finally_op;
- finally_op_end = try_catch->finally_end;
+ if (op_num < try_catch->catch_op || op_num < try_catch->finally_end) {
+ try_catch_offset = i;
}
}
- /* If a finally block was found we jump directly to it and
- * resume the generator. */
- if (finally_op_num) {
- zval *fast_call;
+ /* Walk try/catch/finally structures upwards, performing the necessary actions. */
+ while (try_catch_offset != (uint32_t) -1) {
+ zend_try_catch_element *try_catch = &ex->func->op_array.try_catch_array[try_catch_offset];
- zend_generator_cleanup_unfinished_execution(generator, ex, finally_op_num);
+ if (op_num < try_catch->finally_op) {
+ /* Go to finally block */
+ zval *fast_call =
+ ZEND_CALL_VAR(ex, ex->func->op_array.opcodes[try_catch->finally_end].op1.var);
- 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;
- Z_OPLINE_NUM_P(fast_call) = (uint32_t)-1;
+ zend_generator_cleanup_unfinished_execution(generator, ex, try_catch->finally_op);
+ Z_OBJ_P(fast_call) = EG(exception);
+ EG(exception) = NULL;
+ 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;
- zend_generator_resume(generator);
+ ex->opline = &ex->func->op_array.opcodes[try_catch->finally_op];
+ generator->flags |= ZEND_GENERATOR_FORCED_CLOSE;
+ zend_generator_resume(generator);
+
+ /* TODO: If we hit another yield inside try/finally,
+ * should we also jump to the next finally block? */
+ return;
+ } else if (op_num < try_catch->finally_end) {
+ zval *fast_call =
+ ZEND_CALL_VAR(ex, ex->func->op_array.opcodes[try_catch->finally_end].op1.var);
+ /* Clean up incomplete return statement */
+ if (Z_OPLINE_NUM_P(fast_call) != (uint32_t) -1) {
+ zend_op *retval_op = &ex->func->op_array.opcodes[Z_OPLINE_NUM_P(fast_call)];
+ if (retval_op->op2_type & (IS_TMP_VAR | IS_VAR)) {
+ zval_ptr_dtor(ZEND_CALL_VAR(ex, retval_op->op2.var));
+ }
+ }
+ /* Clean up backed-up exception */
+ if (Z_OBJ_P(fast_call)) {
+ OBJ_RELEASE(Z_OBJ_P(fast_call));
+ }
+ }
+
+ try_catch_offset--;
}
}
/* }}} */
@@ -587,6 +605,7 @@ void zend_generator_yield_from(zend_generator *generator, zend_generator *from)
generator->node.parent = from;
zend_generator_get_current(generator);
GC_DELREF(&from->std);
+ generator->flags |= ZEND_GENERATOR_DO_INIT;
}
ZEND_API zend_generator *zend_generator_update_current(zend_generator *generator, zend_generator *leaf)
@@ -763,11 +782,13 @@ try_again:
if (UNEXPECTED((orig_generator->flags & ZEND_GENERATOR_DO_INIT) != 0 && !Z_ISUNDEF(generator->value))) {
/* We must not advance Generator if we yield from a Generator being currently run */
+ orig_generator->flags &= ~ZEND_GENERATOR_DO_INIT;
return;
}
if (UNEXPECTED(!Z_ISUNDEF(generator->values))) {
if (EXPECTED(zend_generator_get_next_delegated_value(generator) == SUCCESS)) {
+ orig_generator->flags &= ~ZEND_GENERATOR_DO_INIT;
return;
}
/* If there are no more deletegated values, resume the generator
@@ -832,6 +853,7 @@ try_again:
} else {
generator = zend_generator_get_current(orig_generator);
zend_generator_throw_exception(generator, NULL);
+ orig_generator->flags &= ~ZEND_GENERATOR_DO_INIT;
goto try_again;
}
}
@@ -842,15 +864,15 @@ try_again:
goto try_again;
}
}
+
+ orig_generator->flags &= ~ZEND_GENERATOR_DO_INIT;
}
/* }}} */
static inline void zend_generator_ensure_initialized(zend_generator *generator) /* {{{ */
{
if (UNEXPECTED(Z_TYPE(generator->value) == IS_UNDEF) && EXPECTED(generator->execute_data) && EXPECTED(generator->node.parent == NULL)) {
- generator->flags |= ZEND_GENERATOR_DO_INIT;
zend_generator_resume(generator);
- generator->flags &= ~ZEND_GENERATOR_DO_INIT;
generator->flags |= ZEND_GENERATOR_AT_FIRST_YIELD;
}
}
@@ -876,7 +898,7 @@ ZEND_METHOD(Generator, rewind)
return;
}
- generator = (zend_generator *) Z_OBJ_P(getThis());
+ generator = (zend_generator *) Z_OBJ_P(ZEND_THIS);
zend_generator_rewind(generator);
}
@@ -892,7 +914,7 @@ ZEND_METHOD(Generator, valid)
return;
}
- generator = (zend_generator *) Z_OBJ_P(getThis());
+ generator = (zend_generator *) Z_OBJ_P(ZEND_THIS);
zend_generator_ensure_initialized(generator);
@@ -912,7 +934,7 @@ ZEND_METHOD(Generator, current)
return;
}
- generator = (zend_generator *) Z_OBJ_P(getThis());
+ generator = (zend_generator *) Z_OBJ_P(ZEND_THIS);
zend_generator_ensure_initialized(generator);
@@ -935,7 +957,7 @@ ZEND_METHOD(Generator, key)
return;
}
- generator = (zend_generator *) Z_OBJ_P(getThis());
+ generator = (zend_generator *) Z_OBJ_P(ZEND_THIS);
zend_generator_ensure_initialized(generator);
@@ -958,7 +980,7 @@ ZEND_METHOD(Generator, next)
return;
}
- generator = (zend_generator *) Z_OBJ_P(getThis());
+ generator = (zend_generator *) Z_OBJ_P(ZEND_THIS);
zend_generator_ensure_initialized(generator);
@@ -977,7 +999,7 @@ ZEND_METHOD(Generator, send)
Z_PARAM_ZVAL(value)
ZEND_PARSE_PARAMETERS_END();
- generator = (zend_generator *) Z_OBJ_P(getThis());
+ generator = (zend_generator *) Z_OBJ_P(ZEND_THIS);
zend_generator_ensure_initialized(generator);
@@ -1016,7 +1038,7 @@ ZEND_METHOD(Generator, throw)
Z_TRY_ADDREF_P(exception);
- generator = (zend_generator *) Z_OBJ_P(getThis());
+ generator = (zend_generator *) Z_OBJ_P(ZEND_THIS);
zend_generator_ensure_initialized(generator);
@@ -1051,7 +1073,7 @@ ZEND_METHOD(Generator, getReturn)
return;
}
- generator = (zend_generator *) Z_OBJ_P(getThis());
+ generator = (zend_generator *) Z_OBJ_P(ZEND_THIS);
zend_generator_ensure_initialized(generator);
if (UNEXPECTED(EG(exception))) {
@@ -1069,22 +1091,6 @@ ZEND_METHOD(Generator, getReturn)
}
/* }}} */
-/* {{{ proto Generator::__wakeup()
- * Throws an Exception as generators can't be serialized */
-ZEND_METHOD(Generator, __wakeup)
-{
- /* Just specifying the zend_class_unserialize_deny handler is not enough,
- * because it is only invoked for C unserialization. For O the error has
- * to be thrown in __wakeup. */
-
- if (zend_parse_parameters_none() == FAILURE) {
- return;
- }
-
- zend_throw_exception(NULL, "Unserialization of 'Generator' is not allowed", 0);
-}
-/* }}} */
-
/* get_iterator implementation */
static void zend_generator_iterator_dtor(zend_object_iterator *iterator) /* {{{ */
@@ -1185,7 +1191,8 @@ zend_object_iterator *zend_generator_get_iterator(zend_class_entry *ce, zval *ob
zend_iterator_init(iterator);
iterator->funcs = &zend_generator_iterator_functions;
- ZVAL_COPY(&iterator->data, object);
+ Z_ADDREF_P(object);
+ ZVAL_OBJ(&iterator->data, Z_OBJ_P(object));
return iterator;
}
@@ -1211,7 +1218,6 @@ static const zend_function_entry generator_functions[] = {
ZEND_ME(Generator, send, arginfo_generator_send, ZEND_ACC_PUBLIC)
ZEND_ME(Generator, throw, arginfo_generator_throw, ZEND_ACC_PUBLIC)
ZEND_ME(Generator, getReturn,arginfo_generator_void, ZEND_ACC_PUBLIC)
- ZEND_ME(Generator, __wakeup, arginfo_generator_void, ZEND_ACC_PUBLIC)
ZEND_FE_END
};
@@ -1241,13 +1247,3 @@ void zend_register_generator_ce(void) /* {{{ */
zend_ce_ClosedGeneratorException = zend_register_internal_class_ex(&ce, zend_ce_exception);
}
/* }}} */
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * indent-tabs-mode: t
- * End:
- * vim600: sw=4 ts=4 fdm=marker
- * vim<600: sw=4 ts=4
- */
diff --git a/Zend/zend_generators.h b/Zend/zend_generators.h
index 108ccf31ed..abccf3a529 100644
--- a/Zend/zend_generators.h
+++ b/Zend/zend_generators.h
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| Zend Engine |
+----------------------------------------------------------------------+
- | Copyright (c) 1998-2018 Zend Technologies Ltd. (http://www.zend.com) |
+ | Copyright (c) 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 |
@@ -134,13 +134,3 @@ static zend_always_inline zend_generator *zend_generator_get_current(zend_genera
END_EXTERN_C()
#endif
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * indent-tabs-mode: t
- * End:
- * vim600: sw=4 ts=4 fdm=marker
- * vim<600: sw=4 ts=4
- */
diff --git a/Zend/zend_globals.h b/Zend/zend_globals.h
index 486336414f..2e9fff40ad 100644
--- a/Zend/zend_globals.h
+++ b/Zend/zend_globals.h
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| Zend Engine |
+----------------------------------------------------------------------+
- | Copyright (c) 1998-2018 Zend Technologies Ltd. (http://www.zend.com) |
+ | Copyright (c) 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 |
@@ -45,6 +45,8 @@
BEGIN_EXTERN_C()
ZEND_API extern int compiler_globals_id;
ZEND_API extern int executor_globals_id;
+ZEND_API extern size_t compiler_globals_offset;
+ZEND_API extern size_t executor_globals_offset;
END_EXTERN_C()
#endif
@@ -57,10 +59,6 @@ END_EXTERN_C()
/* excpt.h on Digital Unix 4.0 defines function_table */
#undef function_table
-#define ZEND_EARLY_BINDING_COMPILE_TIME 0
-#define ZEND_EARLY_BINDING_DELAYED 1
-#define ZEND_EARLY_BINDING_DELAYED_ALL 2
-
typedef struct _zend_vm_stack *zend_vm_stack;
typedef struct _zend_ini_entry zend_ini_entry;
@@ -95,7 +93,7 @@ struct _zend_compiler_globals {
struct _zend_ini_parser_param *ini_parser_param;
- uint32_t start_lineno;
+ zend_bool skip_shebang;
zend_bool increment_lineno;
zend_string *doc_comment;
@@ -120,11 +118,17 @@ struct _zend_compiler_globals {
zend_arena *ast_arena;
zend_stack delayed_oplines_stack;
+ HashTable *memoized_exprs;
+ int memoize_mode;
-#ifdef ZTS
- zval **static_members_table;
- int last_static_member;
-#endif
+ void *map_ptr_base;
+ size_t map_ptr_size;
+ size_t map_ptr_last;
+
+ HashTable *delayed_variance_obligations;
+ HashTable *delayed_autoloads;
+
+ uint32_t rtd_key_counter;
};
@@ -134,7 +138,9 @@ struct _zend_executor_globals {
/* symbol table cache */
zend_array *symtable_cache[SYMTABLE_CACHE_SIZE];
+ /* Pointer to one past the end of the symtable_cache */
zend_array **symtable_cache_limit;
+ /* Pointer to first unused symtable_cache slot */
zend_array **symtable_cache_ptr;
zend_array symbol_table; /* main symbol table */
@@ -230,12 +236,17 @@ struct _zend_executor_globals {
zend_bool each_deprecation_thrown;
+ HashTable weakrefs;
+
+ zend_bool exception_ignore_args;
+
void *reserved[ZEND_MAX_RESERVED_RESOURCES];
};
#define EG_FLAGS_INITIAL (0)
#define EG_FLAGS_IN_SHUTDOWN (1<<0)
#define EG_FLAGS_OBJECT_STORE_NO_REUSE (1<<1)
+#define EG_FLAGS_IN_RESOURCE_SHUTDOWN (1<<2)
struct _zend_ini_scanner_globals {
zend_file_handle *yy_in;
@@ -302,13 +313,3 @@ struct _zend_php_scanner_globals {
};
#endif /* ZEND_GLOBALS_H */
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * indent-tabs-mode: t
- * End:
- * vim600: sw=4 ts=4 fdm=marker
- * vim<600: sw=4 ts=4
- */
diff --git a/Zend/zend_globals_macros.h b/Zend/zend_globals_macros.h
index 131161e499..59b3daca53 100644
--- a/Zend/zend_globals_macros.h
+++ b/Zend/zend_globals_macros.h
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| Zend Engine |
+----------------------------------------------------------------------+
- | Copyright (c) 1998-2018 Zend Technologies Ltd. (http://www.zend.com) |
+ | Copyright (c) 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 |
@@ -29,7 +29,7 @@ BEGIN_EXTERN_C()
/* Compiler */
#ifdef ZTS
-# define CG(v) ZEND_TSRMG(compiler_globals_id, zend_compiler_globals *, v)
+# define CG(v) ZEND_TSRMG_FAST(compiler_globals_offset, zend_compiler_globals *, v)
#else
# define CG(v) (compiler_globals.v)
extern ZEND_API struct _zend_compiler_globals compiler_globals;
@@ -39,7 +39,7 @@ ZEND_API int zendparse(void);
/* Executor */
#ifdef ZTS
-# define EG(v) ZEND_TSRMG(executor_globals_id, zend_executor_globals *, v)
+# define EG(v) ZEND_TSRMG_FAST(executor_globals_offset, zend_executor_globals *, v)
#else
# define EG(v) (executor_globals.v)
extern ZEND_API zend_executor_globals executor_globals;
@@ -47,8 +47,9 @@ extern ZEND_API zend_executor_globals executor_globals;
/* Language Scanner */
#ifdef ZTS
-# define LANG_SCNG(v) ZEND_TSRMG(language_scanner_globals_id, zend_php_scanner_globals *, v)
+# define LANG_SCNG(v) ZEND_TSRMG_FAST(language_scanner_globals_offset, zend_php_scanner_globals *, v)
extern ZEND_API ts_rsrc_id language_scanner_globals_id;
+extern ZEND_API size_t language_scanner_globals_offset;
#else
# define LANG_SCNG(v) (language_scanner_globals.v)
extern ZEND_API zend_php_scanner_globals language_scanner_globals;
@@ -57,8 +58,9 @@ extern ZEND_API zend_php_scanner_globals language_scanner_globals;
/* INI Scanner */
#ifdef ZTS
-# define INI_SCNG(v) ZEND_TSRMG(ini_scanner_globals_id, zend_ini_scanner_globals *, v)
+# define INI_SCNG(v) ZEND_TSRMG_FAST(ini_scanner_globals_offset, zend_ini_scanner_globals *, v)
extern ZEND_API ts_rsrc_id ini_scanner_globals_id;
+extern ZEND_API size_t ini_scanner_globals_offset;
#else
# define INI_SCNG(v) (ini_scanner_globals.v)
extern ZEND_API zend_ini_scanner_globals ini_scanner_globals;
@@ -67,13 +69,3 @@ extern ZEND_API zend_ini_scanner_globals ini_scanner_globals;
END_EXTERN_C()
#endif /* ZEND_GLOBALS_MACROS_H */
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * indent-tabs-mode: t
- * End:
- * vim600: sw=4 ts=4 fdm=marker
- * vim<600: sw=4 ts=4
- */
diff --git a/Zend/zend_hash.c b/Zend/zend_hash.c
index 2fb0eac448..4fd0c549b5 100644
--- a/Zend/zend_hash.c
+++ b/Zend/zend_hash.c
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| Zend Engine |
+----------------------------------------------------------------------+
- | Copyright (c) 1998-2018 Zend Technologies Ltd. (http://www.zend.com) |
+ | Copyright (c) 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 |
@@ -22,6 +22,10 @@
#include "zend_globals.h"
#include "zend_variables.h"
+#if defined(__aarch64__)
+# include <arm_neon.h>
+#endif
+
#ifdef __SSE2__
# include <mmintrin.h>
# include <emmintrin.h>
@@ -119,55 +123,83 @@ static zend_always_inline uint32_t zend_hash_check_size(uint32_t nSize)
static zend_always_inline void zend_hash_real_init_packed_ex(HashTable *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;
+ void *data;
+
+ if (UNEXPECTED(GC_FLAGS(ht) & IS_ARRAY_PERSISTENT)) {
+ data = pemalloc(HT_SIZE_EX(ht->nTableSize, HT_MIN_MASK), 1);
+ } else if (EXPECTED(ht->nTableSize == HT_MIN_SIZE)) {
+ data = emalloc(HT_SIZE_EX(HT_MIN_SIZE, HT_MIN_MASK));
+ } else {
+ data = emalloc(HT_SIZE_EX(ht->nTableSize, HT_MIN_MASK));
+ }
+ HT_SET_DATA_ADDR(ht, data);
+ /* Don't overwrite iterator count. */
+ ht->u.v.flags = HASH_FLAG_PACKED | HASH_FLAG_STATIC_KEYS;
HT_HASH_RESET_PACKED(ht);
}
static zend_always_inline void zend_hash_real_init_mixed_ex(HashTable *ht)
{
+ void *data;
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;
-
+ if (UNEXPECTED(GC_FLAGS(ht) & IS_ARRAY_PERSISTENT)) {
+ data = pemalloc(HT_SIZE_EX(nSize, HT_SIZE_TO_MASK(nSize)), 1);
+ } else if (EXPECTED(nSize == HT_MIN_SIZE)) {
+ data = emalloc(HT_SIZE_EX(HT_MIN_SIZE, HT_SIZE_TO_MASK(HT_MIN_SIZE)));
+ ht->nTableMask = HT_SIZE_TO_MASK(HT_MIN_SIZE);
+ HT_SET_DATA_ADDR(ht, data);
+ /* Don't overwrite iterator count. */
+ ht->u.v.flags = HASH_FLAG_STATIC_KEYS;
#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);
+ do {
+ __m128i xmm0 = _mm_setzero_si128();
+ xmm0 = _mm_cmpeq_epi8(xmm0, xmm0);
+ _mm_storeu_si128((__m128i*)&HT_HASH_EX(data, 0), xmm0);
+ _mm_storeu_si128((__m128i*)&HT_HASH_EX(data, 4), xmm0);
+ _mm_storeu_si128((__m128i*)&HT_HASH_EX(data, 8), xmm0);
+ _mm_storeu_si128((__m128i*)&HT_HASH_EX(data, 12), xmm0);
+ } while (0);
+#elif defined(__aarch64__)
+ do {
+ int32x4_t t = vdupq_n_s32(-1);
+ vst1q_s32((int32_t*)&HT_HASH_EX(data, 0), t);
+ vst1q_s32((int32_t*)&HT_HASH_EX(data, 4), t);
+ vst1q_s32((int32_t*)&HT_HASH_EX(data, 8), t);
+ vst1q_s32((int32_t*)&HT_HASH_EX(data, 12), t);
+ } while (0);
#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;
+ HT_HASH_EX(data, 0) = -1;
+ HT_HASH_EX(data, 1) = -1;
+ HT_HASH_EX(data, 2) = -1;
+ HT_HASH_EX(data, 3) = -1;
+ HT_HASH_EX(data, 4) = -1;
+ HT_HASH_EX(data, 5) = -1;
+ HT_HASH_EX(data, 6) = -1;
+ HT_HASH_EX(data, 7) = -1;
+ HT_HASH_EX(data, 8) = -1;
+ HT_HASH_EX(data, 9) = -1;
+ HT_HASH_EX(data, 10) = -1;
+ HT_HASH_EX(data, 11) = -1;
+ HT_HASH_EX(data, 12) = -1;
+ HT_HASH_EX(data, 13) = -1;
+ HT_HASH_EX(data, 14) = -1;
+ HT_HASH_EX(data, 15) = -1;
#endif
+ return;
} else {
- HT_HASH_RESET(ht);
+ data = emalloc(HT_SIZE_EX(nSize, HT_SIZE_TO_MASK(nSize)));
}
+ ht->nTableMask = HT_SIZE_TO_MASK(nSize);
+ HT_SET_DATA_ADDR(ht, data);
+ HT_FLAGS(ht) = HASH_FLAG_STATIC_KEYS;
+ HT_HASH_RESET(ht);
}
static zend_always_inline void zend_hash_real_init_ex(HashTable *ht, int packed)
{
HT_ASSERT_RC1(ht);
- ZEND_ASSERT(!(HT_FLAGS(ht) & HASH_FLAG_INITIALIZED));
+ ZEND_ASSERT(HT_FLAGS(ht) & HASH_FLAG_UNINITIALIZED);
if (packed) {
zend_hash_real_init_packed_ex(ht);
} else {
@@ -181,7 +213,7 @@ static const uint32_t uninitialized_bucket[-HT_MIN_MASK] =
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,
+ .u.flags = HASH_FLAG_UNINITIALIZED,
.nTableMask = HT_MIN_MASK,
.arData = (Bucket*)&uninitialized_bucket[2],
.nNumUsed = 0,
@@ -196,7 +228,7 @@ static zend_always_inline void _zend_hash_init_int(HashTable *ht, uint32_t nSize
{
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_FLAGS(ht) = HASH_FLAG_UNINITIALIZED;
ht->nTableMask = HT_MIN_MASK;
HT_SET_DATA_ADDR(ht, &uninitialized_bucket);
ht->nNumUsed = 0;
@@ -226,6 +258,26 @@ ZEND_API HashTable* ZEND_FASTCALL _zend_new_array(uint32_t nSize)
return ht;
}
+ZEND_API HashTable* ZEND_FASTCALL zend_new_pair(zval *val1, zval *val2)
+{
+ Bucket *p;
+ HashTable *ht = emalloc(sizeof(HashTable));
+ _zend_hash_init_int(ht, HT_MIN_SIZE, ZVAL_PTR_DTOR, 0);
+ ht->nNumUsed = ht->nNumOfElements = ht->nNextFreeElement = 2;
+ zend_hash_real_init_packed_ex(ht);
+
+ p = ht->arData;
+ ZVAL_COPY_VALUE(&p->val, val1);
+ p->h = 0;
+ p->key = NULL;
+
+ p++;
+ ZVAL_COPY_VALUE(&p->val, val2);
+ p->h = 1;
+ p->key = NULL;
+ return ht;
+}
+
static void ZEND_FASTCALL zend_hash_packed_grow(HashTable *ht)
{
HT_ASSERT_RC1(ht);
@@ -295,7 +347,7 @@ ZEND_API void ZEND_FASTCALL zend_hash_extend(HashTable *ht, uint32_t nSize, zend
{
HT_ASSERT_RC1(ht);
if (nSize == 0) return;
- if (UNEXPECTED(!(HT_FLAGS(ht) & HASH_FLAG_INITIALIZED))) {
+ if (UNEXPECTED(HT_FLAGS(ht) & HASH_FLAG_UNINITIALIZED)) {
if (nSize > ht->nTableSize) {
ht->nTableSize = zend_hash_check_size(nSize);
}
@@ -339,6 +391,11 @@ ZEND_API void ZEND_FASTCALL zend_hash_discard(HashTable *ht, uint32_t nNumUsed)
if (UNEXPECTED(Z_TYPE(p->val) == IS_UNDEF)) continue;
ht->nNumOfElements--;
/* Collision pointers always directed from higher to lower buckets */
+#if 0
+ if (!(Z_NEXT(p->val) == HT_INVALID_IDX || HT_HASH_TO_BUCKET_EX(arData, Z_NEXT(p->val)) < p)) {
+ abort();
+ }
+#endif
nIndex = p->h | ht->nTableMask;
HT_HASH_EX(arData, nIndex) = Z_NEXT(p->val);
}
@@ -651,27 +708,30 @@ static zend_always_inline zval *_zend_hash_add_or_update_i(HashTable *ht, zend_s
IS_CONSISTENT(ht);
HT_ASSERT_RC1(ht);
- 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_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);
+ if (UNEXPECTED(HT_FLAGS(ht) & (HASH_FLAG_UNINITIALIZED|HASH_FLAG_PACKED))) {
+ if (EXPECTED(HT_FLAGS(ht) & HASH_FLAG_UNINITIALIZED)) {
+ 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 {
+ 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) {
+ } else if ((flag & HASH_ADD_NEW) == 0 || ZEND_DEBUG) {
p = zend_hash_find_bucket(ht, key, 0);
if (p) {
zval *data;
+ ZEND_ASSERT((flag & HASH_ADD_NEW) == 0);
if (flag & HASH_ADD) {
if (!(flag & HASH_UPDATE_INDIRECT)) {
return NULL;
@@ -736,11 +796,13 @@ static zend_always_inline zval *_zend_hash_str_add_or_update_i(HashTable *ht, co
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);
+ if (UNEXPECTED(HT_FLAGS(ht) & (HASH_FLAG_UNINITIALIZED|HASH_FLAG_PACKED))) {
+ if (EXPECTED(HT_FLAGS(ht) & HASH_FLAG_UNINITIALIZED)) {
+ zend_hash_real_init_mixed(ht);
+ goto add_to_hash;
+ } else {
+ zend_hash_packed_to_hash(ht);
+ }
} else if ((flag & HASH_ADD_NEW) == 0) {
p = zend_hash_str_find_bucket(ht, str, len, h);
@@ -944,16 +1006,17 @@ add_to_packed:
convert_to_hash:
zend_hash_packed_to_hash(ht);
}
- } else if (!(HT_FLAGS(ht) & HASH_FLAG_INITIALIZED)) {
+ } else if (HT_FLAGS(ht) & HASH_FLAG_UNINITIALIZED) {
if (h < ht->nTableSize) {
zend_hash_real_init_packed_ex(ht);
goto add_to_packed;
}
zend_hash_real_init_mixed(ht);
} else {
- if ((flag & HASH_ADD_NEW) == 0) {
+ if ((flag & HASH_ADD_NEW) == 0 || ZEND_DEBUG) {
p = zend_hash_index_find_bucket(ht, h);
if (p) {
+ ZEND_ASSERT((flag & HASH_ADD_NEW) == 0);
goto replace;
}
}
@@ -1020,6 +1083,66 @@ ZEND_API zval* ZEND_FASTCALL zend_hash_next_index_insert_new(HashTable *ht, zval
return _zend_hash_index_add_or_update_i(ht, ht->nNextFreeElement, pData, HASH_ADD | HASH_ADD_NEW | HASH_ADD_NEXT);
}
+ZEND_API zval* ZEND_FASTCALL zend_hash_set_bucket_key(HashTable *ht, Bucket *b, zend_string *key)
+{
+ uint32_t nIndex;
+ uint32_t idx, i;
+ Bucket *p, *arData;
+
+ IS_CONSISTENT(ht);
+ HT_ASSERT_RC1(ht);
+ ZEND_ASSERT(!(HT_FLAGS(ht) & HASH_FLAG_PACKED));
+
+ p = zend_hash_find_bucket(ht, key, 0);
+ if (UNEXPECTED(p)) {
+ return (p == b) ? &p->val : NULL;
+ }
+
+ if (!ZSTR_IS_INTERNED(key)) {
+ zend_string_addref(key);
+ HT_FLAGS(ht) &= ~HASH_FLAG_STATIC_KEYS;
+ }
+
+ arData = ht->arData;
+
+ /* del from hash */
+ idx = HT_IDX_TO_HASH(b - arData);
+ nIndex = b->h | ht->nTableMask;
+ i = HT_HASH_EX(arData, nIndex);
+ if (i == idx) {
+ HT_HASH_EX(arData, nIndex) = Z_NEXT(b->val);
+ } else {
+ p = HT_HASH_TO_BUCKET_EX(arData, i);
+ while (Z_NEXT(p->val) != idx) {
+ i = Z_NEXT(p->val);
+ p = HT_HASH_TO_BUCKET_EX(arData, i);
+ }
+ Z_NEXT(p->val) = Z_NEXT(b->val);
+ }
+ zend_string_release(b->key);
+
+ /* add to hash */
+ idx = b - arData;
+ b->key = key;
+ b->h = ZSTR_H(key);
+ nIndex = b->h | ht->nTableMask;
+ idx = HT_IDX_TO_HASH(idx);
+ i = HT_HASH_EX(arData, nIndex);
+ if (i == HT_INVALID_IDX || i < idx) {
+ Z_NEXT(b->val) = i;
+ HT_HASH_EX(arData, nIndex) = idx;
+ } else {
+ p = HT_HASH_TO_BUCKET_EX(arData, i);
+ while (Z_NEXT(p->val) != HT_INVALID_IDX && Z_NEXT(p->val) > idx) {
+ i = Z_NEXT(p->val);
+ p = HT_HASH_TO_BUCKET_EX(arData, i);
+ }
+ Z_NEXT(b->val) = Z_NEXT(p->val);
+ Z_NEXT(p->val) = idx;
+ }
+ return &b->val;
+}
+
static void ZEND_FASTCALL zend_hash_do_resize(HashTable *ht)
{
@@ -1053,7 +1176,7 @@ ZEND_API int ZEND_FASTCALL zend_hash_rehash(HashTable *ht)
IS_CONSISTENT(ht);
if (UNEXPECTED(ht->nNumOfElements == 0)) {
- if (HT_FLAGS(ht) & HASH_FLAG_INITIALIZED) {
+ if (!(HT_FLAGS(ht) & HASH_FLAG_UNINITIALIZED)) {
ht->nNumUsed = 0;
HT_HASH_RESET(ht);
}
@@ -1455,7 +1578,7 @@ ZEND_API void ZEND_FASTCALL zend_hash_destroy(HashTable *ht)
}
}
zend_hash_iterators_remove(ht);
- } else if (EXPECTED(!(HT_FLAGS(ht) & HASH_FLAG_INITIALIZED))) {
+ } else if (EXPECTED(HT_FLAGS(ht) & HASH_FLAG_UNINITIALIZED)) {
return;
}
pefree(HT_GET_DATA_ADDR(ht), GC_FLAGS(ht) & IS_ARRAY_PERSISTENT);
@@ -1485,11 +1608,11 @@ ZEND_API void ZEND_FASTCALL zend_array_destroy(HashTable *ht)
if (HT_HAS_STATIC_KEYS_ONLY(ht)) {
do {
- i_zval_ptr_dtor(&p->val ZEND_FILE_LINE_CC);
+ i_zval_ptr_dtor(&p->val);
} while (++p != end);
} else if (HT_IS_WITHOUT_HOLES(ht)) {
do {
- i_zval_ptr_dtor(&p->val ZEND_FILE_LINE_CC);
+ i_zval_ptr_dtor(&p->val);
if (EXPECTED(p->key)) {
zend_string_release_ex(p->key, 0);
}
@@ -1497,14 +1620,14 @@ ZEND_API void ZEND_FASTCALL zend_array_destroy(HashTable *ht)
} else {
do {
if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF)) {
- i_zval_ptr_dtor(&p->val ZEND_FILE_LINE_CC);
+ i_zval_ptr_dtor(&p->val);
if (EXPECTED(p->key)) {
zend_string_release_ex(p->key, 0);
}
}
} while (++p != end);
}
- } else if (EXPECTED(!(HT_FLAGS(ht) & HASH_FLAG_INITIALIZED))) {
+ } else if (EXPECTED(HT_FLAGS(ht) & HASH_FLAG_UNINITIALIZED)) {
goto free_ht;
}
zend_hash_iterators_remove(ht);
@@ -1595,11 +1718,11 @@ ZEND_API void ZEND_FASTCALL zend_symtable_clean(HashTable *ht)
end = p + ht->nNumUsed;
if (HT_HAS_STATIC_KEYS_ONLY(ht)) {
do {
- i_zval_ptr_dtor(&p->val ZEND_FILE_LINE_CC);
+ i_zval_ptr_dtor(&p->val);
} while (++p != end);
} else if (HT_IS_WITHOUT_HOLES(ht)) {
do {
- i_zval_ptr_dtor(&p->val ZEND_FILE_LINE_CC);
+ i_zval_ptr_dtor(&p->val);
if (EXPECTED(p->key)) {
zend_string_release(p->key);
}
@@ -1607,7 +1730,7 @@ ZEND_API void ZEND_FASTCALL zend_symtable_clean(HashTable *ht)
} else {
do {
if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF)) {
- i_zval_ptr_dtor(&p->val ZEND_FILE_LINE_CC);
+ i_zval_ptr_dtor(&p->val);
if (EXPECTED(p->key)) {
zend_string_release(p->key);
}
@@ -1635,7 +1758,7 @@ 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_FLAGS(ht) & HASH_FLAG_INITIALIZED) {
+ if (!(HT_FLAGS(ht) & HASH_FLAG_UNINITIALIZED)) {
pefree(HT_GET_DATA_ADDR(ht), GC_FLAGS(ht) & IS_ARRAY_PERSISTENT);
}
@@ -1659,7 +1782,7 @@ 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_FLAGS(ht) & HASH_FLAG_INITIALIZED) {
+ if (!(HT_FLAGS(ht) & HASH_FLAG_UNINITIALIZED)) {
pefree(HT_GET_DATA_ADDR(ht), GC_FLAGS(ht) & IS_ARRAY_PERSISTENT);
}
@@ -1925,17 +2048,16 @@ ZEND_API HashTable* ZEND_FASTCALL zend_array_dup(HashTable *source)
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->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;
+ HT_FLAGS(target) = HASH_FLAG_UNINITIALIZED;
target->nTableMask = HT_MIN_MASK;
target->nNumUsed = 0;
target->nNumOfElements = 0;
target->nNextFreeElement = source->nNextFreeElement;
target->nInternalPointer = 0;
+ target->nTableSize = HT_MIN_SIZE;
HT_SET_DATA_ADDR(target, &uninitialized_bucket);
} else if (GC_FLAGS(source) & IS_ARRAY_IMMUTABLE) {
HT_FLAGS(target) = HT_FLAGS(source) & HASH_FLAG_MASK;
@@ -1943,6 +2065,7 @@ ZEND_API HashTable* ZEND_FASTCALL zend_array_dup(HashTable *source)
target->nNumUsed = source->nNumUsed;
target->nNumOfElements = source->nNumOfElements;
target->nNextFreeElement = source->nNextFreeElement;
+ target->nTableSize = source->nTableSize;
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));
@@ -1952,6 +2075,7 @@ ZEND_API HashTable* ZEND_FASTCALL zend_array_dup(HashTable *source)
target->nNumUsed = source->nNumUsed;
target->nNumOfElements = source->nNumOfElements;
target->nNextFreeElement = source->nNextFreeElement;
+ target->nTableSize = source->nTableSize;
HT_SET_DATA_ADDR(target, emalloc(HT_SIZE_EX(target->nTableSize, HT_MIN_MASK)));
target->nInternalPointer =
(source->nInternalPointer < source->nNumUsed) ?
@@ -1972,6 +2096,7 @@ ZEND_API HashTable* ZEND_FASTCALL zend_array_dup(HashTable *source)
(source->nInternalPointer < source->nNumUsed) ?
source->nInternalPointer : 0;
+ target->nTableSize = source->nTableSize;
HT_SET_DATA_ADDR(target, emalloc(HT_SIZE(target)));
HT_HASH_RESET(target);
@@ -2115,28 +2240,6 @@ ZEND_API zval* ZEND_FASTCALL zend_hash_str_find(const HashTable *ht, const char
return p ? &p->val : NULL;
}
-ZEND_API zend_bool ZEND_FASTCALL zend_hash_exists(const HashTable *ht, zend_string *key)
-{
- Bucket *p;
-
- IS_CONSISTENT(ht);
-
- p = zend_hash_find_bucket(ht, key, 0);
- return p ? 1 : 0;
-}
-
-ZEND_API zend_bool ZEND_FASTCALL zend_hash_str_exists(const HashTable *ht, const char *str, size_t len)
-{
- zend_ulong h;
- Bucket *p;
-
- IS_CONSISTENT(ht);
-
- h = zend_inline_hash_func(str, len);
- p = zend_hash_str_find_bucket(ht, str, len, h);
- return p ? 1 : 0;
-}
-
ZEND_API zval* ZEND_FASTCALL zend_hash_index_find(const HashTable *ht, zend_ulong h)
{
Bucket *p;
@@ -2167,26 +2270,6 @@ ZEND_API zval* ZEND_FASTCALL _zend_hash_index_find(const HashTable *ht, zend_ulo
return p ? &p->val : NULL;
}
-ZEND_API zend_bool ZEND_FASTCALL zend_hash_index_exists(const HashTable *ht, zend_ulong h)
-{
- Bucket *p;
-
- IS_CONSISTENT(ht);
-
- if (HT_FLAGS(ht) & HASH_FLAG_PACKED) {
- if (h < ht->nNumUsed) {
- if (Z_TYPE(ht->arData[h].val) != IS_UNDEF) {
- return 1;
- }
- }
- return 0;
- }
-
- p = zend_hash_index_find_bucket(ht, h);
- return p ? 1 : 0;
-}
-
-
ZEND_API void ZEND_FASTCALL zend_hash_internal_pointer_reset_ex(HashTable *ht, HashPosition *pos)
{
IS_CONSISTENT(ht);
@@ -2745,13 +2828,3 @@ convert:
return new_ht;
}
}
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * indent-tabs-mode: t
- * End:
- * vim600: sw=4 ts=4 fdm=marker
- * vim<600: sw=4 ts=4
- */
diff --git a/Zend/zend_hash.h b/Zend/zend_hash.h
index 2c295adca6..f1e2d34685 100644
--- a/Zend/zend_hash.h
+++ b/Zend/zend_hash.h
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| Zend Engine |
+----------------------------------------------------------------------+
- | Copyright (c) 1998-2018 Zend Technologies Ltd. (http://www.zend.com) |
+ | Copyright (c) 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 |
@@ -35,7 +35,7 @@
#define HASH_FLAG_CONSISTENCY ((1<<0) | (1<<1))
#define HASH_FLAG_PACKED (1<<2)
-#define HASH_FLAG_INITIALIZED (1<<3)
+#define HASH_FLAG_UNINITIALIZED (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)
@@ -45,6 +45,13 @@
#define HT_FLAGS(ht) (ht)->u.flags
+#define HT_INVALIDATE(ht) do { \
+ HT_FLAGS(ht) = HASH_FLAG_UNINITIALIZED; \
+ } while (0)
+
+#define HT_IS_INITIALIZED(ht) \
+ ((HT_FLAGS(ht) & HASH_FLAG_UNINITIALIZED) == 0)
+
#define HT_IS_PACKED(ht) \
((HT_FLAGS(ht) & HASH_FLAG_PACKED) != 0)
@@ -131,6 +138,8 @@ ZEND_API zval* ZEND_FASTCALL zend_hash_index_add_empty_element(HashTable *ht, ze
ZEND_API zval* ZEND_FASTCALL zend_hash_add_empty_element(HashTable *ht, zend_string *key);
ZEND_API zval* ZEND_FASTCALL zend_hash_str_add_empty_element(HashTable *ht, const char *key, size_t len);
+ZEND_API zval* ZEND_FASTCALL zend_hash_set_bucket_key(HashTable *ht, Bucket *p, zend_string *key);
+
#define ZEND_HASH_APPLY_KEEP 0
#define ZEND_HASH_APPLY_REMOVE 1<<0
#define ZEND_HASH_APPLY_STOP 1<<1
@@ -162,7 +171,7 @@ ZEND_API int ZEND_FASTCALL zend_hash_str_del_ind(HashTable *ht, const char *key,
ZEND_API int ZEND_FASTCALL zend_hash_index_del(HashTable *ht, zend_ulong h);
ZEND_API void ZEND_FASTCALL zend_hash_del_bucket(HashTable *ht, Bucket *p);
-/* Data retreival */
+/* Data retrieval */
ZEND_API zval* ZEND_FASTCALL zend_hash_find(const HashTable *ht, zend_string *key);
ZEND_API zval* ZEND_FASTCALL zend_hash_str_find(const HashTable *ht, const char *key, size_t len);
ZEND_API zval* ZEND_FASTCALL zend_hash_index_find(const HashTable *ht, zend_ulong h);
@@ -200,9 +209,20 @@ static zend_always_inline zval *zend_hash_find_ex(const HashTable *ht, zend_stri
/* Misc */
-ZEND_API zend_bool ZEND_FASTCALL zend_hash_exists(const HashTable *ht, zend_string *key);
-ZEND_API zend_bool ZEND_FASTCALL zend_hash_str_exists(const HashTable *ht, const char *str, size_t len);
-ZEND_API zend_bool ZEND_FASTCALL zend_hash_index_exists(const HashTable *ht, zend_ulong h);
+static zend_always_inline zend_bool zend_hash_exists(const HashTable *ht, zend_string *key)
+{
+ return zend_hash_find(ht, key) != NULL;
+}
+
+static zend_always_inline zend_bool zend_hash_str_exists(const HashTable *ht, const char *str, size_t len)
+{
+ return zend_hash_str_find(ht, str, len) != NULL;
+}
+
+static zend_always_inline zend_bool zend_hash_index_exists(const HashTable *ht, zend_ulong h)
+{
+ return zend_hash_index_find(ht, h) != NULL;
+}
/* traversing */
ZEND_API HashPosition ZEND_FASTCALL zend_hash_get_current_pos(const HashTable *ht);
@@ -277,6 +297,7 @@ ZEND_API int ZEND_FASTCALL zend_hash_rehash(HashTable *ht);
ZEND_API HashTable* ZEND_FASTCALL _zend_new_array_0(void);
ZEND_API HashTable* ZEND_FASTCALL _zend_new_array(uint32_t size);
+ZEND_API HashTable* ZEND_FASTCALL zend_new_pair(zval *val1, zval *val2);
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);
@@ -1046,7 +1067,7 @@ static zend_always_inline void *zend_hash_get_current_data_ptr_ex(HashTable *ht,
_val = _z;
/* The following macros are useful to insert a sequence of new elements
- * of packed array. They may be use insted of series of
+ * of packed array. They may be used instead of series of
* zend_hash_next_index_insert_new()
* (HashTable must have enough free buckets).
*/
@@ -1056,14 +1077,39 @@ static zend_always_inline void *zend_hash_get_current_data_ptr_ex(HashTable *ht,
uint32_t __fill_idx = __fill_ht->nNumUsed; \
ZEND_ASSERT(HT_FLAGS(__fill_ht) & HASH_FLAG_PACKED);
-#define ZEND_HASH_FILL_ADD(_val) do { \
- ZVAL_COPY_VALUE(&__fill_bkt->val, _val); \
+#define ZEND_HASH_FILL_SET(_val) \
+ ZVAL_COPY_VALUE(&__fill_bkt->val, _val)
+
+#define ZEND_HASH_FILL_SET_NULL() \
+ ZVAL_NULL(&__fill_bkt->val)
+
+#define ZEND_HASH_FILL_SET_LONG(_val) \
+ ZVAL_LONG(&__fill_bkt->val, _val)
+
+#define ZEND_HASH_FILL_SET_DOUBLE(_val) \
+ ZVAL_DOUBLE(&__fill_bkt->val, _val)
+
+#define ZEND_HASH_FILL_SET_STR(_val) \
+ ZVAL_STR(&__fill_bkt->val, _val)
+
+#define ZEND_HASH_FILL_SET_STR_COPY(_val) \
+ ZVAL_STR_COPY(&__fill_bkt->val, _val)
+
+#define ZEND_HASH_FILL_SET_INTERNED_STR(_val) \
+ ZVAL_INTERNED_STR(&__fill_bkt->val, _val)
+
+#define ZEND_HASH_FILL_NEXT() do {\
__fill_bkt->h = (__fill_idx); \
__fill_bkt->key = NULL; \
__fill_bkt++; \
__fill_idx++; \
} while (0)
+#define ZEND_HASH_FILL_ADD(_val) do { \
+ ZEND_HASH_FILL_SET(_val); \
+ ZEND_HASH_FILL_NEXT(); \
+ } while (0)
+
#define ZEND_HASH_FILL_END() \
__fill_ht->nNumUsed = __fill_idx; \
__fill_ht->nNumOfElements = __fill_idx; \
@@ -1144,13 +1190,3 @@ static zend_always_inline void _zend_hash_append_ind(HashTable *ht, zend_string
}
#endif /* ZEND_HASH_H */
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * indent-tabs-mode: t
- * End:
- * vim600: sw=4 ts=4 fdm=marker
- * vim<600: sw=4 ts=4
- */
diff --git a/Zend/zend_highlight.c b/Zend/zend_highlight.c
index b3bc631654..5e94df0a99 100644
--- a/Zend/zend_highlight.c
+++ b/Zend/zend_highlight.c
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| Zend Engine |
+----------------------------------------------------------------------+
- | Copyright (c) 1998-2018 Zend Technologies Ltd. (http://www.zend.com) |
+ | Copyright (c) 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 |
@@ -228,13 +228,3 @@ ZEND_API void zend_strip(void)
/* Discard parse errors thrown during tokenization */
zend_clear_exception();
}
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * indent-tabs-mode: t
- * End:
- * vim600: sw=4 ts=4 fdm=marker
- * vim<600: sw=4 ts=4
- */
diff --git a/Zend/zend_highlight.h b/Zend/zend_highlight.h
index 067d2ddbd2..92a4dbccd3 100644
--- a/Zend/zend_highlight.h
+++ b/Zend/zend_highlight.h
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| Zend Engine |
+----------------------------------------------------------------------+
- | Copyright (c) 1998-2018 Zend Technologies Ltd. (http://www.zend.com) |
+ | Copyright (c) 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 |
@@ -48,13 +48,3 @@ END_EXTERN_C()
extern zend_syntax_highlighter_ini syntax_highlighter_ini;
#endif
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * indent-tabs-mode: t
- * End:
- * vim600: sw=4 ts=4 fdm=marker
- * vim<600: sw=4 ts=4
- */
diff --git a/Zend/zend_inheritance.c b/Zend/zend_inheritance.c
index d271b74154..e7dcf54e0d 100644
--- a/Zend/zend_inheritance.c
+++ b/Zend/zend_inheritance.c
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| Zend Engine |
+----------------------------------------------------------------------+
- | Copyright (c) 1998-2018 Zend Technologies Ltd. (http://www.zend.com) |
+ | Copyright (c) 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 |
@@ -22,301 +22,441 @@
#include "zend_compile.h"
#include "zend_execute.h"
#include "zend_inheritance.h"
+#include "zend_interfaces.h"
#include "zend_smart_str.h"
#include "zend_operators.h"
+#include "zend_exceptions.h"
-static void overriden_ptr_dtor(zval *zv) /* {{{ */
+static void add_dependency_obligation(zend_class_entry *ce, zend_class_entry *dependency_ce);
+static void add_compatibility_obligation(
+ zend_class_entry *ce, const zend_function *child_fn, const zend_function *parent_fn,
+ zend_bool always_error);
+static void add_property_compatibility_obligation(
+ zend_class_entry *ce, const zend_property_info *child_prop,
+ const zend_property_info *parent_prop);
+
+static void overridden_ptr_dtor(zval *zv) /* {{{ */
{
efree_size(Z_PTR_P(zv), sizeof(zend_function));
}
/* }}} */
-static zend_property_info *zend_duplicate_property_info(zend_property_info *property_info) /* {{{ */
+static zend_property_info *zend_duplicate_property_info_internal(zend_property_info *property_info) /* {{{ */
{
- zend_property_info* new_property_info;
-
- new_property_info = zend_arena_alloc(&CG(arena), sizeof(zend_property_info));
+ zend_property_info* new_property_info = pemalloc(sizeof(zend_property_info), 1);
memcpy(new_property_info, property_info, sizeof(zend_property_info));
zend_string_addref(new_property_info->name);
- if (new_property_info->doc_comment) {
- zend_string_addref(new_property_info->doc_comment);
+ if (ZEND_TYPE_IS_NAME(new_property_info->type)) {
+ zend_string_addref(ZEND_TYPE_NAME(new_property_info->type));
}
+
return new_property_info;
}
/* }}} */
-static zend_property_info *zend_duplicate_property_info_internal(zend_property_info *property_info) /* {{{ */
+static zend_function *zend_duplicate_internal_function(zend_function *func, zend_class_entry *ce) /* {{{ */
{
- zend_property_info* new_property_info = pemalloc(sizeof(zend_property_info), 1);
- memcpy(new_property_info, property_info, sizeof(zend_property_info));
- zend_string_addref(new_property_info->name);
- return new_property_info;
+ zend_function *new_function;
+
+ if (UNEXPECTED(ce->type & ZEND_INTERNAL_CLASS)) {
+ new_function = pemalloc(sizeof(zend_internal_function), 1);
+ memcpy(new_function, func, sizeof(zend_internal_function));
+ } else {
+ new_function = zend_arena_alloc(&CG(arena), sizeof(zend_internal_function));
+ memcpy(new_function, func, sizeof(zend_internal_function));
+ new_function->common.fn_flags |= ZEND_ACC_ARENA_ALLOCATED;
+ }
+ if (EXPECTED(new_function->common.function_name)) {
+ zend_string_addref(new_function->common.function_name);
+ }
+ return new_function;
}
/* }}} */
-static zend_function *zend_duplicate_function(zend_function *func, zend_class_entry *ce) /* {{{ */
+static zend_function *zend_duplicate_user_function(zend_function *func) /* {{{ */
{
zend_function *new_function;
+ new_function = zend_arena_alloc(&CG(arena), sizeof(zend_op_array));
+ memcpy(new_function, func, sizeof(zend_op_array));
+ if (ZEND_MAP_PTR_GET(func->op_array.static_variables_ptr)) {
+ /* See: Zend/tests/method_static_var.phpt */
+ new_function->op_array.static_variables = ZEND_MAP_PTR_GET(func->op_array.static_variables_ptr);
+ }
+ if (!(GC_FLAGS(new_function->op_array.static_variables) & IS_ARRAY_IMMUTABLE)) {
+ GC_ADDREF(new_function->op_array.static_variables);
+ }
+
+ if (CG(compiler_options) & ZEND_COMPILE_PRELOAD) {
+ ZEND_ASSERT(new_function->op_array.fn_flags & ZEND_ACC_PRELOADED);
+ ZEND_MAP_PTR_NEW(new_function->op_array.static_variables_ptr);
+ } else {
+ ZEND_MAP_PTR_INIT(new_function->op_array.static_variables_ptr, &new_function->op_array.static_variables);
+ }
+
+ return new_function;
+}
+/* }}} */
+
+static zend_always_inline zend_function *zend_duplicate_function(zend_function *func, zend_class_entry *ce, zend_bool is_interface) /* {{{ */
+{
if (UNEXPECTED(func->type == ZEND_INTERNAL_FUNCTION)) {
- if (UNEXPECTED(ce->type & ZEND_INTERNAL_CLASS)) {
- new_function = pemalloc(sizeof(zend_internal_function), 1);
- memcpy(new_function, func, sizeof(zend_internal_function));
- } else {
- new_function = zend_arena_alloc(&CG(arena), sizeof(zend_internal_function));
- memcpy(new_function, func, sizeof(zend_internal_function));
- new_function->common.fn_flags |= ZEND_ACC_ARENA_ALLOCATED;
- }
- if (EXPECTED(new_function->common.function_name)) {
- zend_string_addref(new_function->common.function_name);
- }
+ return zend_duplicate_internal_function(func, ce);
} else {
if (func->op_array.refcount) {
(*func->op_array.refcount)++;
}
- if (EXPECTED(!func->op_array.static_variables)) {
+ if (is_interface
+ || EXPECTED(!func->op_array.static_variables)) {
/* reuse the same op_array structure */
return func;
}
- if (!(GC_FLAGS(func->op_array.static_variables) & IS_ARRAY_IMMUTABLE)) {
- 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));
+ return zend_duplicate_user_function(func);
}
- return new_function;
}
/* }}} */
static void do_inherit_parent_constructor(zend_class_entry *ce) /* {{{ */
{
- ZEND_ASSERT(ce->parent != NULL);
+ zend_class_entry *parent = ce->parent;
+
+ ZEND_ASSERT(parent != NULL);
/* You cannot change create_object */
- ce->create_object = ce->parent->create_object;
+ ce->create_object = parent->create_object;
/* Inherit special functions if needed */
if (EXPECTED(!ce->get_iterator)) {
- ce->get_iterator = ce->parent->get_iterator;
+ ce->get_iterator = parent->get_iterator;
}
- 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 (parent->iterator_funcs_ptr) {
+ /* Must be initialized through iface->interface_gets_implemented() */
+ ZEND_ASSERT(ce->iterator_funcs_ptr);
}
if (EXPECTED(!ce->__get)) {
- ce->__get = ce->parent->__get;
+ ce->__get = parent->__get;
}
if (EXPECTED(!ce->__set)) {
- ce->__set = ce->parent->__set;
+ ce->__set = parent->__set;
}
if (EXPECTED(!ce->__unset)) {
- ce->__unset = ce->parent->__unset;
+ ce->__unset = parent->__unset;
}
if (EXPECTED(!ce->__isset)) {
- ce->__isset = ce->parent->__isset;
+ ce->__isset = parent->__isset;
}
if (EXPECTED(!ce->__call)) {
- ce->__call = ce->parent->__call;
+ ce->__call = parent->__call;
}
if (EXPECTED(!ce->__callstatic)) {
- ce->__callstatic = ce->parent->__callstatic;
+ ce->__callstatic = parent->__callstatic;
}
if (EXPECTED(!ce->__tostring)) {
- ce->__tostring = ce->parent->__tostring;
+ ce->__tostring = parent->__tostring;
}
if (EXPECTED(!ce->clone)) {
- ce->clone = ce->parent->clone;
+ ce->clone = parent->clone;
+ }
+ if (EXPECTED(!ce->serialize_func)) {
+ ce->serialize_func = parent->serialize_func;
}
if (EXPECTED(!ce->serialize)) {
- ce->serialize = ce->parent->serialize;
+ ce->serialize = parent->serialize;
+ }
+ if (EXPECTED(!ce->unserialize_func)) {
+ ce->unserialize_func = parent->unserialize_func;
}
if (EXPECTED(!ce->unserialize)) {
- ce->unserialize = ce->parent->unserialize;
+ ce->unserialize = parent->unserialize;
}
if (!ce->destructor) {
- ce->destructor = ce->parent->destructor;
+ ce->destructor = parent->destructor;
}
if (EXPECTED(!ce->__debugInfo)) {
- ce->__debugInfo = ce->parent->__debugInfo;
+ ce->__debugInfo = parent->__debugInfo;
}
if (ce->constructor) {
- if (ce->parent->constructor && UNEXPECTED(ce->parent->constructor->common.fn_flags & ZEND_ACC_FINAL)) {
+ if (parent->constructor && UNEXPECTED(parent->constructor->common.fn_flags & ZEND_ACC_FINAL)) {
zend_error_noreturn(E_ERROR, "Cannot override final %s::%s() with %s::%s()",
- ZSTR_VAL(ce->parent->name), ZSTR_VAL(ce->parent->constructor->common.function_name),
+ ZSTR_VAL(parent->name), ZSTR_VAL(parent->constructor->common.function_name),
ZSTR_VAL(ce->name), ZSTR_VAL(ce->constructor->common.function_name));
}
return;
}
- ce->constructor = ce->parent->constructor;
+ ce->constructor = parent->constructor;
}
/* }}} */
char *zend_visibility_string(uint32_t fn_flags) /* {{{ */
{
- if (fn_flags & ZEND_ACC_PRIVATE) {
- return "private";
- }
- if (fn_flags & ZEND_ACC_PROTECTED) {
- return "protected";
- }
if (fn_flags & ZEND_ACC_PUBLIC) {
return "public";
+ } else if (fn_flags & ZEND_ACC_PRIVATE) {
+ return "private";
+ } else {
+ ZEND_ASSERT(fn_flags & ZEND_ACC_PROTECTED);
+ return "protected";
}
- return "";
}
/* }}} */
-static zend_always_inline zend_bool zend_iterable_compatibility_check(zend_arg_info *arg_info) /* {{{ */
-{
- if (ZEND_TYPE_CODE(arg_info->type) == IS_ARRAY) {
- return 1;
+static zend_string *resolve_class_name(zend_class_entry *scope, zend_string *name) {
+ ZEND_ASSERT(scope);
+ if (zend_string_equals_literal_ci(name, "parent") && scope->parent) {
+ if (scope->ce_flags & ZEND_ACC_RESOLVED_PARENT) {
+ return scope->parent->name;
+ } else {
+ return scope->parent_name;
+ }
+ } else if (zend_string_equals_literal_ci(name, "self")) {
+ return scope->name;
+ } else {
+ return name;
}
+}
- if (ZEND_TYPE_IS_CLASS(arg_info->type) && zend_string_equals_literal_ci(ZEND_TYPE_NAME(arg_info->type), "Traversable")) {
- return 1;
+static zend_bool class_visible(zend_class_entry *ce) {
+ if (ce->type == ZEND_INTERNAL_CLASS) {
+ return !(CG(compiler_options) & ZEND_COMPILE_IGNORE_INTERNAL_CLASSES);
+ } else {
+ ZEND_ASSERT(ce->type == ZEND_USER_CLASS);
+ return !(CG(compiler_options) & ZEND_COMPILE_IGNORE_OTHER_FILES)
+ || ce->info.user.filename == CG(compiled_filename);
}
-
- return 0;
}
-/* }}} */
-static int zend_do_perform_type_hint_check(const zend_function *fe, zend_arg_info *fe_arg_info, const zend_function *proto, zend_arg_info *proto_arg_info) /* {{{ */
-{
- ZEND_ASSERT(ZEND_TYPE_IS_SET(fe_arg_info->type) && ZEND_TYPE_IS_SET(proto_arg_info->type));
+static zend_class_entry *lookup_class(zend_class_entry *scope, zend_string *name) {
+ zend_class_entry *ce;
+ if (!CG(in_compilation)) {
+ uint32_t flags = ZEND_FETCH_CLASS_ALLOW_UNLINKED | ZEND_FETCH_CLASS_NO_AUTOLOAD;
+ ce = zend_lookup_class_ex(name, NULL, flags);
+ if (ce) {
+ return ce;
+ }
- if (ZEND_TYPE_IS_CLASS(fe_arg_info->type) && ZEND_TYPE_IS_CLASS(proto_arg_info->type)) {
- zend_string *fe_class_name, *proto_class_name;
- const char *class_name;
- size_t class_name_len;
+ /* We'll autoload this class and process delayed variance obligations later. */
+ if (!CG(delayed_autoloads)) {
+ ALLOC_HASHTABLE(CG(delayed_autoloads));
+ zend_hash_init(CG(delayed_autoloads), 0, NULL, NULL, 0);
+ }
+ zend_hash_add_empty_element(CG(delayed_autoloads), name);
+ } else {
+ ce = zend_lookup_class_ex(name, NULL, ZEND_FETCH_CLASS_NO_AUTOLOAD);
+ if (ce && class_visible(ce)) {
+ return ce;
+ }
- fe_class_name = ZEND_TYPE_NAME(fe_arg_info->type);
- class_name = ZSTR_VAL(fe_class_name);
- class_name_len = ZSTR_LEN(fe_class_name);
- if (class_name_len == sizeof("parent")-1 && !strcasecmp(class_name, "parent") && fe->common.scope && fe->common.scope->parent) {
- fe_class_name = zend_string_copy(fe->common.scope->parent->name);
- } else if (class_name_len == sizeof("self")-1 && !strcasecmp(class_name, "self") && fe->common.scope) {
- fe_class_name = zend_string_copy(fe->common.scope->name);
- } else {
- zend_string_addref(fe_class_name);
+ /* The current class may not be registered yet, so check for it explicitly. */
+ if (zend_string_equals_ci(scope->name, name)) {
+ return scope;
}
+ }
+
+ return NULL;
+}
+
+/* Instanceof that's safe to use on unlinked classes. */
+static zend_bool unlinked_instanceof(zend_class_entry *ce1, zend_class_entry *ce2) {
+ zend_class_entry *ce;
- proto_class_name = ZEND_TYPE_NAME(proto_arg_info->type);
- class_name = ZSTR_VAL(proto_class_name);
- class_name_len = ZSTR_LEN(proto_class_name);
- if (class_name_len == sizeof("parent")-1 && !strcasecmp(class_name, "parent") && proto->common.scope && proto->common.scope->parent) {
- proto_class_name = zend_string_copy(proto->common.scope->parent->name);
- } else if (class_name_len == sizeof("self")-1 && !strcasecmp(class_name, "self") && proto->common.scope) {
- proto_class_name = zend_string_copy(proto->common.scope->name);
+ if (ce1 == ce2) {
+ return 1;
+ }
+
+ if (ce1->ce_flags & ZEND_ACC_LINKED) {
+ return instanceof_function(ce1, ce2);
+ }
+
+ ce = ce1;
+ while (ce->parent) {
+ if (ce->ce_flags & ZEND_ACC_RESOLVED_PARENT) {
+ ce = ce->parent;
} else {
- zend_string_addref(proto_class_name);
+ ce = zend_lookup_class_ex(ce->parent_name, NULL,
+ ZEND_FETCH_CLASS_ALLOW_UNLINKED | ZEND_FETCH_CLASS_NO_AUTOLOAD);
+ if (!ce) {
+ break;
+ }
}
+ if (ce == ce2) {
+ return 1;
+ }
+ }
- if (fe_class_name != proto_class_name && strcasecmp(ZSTR_VAL(fe_class_name), ZSTR_VAL(proto_class_name)) != 0) {
- if (fe->common.type != ZEND_USER_FUNCTION) {
- zend_string_release(proto_class_name);
- zend_string_release(fe_class_name);
- return 0;
- } else {
- zend_class_entry *fe_ce, *proto_ce;
-
- fe_ce = zend_lookup_class(fe_class_name);
- proto_ce = zend_lookup_class(proto_class_name);
-
- /* Check for class alias */
- if (!fe_ce || !proto_ce ||
- fe_ce->type == ZEND_INTERNAL_CLASS ||
- proto_ce->type == ZEND_INTERNAL_CLASS ||
- fe_ce != proto_ce) {
- zend_string_release(proto_class_name);
- zend_string_release(fe_class_name);
- return 0;
+ if (ce1->num_interfaces) {
+ uint32_t i;
+ if (ce1->ce_flags & ZEND_ACC_RESOLVED_INTERFACES) {
+ /* Unlike the normal instanceof_function(), we have to perform a recursive
+ * check here, as the parent interfaces might not have been fully copied yet. */
+ for (i = 0; i < ce1->num_interfaces; i++) {
+ if (unlinked_instanceof(ce1->interfaces[i], ce2)) {
+ return 1;
+ }
+ }
+ } else {
+ for (i = 0; i < ce1->num_interfaces; i++) {
+ ce = zend_lookup_class_ex(
+ ce1->interface_names[i].name, ce1->interface_names[i].lc_name,
+ ZEND_FETCH_CLASS_ALLOW_UNLINKED | ZEND_FETCH_CLASS_NO_AUTOLOAD);
+ if (ce && unlinked_instanceof(ce, ce2)) {
+ return 1;
}
}
}
- zend_string_release(proto_class_name);
- zend_string_release(fe_class_name);
- } else if (ZEND_TYPE_CODE(fe_arg_info->type) != ZEND_TYPE_CODE(proto_arg_info->type)) {
- /* Incompatible built-in types */
- return 0;
}
- return 1;
+ return 0;
+}
+
+/* Unresolved means that class declarations that are currently not available are needed to
+ * determine whether the inheritance is valid or not. At runtime UNRESOLVED should be treated
+ * as an ERROR. */
+typedef enum {
+ INHERITANCE_UNRESOLVED = -1,
+ INHERITANCE_ERROR = 0,
+ INHERITANCE_SUCCESS = 1,
+} inheritance_status;
+
+static inheritance_status zend_perform_covariant_type_check(
+ zend_string **unresolved_class,
+ const zend_function *fe, zend_arg_info *fe_arg_info,
+ const zend_function *proto, zend_arg_info *proto_arg_info) /* {{{ */
+{
+ zend_type fe_type = fe_arg_info->type, proto_type = proto_arg_info->type;
+ ZEND_ASSERT(ZEND_TYPE_IS_SET(fe_type) && ZEND_TYPE_IS_SET(proto_type));
+
+ if (ZEND_TYPE_ALLOW_NULL(fe_type) && !ZEND_TYPE_ALLOW_NULL(proto_type)) {
+ return INHERITANCE_ERROR;
+ }
+
+ if (ZEND_TYPE_IS_CLASS(proto_type)) {
+ zend_string *fe_class_name, *proto_class_name;
+ zend_class_entry *fe_ce, *proto_ce;
+ if (!ZEND_TYPE_IS_CLASS(fe_type)) {
+ return INHERITANCE_ERROR;
+ }
+
+ fe_class_name = resolve_class_name(fe->common.scope, ZEND_TYPE_NAME(fe_type));
+ proto_class_name = resolve_class_name(proto->common.scope, ZEND_TYPE_NAME(proto_type));
+ if (zend_string_equals_ci(fe_class_name, proto_class_name)) {
+ return INHERITANCE_SUCCESS;
+ }
+
+ /* Make sure to always load both classes, to avoid only registering one of them as
+ * a delayed autoload. */
+ fe_ce = lookup_class(fe->common.scope, fe_class_name);
+ proto_ce = lookup_class(proto->common.scope, proto_class_name);
+ if (!fe_ce) {
+ *unresolved_class = fe_class_name;
+ return INHERITANCE_UNRESOLVED;
+ }
+ if (!proto_ce) {
+ *unresolved_class = proto_class_name;
+ return INHERITANCE_UNRESOLVED;
+ }
+
+ return unlinked_instanceof(fe_ce, proto_ce) ? INHERITANCE_SUCCESS : INHERITANCE_ERROR;
+ } else if (ZEND_TYPE_CODE(proto_type) == IS_ITERABLE) {
+ if (ZEND_TYPE_IS_CLASS(fe_type)) {
+ zend_string *fe_class_name =
+ resolve_class_name(fe->common.scope, ZEND_TYPE_NAME(fe_type));
+ zend_class_entry *fe_ce = lookup_class(fe->common.scope, fe_class_name);
+ if (!fe_ce) {
+ *unresolved_class = fe_class_name;
+ return INHERITANCE_UNRESOLVED;
+ }
+ return unlinked_instanceof(fe_ce, zend_ce_traversable)
+ ? INHERITANCE_SUCCESS : INHERITANCE_ERROR;
+ }
+
+ return ZEND_TYPE_CODE(fe_type) == IS_ITERABLE || ZEND_TYPE_CODE(fe_type) == IS_ARRAY
+ ? INHERITANCE_SUCCESS : INHERITANCE_ERROR;
+ } else if (ZEND_TYPE_CODE(proto_type) == IS_OBJECT) {
+ if (ZEND_TYPE_IS_CLASS(fe_type)) {
+ /* Currently, any class name would be allowed here. We still perform a class lookup
+ * for forward-compatibility reasons, as we may have named types in the future that
+ * are not classes (such as enums or typedefs). */
+ zend_string *fe_class_name =
+ resolve_class_name(fe->common.scope, ZEND_TYPE_NAME(fe_type));
+ zend_class_entry *fe_ce = lookup_class(fe->common.scope, fe_class_name);
+ if (!fe_ce) {
+ *unresolved_class = fe_class_name;
+ return INHERITANCE_UNRESOLVED;
+ }
+ return INHERITANCE_SUCCESS;
+ }
+
+ return ZEND_TYPE_CODE(fe_type) == IS_OBJECT ? INHERITANCE_SUCCESS : INHERITANCE_ERROR;
+ } else {
+ return ZEND_TYPE_CODE(fe_type) == ZEND_TYPE_CODE(proto_type)
+ ? INHERITANCE_SUCCESS : INHERITANCE_ERROR;
+ }
}
/* }}} */
-static int zend_do_perform_arg_type_hint_check(const zend_function *fe, zend_arg_info *fe_arg_info, const zend_function *proto, zend_arg_info *proto_arg_info) /* {{{ */
+static inheritance_status zend_do_perform_arg_type_hint_check(
+ zend_string **unresolved_class,
+ const zend_function *fe, zend_arg_info *fe_arg_info,
+ const zend_function *proto, zend_arg_info *proto_arg_info) /* {{{ */
{
if (!ZEND_TYPE_IS_SET(fe_arg_info->type)) {
/* Child with no type is always compatible */
- return 1;
+ return INHERITANCE_SUCCESS;
}
if (!ZEND_TYPE_IS_SET(proto_arg_info->type)) {
/* Child defines a type, but parent doesn't, violates LSP */
- return 0;
+ return INHERITANCE_ERROR;
}
- return zend_do_perform_type_hint_check(fe, fe_arg_info, proto, proto_arg_info);
+ /* Contravariant type check is performed as a covariant type check with swapped
+ * argument order. */
+ return zend_perform_covariant_type_check(
+ unresolved_class, proto, proto_arg_info, fe, fe_arg_info);
}
/* }}} */
-static zend_bool zend_do_perform_implementation_check(const zend_function *fe, const zend_function *proto) /* {{{ */
+static inheritance_status zend_do_perform_implementation_check(
+ zend_string **unresolved_class, const zend_function *fe, const zend_function *proto) /* {{{ */
{
uint32_t i, num_args;
+ inheritance_status status, local_status;
/* If it's a user function then arg_info == NULL means we don't have any parameters but
* we still need to do the arg number checks. We are only willing to ignore this for internal
* functions because extensions don't always define arg_info.
*/
- if (!proto || (!proto->common.arg_info && proto->common.type != ZEND_USER_FUNCTION)) {
- return 1;
+ if (!proto->common.arg_info && proto->common.type != ZEND_USER_FUNCTION) {
+ return INHERITANCE_SUCCESS;
}
/* Checks for constructors only if they are declared in an interface,
* or explicitly marked as abstract
*/
- if ((fe->common.fn_flags & ZEND_ACC_CTOR)
+ ZEND_ASSERT(!((fe->common.fn_flags & ZEND_ACC_CTOR)
&& ((proto->common.scope->ce_flags & ZEND_ACC_INTERFACE) == 0
- && (proto->common.fn_flags & ZEND_ACC_ABSTRACT) == 0)) {
- return 1;
- }
+ && (proto->common.fn_flags & ZEND_ACC_ABSTRACT) == 0)));
/* If the prototype method is private do not enforce a signature */
- if (proto->common.fn_flags & ZEND_ACC_PRIVATE) {
- return 1;
- }
+ ZEND_ASSERT(!(proto->common.fn_flags & ZEND_ACC_PRIVATE));
/* check number of arguments */
if (proto->common.required_num_args < fe->common.required_num_args
|| proto->common.num_args > fe->common.num_args) {
- return 0;
+ return INHERITANCE_ERROR;
}
/* by-ref constraints on return values are covariant */
if ((proto->common.fn_flags & ZEND_ACC_RETURN_REFERENCE)
&& !(fe->common.fn_flags & ZEND_ACC_RETURN_REFERENCE)) {
- return 0;
+ return INHERITANCE_ERROR;
}
if ((proto->common.fn_flags & ZEND_ACC_VARIADIC)
&& !(fe->common.fn_flags & ZEND_ACC_VARIADIC)) {
- return 0;
+ return INHERITANCE_ERROR;
}
/* For variadic functions any additional (optional) arguments that were added must be
@@ -334,6 +474,7 @@ static zend_bool zend_do_perform_implementation_check(const zend_function *fe, c
}
}
+ status = INHERITANCE_SUCCESS;
for (i = 0; i < num_args; i++) {
zend_arg_info *fe_arg_info = &fe->common.arg_info[i];
@@ -344,28 +485,20 @@ static zend_bool zend_do_perform_implementation_check(const zend_function *fe, c
proto_arg_info = &proto->common.arg_info[proto->common.num_args];
}
- if (!zend_do_perform_arg_type_hint_check(fe, fe_arg_info, proto, proto_arg_info)) {
- switch (ZEND_TYPE_CODE(fe_arg_info->type)) {
- case IS_ITERABLE:
- if (!zend_iterable_compatibility_check(proto_arg_info)) {
- return 0;
- }
- break;
+ local_status = zend_do_perform_arg_type_hint_check(
+ unresolved_class, fe, fe_arg_info, proto, proto_arg_info);
- default:
- return 0;
+ if (UNEXPECTED(local_status != INHERITANCE_SUCCESS)) {
+ if (UNEXPECTED(local_status == INHERITANCE_ERROR)) {
+ return INHERITANCE_ERROR;
}
- }
-
- // This introduces BC break described at https://bugs.php.net/bug.php?id=72119
- if (ZEND_TYPE_IS_SET(proto_arg_info->type) && ZEND_TYPE_ALLOW_NULL(proto_arg_info->type) && !ZEND_TYPE_ALLOW_NULL(fe_arg_info->type)) {
- /* incompatible nullability */
- return 0;
+ ZEND_ASSERT(local_status == INHERITANCE_UNRESOLVED);
+ status = INHERITANCE_UNRESOLVED;
}
/* by-ref constraints on arguments are invariant */
if (fe_arg_info->pass_by_reference != proto_arg_info->pass_by_reference) {
- return 0;
+ return INHERITANCE_ERROR;
}
}
@@ -374,27 +507,22 @@ static zend_bool zend_do_perform_implementation_check(const zend_function *fe, c
if (proto->common.fn_flags & ZEND_ACC_HAS_RETURN_TYPE) {
/* Removing a return type is not valid. */
if (!(fe->common.fn_flags & ZEND_ACC_HAS_RETURN_TYPE)) {
- return 0;
+ return INHERITANCE_ERROR;
}
- if (!zend_do_perform_type_hint_check(fe, fe->common.arg_info - 1, proto, proto->common.arg_info - 1)) {
- switch (ZEND_TYPE_CODE(proto->common.arg_info[-1].type)) {
- case IS_ITERABLE:
- if (!zend_iterable_compatibility_check(fe->common.arg_info - 1)) {
- return 0;
- }
- break;
+ local_status = zend_perform_covariant_type_check(
+ unresolved_class, fe, fe->common.arg_info - 1, proto, proto->common.arg_info - 1);
- default:
- return 0;
+ if (UNEXPECTED(local_status != INHERITANCE_SUCCESS)) {
+ if (UNEXPECTED(local_status == INHERITANCE_ERROR)) {
+ return INHERITANCE_ERROR;
}
- }
-
- if (ZEND_TYPE_ALLOW_NULL(fe->common.arg_info[-1].type) && !ZEND_TYPE_ALLOW_NULL(proto->common.arg_info[-1].type)) {
- return 0;
+ ZEND_ASSERT(local_status == INHERITANCE_UNRESOLVED);
+ status = INHERITANCE_UNRESOLVED;
}
}
- return 1;
+
+ return status;
}
/* }}} */
@@ -559,112 +687,269 @@ static ZEND_COLD zend_string *zend_get_function_declaration(const zend_function
}
/* }}} */
-static void do_inheritance_check_on_method(zend_function *child, zend_function *parent) /* {{{ */
+static zend_always_inline uint32_t func_lineno(const zend_function *fn) {
+ return fn->common.type == ZEND_USER_FUNCTION ? fn->op_array.line_start : 0;
+}
+
+static void ZEND_COLD emit_incompatible_method_error(
+ int error_level, const char *error_verb,
+ const zend_function *child, const zend_function *parent,
+ inheritance_status status, zend_string *unresolved_class) {
+ zend_string *parent_prototype = zend_get_function_declaration(parent);
+ zend_string *child_prototype = zend_get_function_declaration(child);
+ if (status == INHERITANCE_UNRESOLVED) {
+ zend_error_at(error_level, NULL, func_lineno(child),
+ "Could not check compatibility between %s and %s, because class %s is not available",
+ ZSTR_VAL(child_prototype), ZSTR_VAL(parent_prototype), ZSTR_VAL(unresolved_class));
+ } else {
+ zend_error_at(error_level, NULL, func_lineno(child),
+ "Declaration of %s %s be compatible with %s",
+ ZSTR_VAL(child_prototype), error_verb, ZSTR_VAL(parent_prototype));
+ }
+ zend_string_efree(child_prototype);
+ zend_string_efree(parent_prototype);
+}
+
+static void ZEND_COLD emit_incompatible_method_error_or_warning(
+ const zend_function *child, const zend_function *parent,
+ inheritance_status status, zend_string *unresolved_class, zend_bool always_error) {
+ int error_level;
+ const char *error_verb;
+ if (always_error ||
+ (child->common.prototype &&
+ (child->common.prototype->common.fn_flags & ZEND_ACC_ABSTRACT)) ||
+ ((parent->common.fn_flags & ZEND_ACC_HAS_RETURN_TYPE) &&
+ (!(child->common.fn_flags & ZEND_ACC_HAS_RETURN_TYPE) ||
+ zend_perform_covariant_type_check(&unresolved_class, child, child->common.arg_info - 1, parent, parent->common.arg_info - 1) != INHERITANCE_SUCCESS))
+ ) {
+ error_level = E_COMPILE_ERROR;
+ error_verb = "must";
+ } else {
+ error_level = E_WARNING;
+ error_verb = "should";
+ }
+ emit_incompatible_method_error(
+ error_level, error_verb, child, parent, status, unresolved_class);
+}
+
+static void perform_delayable_implementation_check(
+ zend_class_entry *ce, const zend_function *fe,
+ const zend_function *proto, zend_bool always_error)
+{
+ zend_string *unresolved_class;
+ inheritance_status status = zend_do_perform_implementation_check(
+ &unresolved_class, fe, proto);
+
+ if (UNEXPECTED(status != INHERITANCE_SUCCESS)) {
+ if (EXPECTED(status == INHERITANCE_UNRESOLVED)) {
+ add_compatibility_obligation(ce, fe, proto, always_error);
+ } else {
+ ZEND_ASSERT(status == INHERITANCE_ERROR);
+ if (always_error) {
+ emit_incompatible_method_error(
+ E_COMPILE_ERROR, "must", fe, proto, status, unresolved_class);
+ } else {
+ emit_incompatible_method_error_or_warning(
+ fe, proto, status, unresolved_class, always_error);
+ }
+ }
+ }
+}
+
+static zend_always_inline inheritance_status do_inheritance_check_on_method_ex(zend_function *child, zend_function *parent, zend_class_entry *ce, zval *child_zv, zend_bool check_only, zend_bool checked) /* {{{ */
{
uint32_t child_flags;
uint32_t parent_flags = parent->common.fn_flags;
+ zend_function *proto;
- if (UNEXPECTED(parent_flags & ZEND_ACC_FINAL)) {
- zend_error_noreturn(E_COMPILE_ERROR, "Cannot override final method %s::%s()", ZEND_FN_SCOPE_NAME(parent), ZSTR_VAL(child->common.function_name));
+ if (!checked && UNEXPECTED(parent_flags & ZEND_ACC_FINAL)) {
+ if (check_only) {
+ return INHERITANCE_ERROR;
+ }
+ zend_error_at_noreturn(E_COMPILE_ERROR, NULL, func_lineno(child),
+ "Cannot override final method %s::%s()",
+ ZEND_FN_SCOPE_NAME(parent), ZSTR_VAL(child->common.function_name));
}
child_flags = child->common.fn_flags;
/* You cannot change from static to non static and vice versa.
*/
- if (UNEXPECTED((child_flags & ZEND_ACC_STATIC) != (parent_flags & ZEND_ACC_STATIC))) {
+ if (!checked && UNEXPECTED((child_flags & ZEND_ACC_STATIC) != (parent_flags & ZEND_ACC_STATIC))) {
+ if (check_only) {
+ return INHERITANCE_ERROR;
+ }
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));
+ zend_error_at_noreturn(E_COMPILE_ERROR, NULL, func_lineno(child),
+ "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));
+ zend_error_at_noreturn(E_COMPILE_ERROR, NULL, func_lineno(child),
+ "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));
}
}
/* Disallow making an inherited method abstract. */
- if (UNEXPECTED((child_flags & ZEND_ACC_ABSTRACT) > (parent_flags & ZEND_ACC_ABSTRACT))) {
- zend_error_noreturn(E_COMPILE_ERROR, "Cannot make non abstract method %s::%s() abstract in class %s", ZEND_FN_SCOPE_NAME(parent), ZSTR_VAL(child->common.function_name), ZEND_FN_SCOPE_NAME(child));
- }
-
- /* Prevent derived classes from restricting access that was available in parent classes (except deriving from non-abstract ctors) */
- if (UNEXPECTED((!(child_flags & ZEND_ACC_CTOR) || (parent_flags & (ZEND_ACC_ABSTRACT | ZEND_ACC_IMPLEMENTED_ABSTRACT))) &&
- (child_flags & ZEND_ACC_PPP_MASK) > (parent_flags & ZEND_ACC_PPP_MASK))) {
- 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 (!checked && UNEXPECTED((child_flags & ZEND_ACC_ABSTRACT) > (parent_flags & ZEND_ACC_ABSTRACT))) {
+ if (check_only) {
+ return INHERITANCE_ERROR;
+ }
+ zend_error_at_noreturn(E_COMPILE_ERROR, NULL, func_lineno(child),
+ "Cannot make non abstract method %s::%s() abstract in class %s",
+ ZEND_FN_SCOPE_NAME(parent), ZSTR_VAL(child->common.function_name), ZEND_FN_SCOPE_NAME(child));
}
- if ((child_flags & ZEND_ACC_PRIVATE) < (parent_flags & (ZEND_ACC_PRIVATE|ZEND_ACC_CHANGED))) {
+ if (!check_only && (parent_flags & (ZEND_ACC_PRIVATE|ZEND_ACC_CHANGED))) {
child->common.fn_flags |= ZEND_ACC_CHANGED;
}
if (parent_flags & ZEND_ACC_PRIVATE) {
- child->common.prototype = NULL;
- } 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)) {
- 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;
+ return INHERITANCE_SUCCESS;
+ }
+
+ proto = parent->common.prototype ?
+ parent->common.prototype : parent;
+
+ if (parent_flags & ZEND_ACC_CTOR) {
+ /* ctors only have a prototype if is abstract (or comes from an interface) */
/* and if that is the case, we want to check inheritance against it */
- parent = child->common.prototype;
- }
-
- if (UNEXPECTED(!zend_do_perform_implementation_check(child, parent))) {
- int error_level;
- const char *error_verb;
- zend_string *method_prototype = zend_get_function_declaration(parent);
- zend_string *child_prototype = zend_get_function_declaration(child);
-
- if (child->common.prototype && (
- child->common.prototype->common.fn_flags & ZEND_ACC_ABSTRACT
- )) {
- error_level = E_COMPILE_ERROR;
- error_verb = "must";
- } else if ((parent->common.fn_flags & ZEND_ACC_HAS_RETURN_TYPE) &&
- (!(child->common.fn_flags & ZEND_ACC_HAS_RETURN_TYPE) ||
- !zend_do_perform_type_hint_check(child, child->common.arg_info - 1, parent, parent->common.arg_info - 1) ||
- (ZEND_TYPE_ALLOW_NULL(child->common.arg_info[-1].type) && !ZEND_TYPE_ALLOW_NULL(parent->common.arg_info[-1].type)))) {
- error_level = E_COMPILE_ERROR;
- error_verb = "must";
- } else {
- error_level = E_WARNING;
- error_verb = "should";
+ if (!(proto->common.fn_flags & ZEND_ACC_ABSTRACT)) {
+ return INHERITANCE_SUCCESS;
+ }
+ parent = proto;
+ }
+
+ if (!check_only && child->common.prototype != proto) {
+ do {
+ if (child->common.scope != ce
+ && child->type == ZEND_USER_FUNCTION
+ && !child->op_array.static_variables) {
+ if (ce->ce_flags & ZEND_ACC_INTERFACE) {
+ /* Few parent interfaces contain the same method */
+ break;
+ } else if (child_zv) {
+ /* op_array wasn't duplicated yet */
+ zend_function *new_function = zend_arena_alloc(&CG(arena), sizeof(zend_op_array));
+ memcpy(new_function, child, sizeof(zend_op_array));
+ Z_PTR_P(child_zv) = child = new_function;
+ }
+ }
+ child->common.prototype = proto;
+ } while (0);
+ }
+
+ /* Prevent derived classes from restricting access that was available in parent classes (except deriving from non-abstract ctors) */
+ if (!checked && (child_flags & ZEND_ACC_PPP_MASK) > (parent_flags & ZEND_ACC_PPP_MASK)) {
+ if (check_only) {
+ return INHERITANCE_ERROR;
+ }
+ zend_error_at_noreturn(E_COMPILE_ERROR, NULL, func_lineno(child),
+ "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 (!checked) {
+ if (check_only) {
+ zend_string *unresolved_class;
+
+ return zend_do_perform_implementation_check(
+ &unresolved_class, child, parent);
}
- zend_error(error_level, "Declaration of %s %s be compatible with %s", ZSTR_VAL(child_prototype), error_verb, ZSTR_VAL(method_prototype));
- zend_string_efree(child_prototype);
- zend_string_efree(method_prototype);
+ perform_delayable_implementation_check(
+ ce, child, parent, /*always_error*/0);
}
+ return INHERITANCE_SUCCESS;
}
/* }}} */
-static zend_function *do_inherit_method(zend_string *key, zend_function *parent, zend_class_entry *ce) /* {{{ */
+static zend_never_inline void do_inheritance_check_on_method(zend_function *child, zend_function *parent, zend_class_entry *ce, zval *child_zv) /* {{{ */
+{
+ do_inheritance_check_on_method_ex(child, parent, ce, child_zv, 0, 0);
+}
+/* }}} */
+
+static zend_always_inline void do_inherit_method(zend_string *key, zend_function *parent, zend_class_entry *ce, zend_bool is_interface, zend_bool checked) /* {{{ */
{
zval *child = zend_hash_find_ex(&ce->function_table, key, 1);
if (child) {
zend_function *func = (zend_function*)Z_PTR_P(child);
- zend_function *orig_prototype = func->common.prototype;
- do_inheritance_check_on_method(func, parent);
- if (func->common.prototype != orig_prototype &&
- func->type == ZEND_USER_FUNCTION &&
- func->common.scope != ce &&
- !func->op_array.static_variables) {
- /* Lazy duplication */
- zend_function *new_function = zend_arena_alloc(&CG(arena), sizeof(zend_op_array));
- memcpy(new_function, func, sizeof(zend_op_array));
- Z_PTR_P(child) = new_function;
- func->common.prototype = orig_prototype;
+ if (is_interface && UNEXPECTED(func == parent)) {
+ /* The same method in interface may be inherited few times */
+ return;
}
- return NULL;
+
+ if (checked) {
+ do_inheritance_check_on_method_ex(func, parent, ce, child, 0, checked);
+ } else {
+ do_inheritance_check_on_method(func, parent, ce, child);
+ }
+ } else {
+
+ if (is_interface || (parent->common.fn_flags & (ZEND_ACC_ABSTRACT))) {
+ ce->ce_flags |= ZEND_ACC_IMPLICIT_ABSTRACT_CLASS;
+ }
+
+ parent = zend_duplicate_function(parent, ce, is_interface);
+
+ if (!is_interface) {
+ _zend_hash_append_ptr(&ce->function_table, key, parent);
+ } else {
+ zend_hash_add_new_ptr(&ce->function_table, key, parent);
+ }
+ }
+}
+/* }}} */
+
+inheritance_status property_types_compatible(
+ const zend_property_info *parent_info, const zend_property_info *child_info) {
+ zend_string *parent_name, *child_name;
+ zend_class_entry *parent_type_ce, *child_type_ce;
+ if (parent_info->type == child_info->type) {
+ return INHERITANCE_SUCCESS;
+ }
+
+ if (!ZEND_TYPE_IS_CLASS(parent_info->type) || !ZEND_TYPE_IS_CLASS(child_info->type) ||
+ ZEND_TYPE_ALLOW_NULL(parent_info->type) != ZEND_TYPE_ALLOW_NULL(child_info->type)) {
+ return INHERITANCE_ERROR;
}
- if (parent->common.fn_flags & (ZEND_ACC_ABSTRACT)) {
- ce->ce_flags |= ZEND_ACC_IMPLICIT_ABSTRACT_CLASS;
+ parent_name = ZEND_TYPE_IS_CE(parent_info->type)
+ ? ZEND_TYPE_CE(parent_info->type)->name
+ : resolve_class_name(parent_info->ce, ZEND_TYPE_NAME(parent_info->type));
+ child_name = ZEND_TYPE_IS_CE(child_info->type)
+ ? ZEND_TYPE_CE(child_info->type)->name
+ : resolve_class_name(child_info->ce, ZEND_TYPE_NAME(child_info->type));
+ if (zend_string_equals_ci(parent_name, child_name)) {
+ return INHERITANCE_SUCCESS;
}
- return zend_duplicate_function(parent, ce);
+ /* Check for class aliases */
+ parent_type_ce = ZEND_TYPE_IS_CE(parent_info->type)
+ ? ZEND_TYPE_CE(parent_info->type)
+ : lookup_class(parent_info->ce, parent_name);
+ child_type_ce = ZEND_TYPE_IS_CE(child_info->type)
+ ? ZEND_TYPE_CE(child_info->type)
+ : lookup_class(child_info->ce, child_name);
+ if (!parent_type_ce || !child_type_ce) {
+ return INHERITANCE_UNRESOLVED;
+ }
+ return parent_type_ce == child_type_ce ? INHERITANCE_SUCCESS : INHERITANCE_ERROR;
+}
+
+static void emit_incompatible_property_error(
+ const zend_property_info *child, const zend_property_info *parent) {
+ zend_error_noreturn(E_COMPILE_ERROR,
+ "Type of %s::$%s must be %s%s (as in class %s)",
+ ZSTR_VAL(child->ce->name),
+ zend_get_unmangled_property_name(child->name),
+ ZEND_TYPE_ALLOW_NULL(parent->type) ? "?" : "",
+ ZEND_TYPE_IS_CLASS(parent->type)
+ ? ZSTR_VAL(ZEND_TYPE_IS_CE(parent->type) ? ZEND_TYPE_CE(parent->type)->name : resolve_class_name(parent->ce, ZEND_TYPE_NAME(parent->type)))
+ : zend_get_type_by_const(ZEND_TYPE_CODE(parent->type)),
+ ZSTR_VAL(parent->ce->name));
}
-/* }}} */
static void do_inherit_property(zend_property_info *parent_info, zend_string *key, zend_class_entry *ce) /* {{{ */
{
@@ -673,19 +958,16 @@ static void do_inherit_property(zend_property_info *parent_info, zend_string *ke
if (UNEXPECTED(child)) {
child_info = Z_PTR_P(child);
- if (UNEXPECTED(parent_info->flags & (ZEND_ACC_PRIVATE|ZEND_ACC_SHADOW))) {
+ if (parent_info->flags & (ZEND_ACC_PRIVATE|ZEND_ACC_CHANGED)) {
child_info->flags |= ZEND_ACC_CHANGED;
- } else {
+ }
+ if (!(parent_info->flags & ZEND_ACC_PRIVATE)) {
if (UNEXPECTED((parent_info->flags & ZEND_ACC_STATIC) != (child_info->flags & ZEND_ACC_STATIC))) {
zend_error_noreturn(E_COMPILE_ERROR, "Cannot redeclare %s%s::$%s as %s%s::$%s",
(parent_info->flags & ZEND_ACC_STATIC) ? "static " : "non static ", ZSTR_VAL(ce->parent->name), ZSTR_VAL(key),
(child_info->flags & ZEND_ACC_STATIC) ? "static " : "non static ", ZSTR_VAL(ce->name), ZSTR_VAL(key));
}
- if (parent_info->flags & ZEND_ACC_CHANGED) {
- child_info->flags |= ZEND_ACC_CHANGED;
- }
-
if (UNEXPECTED((child_info->flags & ZEND_ACC_PPP_MASK) > (parent_info->flags & 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(key), zend_visibility_string(parent_info->flags), ZSTR_VAL(ce->parent->name), (parent_info->flags&ZEND_ACC_PUBLIC) ? "" : " or weaker");
} else if ((child_info->flags & ZEND_ACC_STATIC) == 0) {
@@ -698,22 +980,28 @@ static void do_inherit_property(zend_property_info *parent_info, zend_string *ke
ZVAL_UNDEF(&ce->default_properties_table[child_num]);
child_info->offset = parent_info->offset;
}
+
+ if (UNEXPECTED(ZEND_TYPE_IS_SET(parent_info->type))) {
+ inheritance_status status = property_types_compatible(parent_info, child_info);
+ if (status == INHERITANCE_ERROR) {
+ emit_incompatible_property_error(child_info, parent_info);
+ }
+ if (status == INHERITANCE_UNRESOLVED) {
+ add_property_compatibility_obligation(ce, child_info, parent_info);
+ }
+ } else if (UNEXPECTED(ZEND_TYPE_IS_SET(child_info->type) && !ZEND_TYPE_IS_SET(parent_info->type))) {
+ zend_error_noreturn(E_COMPILE_ERROR,
+ "Type of %s::$%s must not be defined (as in class %s)",
+ ZSTR_VAL(ce->name),
+ ZSTR_VAL(key),
+ ZSTR_VAL(ce->parent->name));
+ }
}
} else {
- if (UNEXPECTED(parent_info->flags & ZEND_ACC_PRIVATE)) {
- if (UNEXPECTED(ce->type & ZEND_INTERNAL_CLASS)) {
- child_info = zend_duplicate_property_info_internal(parent_info);
- } else {
- child_info = zend_duplicate_property_info(parent_info);
- }
- child_info->flags &= ~ZEND_ACC_PRIVATE; /* it's not private anymore */
- child_info->flags |= ZEND_ACC_SHADOW; /* but it's a shadow of private */
+ if (UNEXPECTED(ce->type & ZEND_INTERNAL_CLASS)) {
+ child_info = zend_duplicate_property_info_internal(parent_info);
} else {
- if (UNEXPECTED(ce->type & ZEND_INTERNAL_CLASS)) {
- child_info = zend_duplicate_property_info_internal(parent_info);
- } else {
- child_info = parent_info;
- }
+ child_info = parent_info;
}
_zend_hash_append_ptr(&ce->properties_info, key, child_info);
}
@@ -725,21 +1013,17 @@ static inline void do_implement_interface(zend_class_entry *ce, zend_class_entry
if (!(ce->ce_flags & ZEND_ACC_INTERFACE) && iface->interface_gets_implemented && iface->interface_gets_implemented(iface, ce) == FAILURE) {
zend_error_noreturn(E_CORE_ERROR, "Class %s could not implement interface %s", ZSTR_VAL(ce->name), ZSTR_VAL(iface->name));
}
- if (UNEXPECTED(ce == iface)) {
- zend_error_noreturn(E_ERROR, "Interface %s cannot implement itself", ZSTR_VAL(ce->name));
- }
+ /* This should be prevented by the class lookup logic. */
+ ZEND_ASSERT(ce != iface);
}
/* }}} */
-ZEND_API void zend_do_inherit_interfaces(zend_class_entry *ce, const zend_class_entry *iface) /* {{{ */
+static void zend_do_inherit_interfaces(zend_class_entry *ce, const zend_class_entry *iface) /* {{{ */
{
/* expects interface to be contained in ce's interface list already */
uint32_t i, ce_num, if_num = iface->num_interfaces;
zend_class_entry *entry;
- if (if_num==0) {
- return;
- }
ce_num = ce->num_interfaces;
if (ce->type == ZEND_INTERNAL_CLASS) {
@@ -760,6 +1044,7 @@ ZEND_API void zend_do_inherit_interfaces(zend_class_entry *ce, const zend_class_
ce->interfaces[ce->num_interfaces++] = entry;
}
}
+ ce->ce_flags |= ZEND_ACC_RESOLVED_INTERFACES;
/* and now call the implementing handlers */
while (ce_num < ce->num_interfaces) {
@@ -793,7 +1078,46 @@ static void do_inherit_class_constant(zend_string *name, zend_class_constant *pa
}
/* }}} */
-ZEND_API void zend_do_inheritance(zend_class_entry *ce, zend_class_entry *parent_ce) /* {{{ */
+void zend_build_properties_info_table(zend_class_entry *ce)
+{
+ zend_property_info **table, *prop;
+ size_t size;
+ if (ce->default_properties_count == 0) {
+ return;
+ }
+
+ ZEND_ASSERT(ce->properties_info_table == NULL);
+ size = sizeof(zend_property_info *) * ce->default_properties_count;
+ if (ce->type == ZEND_USER_CLASS) {
+ ce->properties_info_table = table = zend_arena_alloc(&CG(arena), size);
+ } else {
+ ce->properties_info_table = table = pemalloc(size, 1);
+ }
+
+ /* Dead slots may be left behind during inheritance. Make sure these are NULLed out. */
+ memset(table, 0, size);
+
+ if (ce->parent && ce->parent->default_properties_count != 0) {
+ zend_property_info **parent_table = ce->parent->properties_info_table;
+ memcpy(
+ table, parent_table,
+ sizeof(zend_property_info *) * ce->parent->default_properties_count
+ );
+
+ /* Child did not add any new properties, we are done */
+ if (ce->default_properties_count == ce->parent->default_properties_count) {
+ return;
+ }
+ }
+
+ ZEND_HASH_FOREACH_PTR(&ce->properties_info, prop) {
+ if (prop->ce == ce && (prop->flags & ZEND_ACC_STATIC) == 0) {
+ table[OBJ_PROP_TO_NUM(prop->offset)] = prop;
+ }
+ } ZEND_HASH_FOREACH_END();
+}
+
+ZEND_API void zend_do_inheritance_ex(zend_class_entry *ce, zend_class_entry *parent_ce, zend_bool checked) /* {{{ */
{
zend_property_info *property_info;
zend_function *func;
@@ -818,10 +1142,24 @@ ZEND_API void zend_do_inheritance(zend_class_entry *ce, zend_class_entry *parent
}
}
+ if (ce->parent_name) {
+ zend_string_release_ex(ce->parent_name, 0);
+ }
ce->parent = parent_ce;
+ ce->ce_flags |= ZEND_ACC_RESOLVED_PARENT;
/* Inherit interfaces */
- zend_do_inherit_interfaces(ce, parent_ce);
+ if (parent_ce->num_interfaces) {
+ if (!(ce->ce_flags & ZEND_ACC_IMPLEMENT_INTERFACES)) {
+ zend_do_inherit_interfaces(ce, parent_ce);
+ } else {
+ uint32_t i;
+
+ for (i = 0; i < parent_ce->num_interfaces; i++) {
+ do_implement_interface(ce, parent_ce->interfaces[i]);
+ }
+ }
+ }
/* Inherit properties */
if (parent_ce->default_properties_count) {
@@ -836,7 +1174,7 @@ ZEND_API void zend_do_inheritance(zend_class_entry *ce, zend_class_entry *parent
do {
dst--;
src--;
- ZVAL_COPY_VALUE(dst, src);
+ ZVAL_COPY_VALUE_PROP(dst, src);
} while (dst != end);
pefree(src, ce->type == ZEND_INTERNAL_CLASS);
end = ce->default_properties_table;
@@ -851,7 +1189,7 @@ ZEND_API void zend_do_inheritance(zend_class_entry *ce, zend_class_entry *parent
do {
dst--;
src--;
- ZVAL_COPY_OR_DUP(dst, src);
+ ZVAL_COPY_OR_DUP_PROP(dst, src);
if (Z_OPT_TYPE_P(dst) == IS_CONSTANT_AST) {
ce->ce_flags &= ~ZEND_ACC_CONSTANTS_UPDATED;
}
@@ -861,7 +1199,7 @@ ZEND_API void zend_do_inheritance(zend_class_entry *ce, zend_class_entry *parent
do {
dst--;
src--;
- ZVAL_COPY(dst, src);
+ ZVAL_COPY_PROP(dst, src);
if (Z_OPT_TYPE_P(dst) == IS_CONSTANT_AST) {
ce->ce_flags &= ~ZEND_ACC_CONSTANTS_UPDATED;
}
@@ -911,7 +1249,11 @@ ZEND_API void zend_do_inheritance(zend_class_entry *ce, zend_class_entry *parent
}
} while (dst != end);
} else if (ce->type == ZEND_USER_CLASS) {
- src = parent_ce->default_static_members_table + parent_ce->default_static_members_count;
+ if (CE_STATIC_MEMBERS(parent_ce) == NULL) {
+ ZEND_ASSERT(parent_ce->ce_flags & (ZEND_ACC_IMMUTABLE|ZEND_ACC_PRELOADED));
+ zend_class_init_statics(parent_ce);
+ }
+ src = CE_STATIC_MEMBERS(parent_ce) + parent_ce->default_static_members_count;
do {
dst--;
src--;
@@ -937,8 +1279,14 @@ ZEND_API void zend_do_inheritance(zend_class_entry *ce, zend_class_entry *parent
} 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;
+ if (!ZEND_MAP_PTR(ce->static_members_table)) {
+ ZEND_ASSERT(ce->type == ZEND_INTERNAL_CLASS);
+ if (!EG(current_execute_data)) {
+ ZEND_MAP_PTR_NEW(ce->static_members_table);
+ } else {
+ /* internal class loaded by dl() */
+ ZEND_MAP_PTR_INIT(ce->static_members_table, &ce->default_static_members_table);
+ }
}
}
@@ -979,24 +1327,25 @@ ZEND_API void zend_do_inheritance(zend_class_entry *ce, zend_class_entry *parent
zend_hash_num_elements(&ce->function_table) +
zend_hash_num_elements(&parent_ce->function_table), 0);
- ZEND_HASH_FOREACH_STR_KEY_PTR(&parent_ce->function_table, key, func) {
- zend_function *new_func = do_inherit_method(key, func, ce);
-
- if (new_func) {
- _zend_hash_append_ptr(&ce->function_table, key, new_func);
- }
- } ZEND_HASH_FOREACH_END();
+ if (checked) {
+ ZEND_HASH_FOREACH_STR_KEY_PTR(&parent_ce->function_table, key, func) {
+ do_inherit_method(key, func, ce, 0, 1);
+ } ZEND_HASH_FOREACH_END();
+ } else {
+ ZEND_HASH_FOREACH_STR_KEY_PTR(&parent_ce->function_table, key, func) {
+ do_inherit_method(key, func, ce, 0, 0);
+ } ZEND_HASH_FOREACH_END();
+ }
}
do_inherit_parent_constructor(ce);
- if (ce->ce_flags & ZEND_ACC_IMPLICIT_ABSTRACT_CLASS && ce->type == ZEND_INTERNAL_CLASS) {
- ce->ce_flags |= ZEND_ACC_EXPLICIT_ABSTRACT_CLASS;
- } else if (!(ce->ce_flags & (ZEND_ACC_IMPLEMENT_INTERFACES|ZEND_ACC_IMPLEMENT_TRAITS))) {
- /* The verification will be done in runtime by ZEND_VERIFY_ABSTRACT_CLASS */
- zend_verify_abstract_class(ce);
+ if (ce->type == ZEND_INTERNAL_CLASS) {
+ if (ce->ce_flags & ZEND_ACC_IMPLICIT_ABSTRACT_CLASS) {
+ ce->ce_flags |= ZEND_ACC_EXPLICIT_ABSTRACT_CLASS;
+ }
}
- ce->ce_flags |= parent_ce->ce_flags & (ZEND_HAS_STATIC_IN_METHODS | ZEND_ACC_USE_GUARDS);
+ ce->ce_flags |= parent_ce->ce_flags & (ZEND_HAS_STATIC_IN_METHODS | ZEND_ACC_HAS_TYPE_HINTS | ZEND_ACC_USE_GUARDS);
}
/* }}} */
@@ -1033,15 +1382,37 @@ static void do_inherit_iface_constant(zend_string *name, zend_class_constant *c,
}
/* }}} */
+static void do_interface_implementation(zend_class_entry *ce, zend_class_entry *iface) /* {{{ */
+{
+ zend_function *func;
+ zend_string *key;
+ zend_class_constant *c;
+
+ ZEND_HASH_FOREACH_STR_KEY_PTR(&iface->constants_table, key, c) {
+ do_inherit_iface_constant(key, c, ce, iface);
+ } ZEND_HASH_FOREACH_END();
+
+ ZEND_HASH_FOREACH_STR_KEY_PTR(&iface->function_table, key, func) {
+ do_inherit_method(key, func, ce, 1, 0);
+ } ZEND_HASH_FOREACH_END();
+
+ do_implement_interface(ce, iface);
+ if (iface->num_interfaces) {
+ zend_do_inherit_interfaces(ce, iface);
+ }
+}
+/* }}} */
+
ZEND_API void zend_do_implement_interface(zend_class_entry *ce, zend_class_entry *iface) /* {{{ */
{
uint32_t i, ignore = 0;
uint32_t current_iface_num = ce->num_interfaces;
uint32_t parent_iface_num = ce->parent ? ce->parent->num_interfaces : 0;
- zend_function *func;
zend_string *key;
zend_class_constant *c;
+ ZEND_ASSERT(ce->ce_flags & ZEND_ACC_LINKED);
+
for (i = 0; i < ce->num_interfaces; i++) {
if (ce->interfaces[i] == NULL) {
memmove(ce->interfaces + i, ce->interfaces + i + 1, sizeof(zend_class_entry*) * (--ce->num_interfaces - i));
@@ -1069,67 +1440,76 @@ ZEND_API void zend_do_implement_interface(zend_class_entry *ce, zend_class_entry
}
ce->interfaces[ce->num_interfaces++] = iface;
- ZEND_HASH_FOREACH_STR_KEY_PTR(&iface->constants_table, key, c) {
- do_inherit_iface_constant(key, c, ce, iface);
- } ZEND_HASH_FOREACH_END();
-
- ZEND_HASH_FOREACH_STR_KEY_PTR(&iface->function_table, key, func) {
- zend_function *new_func = do_inherit_method(key, func, ce);
-
- if (new_func) {
- zend_hash_add_new_ptr(&ce->function_table, key, new_func);
- }
- } ZEND_HASH_FOREACH_END();
-
- do_implement_interface(ce, iface);
- zend_do_inherit_interfaces(ce, iface);
+ do_interface_implementation(ce, iface);
}
}
/* }}} */
-ZEND_API void zend_do_implement_trait(zend_class_entry *ce, zend_class_entry *trait) /* {{{ */
+static void zend_do_implement_interfaces(zend_class_entry *ce, zend_class_entry **interfaces) /* {{{ */
{
- uint32_t i, ignore = 0;
- uint32_t current_trait_num = ce->num_traits;
- uint32_t parent_trait_num = ce->parent ? ce->parent->num_traits : 0;
+ zend_class_entry *iface;
+ uint32_t num_parent_interfaces = ce->parent ? ce->parent->num_interfaces : 0;
+ uint32_t num_interfaces = num_parent_interfaces;
+ zend_string *key;
+ zend_class_constant *c;
+ uint32_t i, j;
- for (i = 0; i < ce->num_traits; i++) {
- if (ce->traits[i] == NULL) {
- memmove(ce->traits + i, ce->traits + i + 1, sizeof(zend_class_entry*) * (--ce->num_traits - i));
- i--;
- } else if (ce->traits[i] == trait) {
- if (i < parent_trait_num) {
- ignore = 1;
- }
+ for (i = 0; i < ce->num_interfaces; i++) {
+ iface = interfaces[num_parent_interfaces + i];
+ if (!(iface->ce_flags & ZEND_ACC_LINKED)) {
+ add_dependency_obligation(ce, iface);
}
- }
- if (!ignore) {
- if (ce->num_traits >= current_trait_num) {
- if (ce->type == ZEND_INTERNAL_CLASS) {
- ce->traits = (zend_class_entry **) realloc(ce->traits, sizeof(zend_class_entry *) * (++current_trait_num));
- } else {
- ce->traits = (zend_class_entry **) erealloc(ce->traits, sizeof(zend_class_entry *) * (++current_trait_num));
+ if (UNEXPECTED(!(iface->ce_flags & ZEND_ACC_INTERFACE))) {
+ efree(interfaces);
+ zend_error_noreturn(E_ERROR, "%s cannot implement %s - it is not an interface", ZSTR_VAL(ce->name), ZSTR_VAL(iface->name));
+ return;
+ }
+ for (j = 0; j < num_interfaces; j++) {
+ if (interfaces[j] == iface) {
+ if (j >= num_parent_interfaces) {
+ efree(interfaces);
+ zend_error_noreturn(E_COMPILE_ERROR, "Class %s cannot implement previously implemented interface %s", ZSTR_VAL(ce->name), ZSTR_VAL(iface->name));
+ return;
+ }
+ /* skip duplications */
+ ZEND_HASH_FOREACH_STR_KEY_PTR(&ce->constants_table, key, c) {
+ do_inherit_constant_check(&iface->constants_table, c, key, iface);
+ } ZEND_HASH_FOREACH_END();
+
+ iface = NULL;
+ break;
}
}
- ce->traits[ce->num_traits++] = trait;
+ if (iface) {
+ interfaces[num_interfaces] = iface;
+ num_interfaces++;
+ }
}
-}
-/* }}} */
-static zend_bool zend_traits_method_compatibility_check(zend_function *fn, zend_function *other_fn) /* {{{ */
-{
- uint32_t fn_flags = fn->common.scope->ce_flags;
- uint32_t other_flags = other_fn->common.scope->ce_flags;
+ for (i = 0; i < ce->num_interfaces; i++) {
+ zend_string_release_ex(ce->interface_names[i].name, 0);
+ zend_string_release_ex(ce->interface_names[i].lc_name, 0);
+ }
+ efree(ce->interface_names);
+
+ ce->num_interfaces = num_interfaces;
+ ce->interfaces = interfaces;
+ ce->ce_flags |= ZEND_ACC_RESOLVED_INTERFACES;
- return zend_do_perform_implementation_check(fn, other_fn)
- && ((fn_flags & (ZEND_ACC_FINAL|ZEND_ACC_STATIC)) ==
- (other_flags & (ZEND_ACC_FINAL|ZEND_ACC_STATIC))); /* equal final and static qualifier */
+ i = num_parent_interfaces;
+ for (; i < ce->num_interfaces; i++) {
+ do_interface_implementation(ce, ce->interfaces[i]);
+ }
}
/* }}} */
static void zend_add_magic_methods(zend_class_entry* ce, zend_string* mname, zend_function* fe) /* {{{ */
{
- if (ZSTR_LEN(ce->name) != ZSTR_LEN(mname) && (ZSTR_VAL(mname)[0] != '_' || ZSTR_VAL(mname)[1] != '_')) {
+ if (zend_string_equals_literal(mname, "serialize")) {
+ ce->serialize_func = fe;
+ } else if (zend_string_equals_literal(mname, "unserialize")) {
+ ce->unserialize_func = fe;
+ } else 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;
@@ -1137,9 +1517,9 @@ static void zend_add_magic_methods(zend_class_entry* ce, zend_string* mname, zen
if (ce->constructor && (!ce->parent || ce->constructor != ce->parent->constructor)) {
zend_error_noreturn(E_COMPILE_ERROR, "%s has colliding constructor definitions coming from traits", ZSTR_VAL(ce->name));
}
- ce->constructor = fe; fe->common.fn_flags |= ZEND_ACC_CTOR;
+ ce->constructor = fe;
} else if (zend_string_equals_literal(mname, ZEND_DESTRUCTOR_FUNC_NAME)) {
- ce->destructor = fe; fe->common.fn_flags |= ZEND_ACC_DTOR;
+ ce->destructor = fe;
} else if (zend_string_equals_literal(mname, ZEND_GET_FUNC_NAME)) {
ce->__get = fe;
ce->ce_flags |= ZEND_ACC_USE_GUARDS;
@@ -1164,7 +1544,7 @@ static void zend_add_magic_methods(zend_class_entry* ce, zend_string* mname, zen
zend_string *lowercase_name = zend_string_tolower(ce->name);
lowercase_name = zend_new_interned_string(lowercase_name);
if (!memcmp(ZSTR_VAL(mname), ZSTR_VAL(lowercase_name), ZSTR_LEN(mname))) {
- if (ce->constructor && (!ce->parent || ce->constructor != ce->parent->constructor)) {
+ if (ce->constructor && (!ce->parent || ce->constructor != ce->parent->constructor)) {
zend_error_noreturn(E_COMPILE_ERROR, "%s has colliding constructor definitions coming from traits", ZSTR_VAL(ce->name));
}
ce->constructor = fe;
@@ -1175,7 +1555,7 @@ static void zend_add_magic_methods(zend_class_entry* ce, zend_string* mname, zen
}
/* }}} */
-static void zend_add_trait_method(zend_class_entry *ce, const char *name, zend_string *key, zend_function *fn, HashTable **overriden) /* {{{ */
+static void zend_add_trait_method(zend_class_entry *ce, const char *name, zend_string *key, zend_function *fn, HashTable **overridden) /* {{{ */
{
zend_function *existing_fn = NULL;
zend_function *new_fn;
@@ -1191,50 +1571,35 @@ static void zend_add_trait_method(zend_class_entry *ce, const char *name, zend_s
if (existing_fn->common.scope == ce) {
/* members from the current class override trait methods */
- /* use temporary *overriden HashTable to detect hidden conflict */
- if (*overriden) {
- if ((existing_fn = zend_hash_find_ptr(*overriden, key)) != NULL) {
+ /* use temporary *overridden HashTable to detect hidden conflict */
+ if (*overridden) {
+ if ((existing_fn = zend_hash_find_ptr(*overridden, key)) != NULL) {
if (existing_fn->common.fn_flags & ZEND_ACC_ABSTRACT) {
/* Make sure the trait method is compatible with previosly declared abstract method */
- if (UNEXPECTED(!zend_traits_method_compatibility_check(fn, existing_fn))) {
- zend_error_noreturn(E_COMPILE_ERROR, "Declaration of %s must be compatible with %s",
- ZSTR_VAL(zend_get_function_declaration(fn)),
- ZSTR_VAL(zend_get_function_declaration(existing_fn)));
- }
+ perform_delayable_implementation_check(
+ ce, fn, existing_fn, /*always_error*/ 1);
}
if (fn->common.fn_flags & ZEND_ACC_ABSTRACT) {
/* Make sure the abstract declaration is compatible with previous declaration */
- if (UNEXPECTED(!zend_traits_method_compatibility_check(existing_fn, fn))) {
- zend_error_noreturn(E_COMPILE_ERROR, "Declaration of %s must be compatible with %s",
- ZSTR_VAL(zend_get_function_declaration(existing_fn)),
- ZSTR_VAL(zend_get_function_declaration(fn)));
- }
+ perform_delayable_implementation_check(
+ ce, existing_fn, fn, /*always_error*/ 1);
return;
}
}
} else {
- ALLOC_HASHTABLE(*overriden);
- zend_hash_init_ex(*overriden, 8, NULL, overriden_ptr_dtor, 0, 0);
+ ALLOC_HASHTABLE(*overridden);
+ zend_hash_init_ex(*overridden, 8, NULL, overridden_ptr_dtor, 0, 0);
}
- zend_hash_update_mem(*overriden, key, fn, sizeof(zend_function));
+ zend_hash_update_mem(*overridden, key, fn, sizeof(zend_function));
return;
- } else if (existing_fn->common.fn_flags & ZEND_ACC_ABSTRACT &&
- (existing_fn->common.scope->ce_flags & ZEND_ACC_INTERFACE) == 0) {
- /* Make sure the trait method is compatible with previosly declared abstract method */
- if (UNEXPECTED(!zend_traits_method_compatibility_check(fn, existing_fn))) {
- zend_error_noreturn(E_COMPILE_ERROR, "Declaration of %s must be compatible with %s",
- ZSTR_VAL(zend_get_function_declaration(fn)),
- ZSTR_VAL(zend_get_function_declaration(existing_fn)));
- }
- } else if (fn->common.fn_flags & ZEND_ACC_ABSTRACT) {
+ } else if ((fn->common.fn_flags & ZEND_ACC_ABSTRACT)
+ && !(existing_fn->common.fn_flags & ZEND_ACC_ABSTRACT)) {
/* Make sure the abstract declaration is compatible with previous declaration */
- if (UNEXPECTED(!zend_traits_method_compatibility_check(existing_fn, fn))) {
- zend_error_noreturn(E_COMPILE_ERROR, "Declaration of %s must be compatible with %s",
- ZSTR_VAL(zend_get_function_declaration(existing_fn)),
- ZSTR_VAL(zend_get_function_declaration(fn)));
- }
+ perform_delayable_implementation_check(
+ ce, existing_fn, fn, /*always_error*/ 1);
return;
- } else if (UNEXPECTED(existing_fn->common.scope->ce_flags & ZEND_ACC_TRAIT)) {
+ } else if (UNEXPECTED((existing_fn->common.scope->ce_flags & ZEND_ACC_TRAIT)
+ && !(existing_fn->common.fn_flags & ZEND_ACC_ABSTRACT))) {
/* two traits can't define the same non-abstract method */
#if 1
zend_error_noreturn(E_COMPILE_ERROR, "Trait method %s has not been applied, because there are collisions with other trait methods on %s",
@@ -1248,12 +1613,11 @@ static void zend_add_trait_method(zend_class_entry *ce, const char *name, zend_s
} else {
/* inherited members are overridden by members inserted by traits */
/* check whether the trait method fulfills the inheritance requirements */
- do_inheritance_check_on_method(fn, existing_fn);
+ do_inheritance_check_on_method(fn, existing_fn, ce, NULL);
fn->common.prototype = NULL;
}
}
- function_add_ref(fn);
if (UNEXPECTED(fn->type == ZEND_INTERNAL_FUNCTION)) {
new_fn = zend_arena_alloc(&CG(arena), sizeof(zend_internal_function));
memcpy(new_fn, fn, sizeof(zend_internal_function));
@@ -1261,7 +1625,10 @@ static void zend_add_trait_method(zend_class_entry *ce, const char *name, zend_s
} else {
new_fn = zend_arena_alloc(&CG(arena), sizeof(zend_op_array));
memcpy(new_fn, fn, sizeof(zend_op_array));
+ new_fn->op_array.fn_flags |= ZEND_ACC_TRAIT_CLONE;
+ new_fn->op_array.fn_flags &= ~ZEND_ACC_IMMUTABLE;
}
+ function_add_ref(new_fn);
fn = zend_hash_update_ptr(&ce->function_table, key, new_fn);
zend_add_magic_methods(ce, key, fn);
}
@@ -1283,7 +1650,7 @@ 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, zend_class_entry **aliases) /* {{{ */
+static void zend_traits_copy_functions(zend_string *fnname, zend_function *fn, zend_class_entry *ce, HashTable **overridden, HashTable *exclude_table, zend_class_entry **aliases) /* {{{ */
{
zend_trait_alias *alias, **alias_ptr;
zend_string *lcname;
@@ -1309,7 +1676,7 @@ 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_add_trait_method(ce, ZSTR_VAL(alias->alias), lcname, &fn_copy, overridden);
zend_string_release_ex(lcname, 0);
/* Record the trait from which this alias was resolved. */
@@ -1361,14 +1728,12 @@ static int zend_traits_copy_functions(zend_string *fnname, zend_function *fn, ze
}
}
- zend_add_trait_method(ce, ZSTR_VAL(fn->common.function_name), fnname, &fn_copy, overriden);
+ zend_add_trait_method(ce, ZSTR_VAL(fn->common.function_name), fnname, &fn_copy, overridden);
}
-
- return ZEND_HASH_APPLY_KEEP;
}
/* }}} */
-static uint32_t 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, zend_class_entry **traits) /* {{{ */
{
uint32_t i;
@@ -1378,7 +1743,7 @@ static uint32_t zend_check_trait_usage(zend_class_entry *ce, zend_class_entry *t
}
for (i = 0; i < ce->num_traits; i++) {
- if (ce->traits[i] == trait) {
+ if (traits[i] == trait) {
return i;
}
}
@@ -1387,14 +1752,13 @@ static uint32_t zend_check_trait_usage(zend_class_entry *ce, zend_class_entry *t
}
/* }}} */
-static void zend_traits_init_trait_structures(zend_class_entry *ce, HashTable ***exclude_tables_ptr, zend_class_entry ***aliases_ptr) /* {{{ */
+static void zend_traits_init_trait_structures(zend_class_entry *ce, zend_class_entry **traits, HashTable ***exclude_tables_ptr, zend_class_entry ***aliases_ptr) /* {{{ */
{
size_t i, j = 0;
zend_trait_precedence **precedences;
zend_trait_precedence *cur_precedence;
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;
@@ -1413,12 +1777,11 @@ static void zend_traits_init_trait_structures(zend_class_entry *ce, HashTable **
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);
+ zend_check_trait_usage(ce, trait, traits);
/** 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) {
+ if (!zend_hash_exists(&trait->function_table, lcname)) {
zend_error_noreturn(E_COMPILE_ERROR,
"A precedence rule was defined for %s::%s but this method does not exist",
ZSTR_VAL(trait->name),
@@ -1440,7 +1803,7 @@ static void zend_traits_init_trait_structures(zend_class_entry *ce, HashTable **
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);
+ trait_num = zend_check_trait_usage(ce, exclude_ce, traits);
if (!exclude_tables[trait_num]) {
ALLOC_HASHTABLE(exclude_tables[trait_num]);
zend_hash_init(exclude_tables[trait_num], 0, NULL, NULL, 0);
@@ -1481,17 +1844,15 @@ static void zend_traits_init_trait_structures(zend_class_entry *ce, HashTable **
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);
+ zend_check_trait_usage(ce, trait, traits);
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(&trait->function_table, lcname);
- zend_string_release_ex(lcname, 0);
-
- if (!method_exists) {
+ if (!zend_hash_exists(&trait->function_table, lcname)) {
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));
}
+ zend_string_release_ex(lcname, 0);
}
i++;
}
@@ -1502,31 +1863,35 @@ static void zend_traits_init_trait_structures(zend_class_entry *ce, HashTable **
}
/* }}} */
-static void zend_do_traits_method_binding(zend_class_entry *ce, HashTable **exclude_tables, zend_class_entry **aliases) /* {{{ */
+static void zend_do_traits_method_binding(zend_class_entry *ce, zend_class_entry **traits, HashTable **exclude_tables, zend_class_entry **aliases) /* {{{ */
{
uint32_t i;
- HashTable *overriden = NULL;
+ HashTable *overridden = NULL;
zend_string *key;
zend_function *fn;
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_tables[i], aliases);
- } ZEND_HASH_FOREACH_END();
-
- if (exclude_tables[i]) {
- zend_hash_destroy(exclude_tables[i]);
- FREE_HASHTABLE(exclude_tables[i]);
- exclude_tables[i] = NULL;
+ if (traits[i]) {
+ /* copies functions, applies defined aliasing, and excludes unused trait methods */
+ ZEND_HASH_FOREACH_STR_KEY_PTR(&traits[i]->function_table, key, fn) {
+ zend_traits_copy_functions(key, fn, ce, &overridden, exclude_tables[i], aliases);
+ } ZEND_HASH_FOREACH_END();
+
+ 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, aliases);
- } ZEND_HASH_FOREACH_END();
+ if (traits[i]) {
+ ZEND_HASH_FOREACH_STR_KEY_PTR(&traits[i]->function_table, key, fn) {
+ zend_traits_copy_functions(key, fn, ce, &overridden, NULL, aliases);
+ } ZEND_HASH_FOREACH_END();
+ }
}
}
@@ -1534,21 +1899,22 @@ static void zend_do_traits_method_binding(zend_class_entry *ce, HashTable **excl
zend_fixup_trait_method(fn, ce);
} ZEND_HASH_FOREACH_END();
- if (overriden) {
- zend_hash_destroy(overriden);
- FREE_HASHTABLE(overriden);
+ if (overridden) {
+ zend_hash_destroy(overridden);
+ FREE_HASHTABLE(overridden);
}
}
/* }}} */
-static zend_class_entry* find_first_definition(zend_class_entry *ce, size_t current_trait, zend_string *prop_name, zend_class_entry *coliding_ce) /* {{{ */
+static zend_class_entry* find_first_definition(zend_class_entry *ce, zend_class_entry **traits, size_t current_trait, zend_string *prop_name, zend_class_entry *coliding_ce) /* {{{ */
{
size_t i;
if (coliding_ce == ce) {
for (i = 0; i < current_trait; i++) {
- if (zend_hash_exists(&ce->traits[i]->properties_info, prop_name)) {
- return ce->traits[i];
+ if (traits[i]
+ && zend_hash_exists(&traits[i]->properties_info, prop_name)) {
+ return traits[i];
}
}
}
@@ -1557,7 +1923,7 @@ static zend_class_entry* find_first_definition(zend_class_entry *ce, size_t curr
}
/* }}} */
-static void zend_do_traits_property_binding(zend_class_entry *ce) /* {{{ */
+static void zend_do_traits_property_binding(zend_class_entry *ce, zend_class_entry **traits) /* {{{ */
{
size_t i;
zend_property_info *property_info;
@@ -1575,7 +1941,10 @@ static void zend_do_traits_property_binding(zend_class_entry *ce) /* {{{ */
* - if compatible, then strict notice
*/
for (i = 0; i < ce->num_traits; i++) {
- ZEND_HASH_FOREACH_PTR(&ce->traits[i]->properties_info, property_info) {
+ if (!traits[i]) {
+ continue;
+ }
+ ZEND_HASH_FOREACH_PTR(&traits[i]->properties_info, property_info) {
/* first get the unmangeld name if necessary,
* then check whether the property is already there
*/
@@ -1594,34 +1963,28 @@ 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) {
- /* Only free if shadow is coming from direct parent,
- * otherwise these weren't copied in the first place. */
- if (coliding_prop->ce == ce->parent) {
- zend_string_release_ex(coliding_prop->name, 0);
- if (coliding_prop->doc_comment) {
- zend_string_release_ex(coliding_prop->doc_comment, 0);
- }
- }
+ if ((coliding_prop->flags & ZEND_ACC_PRIVATE) && coliding_prop->ce != ce) {
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 & (ZEND_ACC_PPP_MASK | ZEND_ACC_STATIC)) &&
+ property_types_compatible(property_info, coliding_prop) == INHERITANCE_SUCCESS
+ ) {
/* 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];
+ op2 = &traits[i]->default_static_members_table[property_info->offset];
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)];
+ op2 = &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 */
@@ -1649,7 +2012,7 @@ static void zend_do_traits_property_binding(zend_class_entry *ce) /* {{{ */
if (not_compatible) {
zend_error_noreturn(E_COMPILE_ERROR,
"%s and %s define the same property ($%s) in the composition of %s. However, the definition differs and is considered incompatible. Class was composed",
- ZSTR_VAL(find_first_definition(ce, i, prop_name, coliding_prop->ce)->name),
+ ZSTR_VAL(find_first_definition(ce, traits, i, prop_name, coliding_prop->ce)->name),
ZSTR_VAL(property_info->ce->name),
ZSTR_VAL(prop_name),
ZSTR_VAL(ce->name));
@@ -1662,17 +2025,18 @@ 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];
+ prop_value = &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)];
+ prop_value = &traits[i]->default_properties_table[OBJ_PROP_TO_NUM(property_info->offset)];
}
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);
+ if (ZEND_TYPE_IS_NAME(property_info->type)) {
+ zend_string_addref(ZEND_TYPE_NAME(property_info->type));
+ }
+ zend_declare_typed_property(ce, prop_name, prop_value, flags, doc_comment, property_info->type);
zend_string_release_ex(prop_name, 0);
} ZEND_HASH_FOREACH_END();
}
@@ -1699,7 +2063,7 @@ static void zend_do_check_for_inconsistent_traits_aliasing(zend_class_entry *ce,
ZSTR_VAL(cur_alias->trait_method.method_name));
} else {
/** Here are two possible cases:
- 1) this is an attempt to modifiy the visibility
+ 1) this is an attempt to modify the visibility
of a method introduce as part of another alias.
Since that seems to violate the DRY principle,
we check against it and abort.
@@ -1729,20 +2093,42 @@ static void zend_do_check_for_inconsistent_traits_aliasing(zend_class_entry *ce,
}
/* }}} */
-ZEND_API void zend_do_bind_traits(zend_class_entry *ce) /* {{{ */
+static void zend_do_bind_traits(zend_class_entry *ce) /* {{{ */
{
HashTable **exclude_tables;
zend_class_entry **aliases;
+ zend_class_entry **traits, *trait;
+ uint32_t i, j;
- if (ce->num_traits == 0) {
- return;
+ ZEND_ASSERT(ce->num_traits > 0);
+
+ traits = emalloc(sizeof(zend_class_entry*) * ce->num_traits);
+
+ for (i = 0; i < ce->num_traits; i++) {
+ trait = zend_fetch_class_by_name(ce->trait_names[i].name,
+ ce->trait_names[i].lc_name, ZEND_FETCH_CLASS_TRAIT);
+ if (UNEXPECTED(trait == NULL)) {
+ return;
+ }
+ if (UNEXPECTED(!(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));
+ return;
+ }
+ for (j = 0; j < i; j++) {
+ if (traits[j] == trait) {
+ /* skip duplications */
+ trait = NULL;
+ break;
+ }
+ }
+ traits[i] = trait;
}
/* complete initialization of trait strutures in ce */
- zend_traits_init_trait_structures(ce, &exclude_tables, &aliases);
+ zend_traits_init_trait_structures(ce, traits, &exclude_tables, &aliases);
/* first care about all methods to be flattened into the class */
- zend_do_traits_method_binding(ce, exclude_tables, aliases);
+ zend_do_traits_method_binding(ce, traits, exclude_tables, aliases);
/* Aliases which have not been applied indicate typos/bugs. */
zend_do_check_for_inconsistent_traits_aliasing(ce, aliases);
@@ -1756,18 +2142,12 @@ ZEND_API void zend_do_bind_traits(zend_class_entry *ce) /* {{{ */
}
/* then flatten the properties into it, to, mostly to notfiy developer about problems */
- zend_do_traits_property_binding(ce);
+ zend_do_traits_property_binding(ce, traits);
- /* verify that all abstract methods from traits have been implemented */
- zend_verify_abstract_class(ce);
+ efree(traits);
/* Emit E_DEPRECATED for PHP 4 constructors */
zend_check_deprecated_constructor(ce);
-
- /* now everything should be fine and an added ZEND_ACC_IMPLICIT_ABSTRACT_CLASS should be removed */
- if (ce->ce_flags & ZEND_ACC_IMPLICIT_ABSTRACT_CLASS) {
- ce->ce_flags -= ZEND_ACC_IMPLICIT_ABSTRACT_CLASS;
- }
}
/* }}} */
@@ -1794,12 +2174,441 @@ void zend_check_deprecated_constructor(const zend_class_entry *ce) /* {{{ */
}
/* }}} */
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * indent-tabs-mode: t
- * End:
- * vim600: sw=4 ts=4 fdm=marker
- * vim<600: sw=4 ts=4
- */
+#define MAX_ABSTRACT_INFO_CNT 3
+#define MAX_ABSTRACT_INFO_FMT "%s%s%s%s"
+#define DISPLAY_ABSTRACT_FN(idx) \
+ ai.afn[idx] ? ZEND_FN_SCOPE_NAME(ai.afn[idx]) : "", \
+ ai.afn[idx] ? "::" : "", \
+ ai.afn[idx] ? ZSTR_VAL(ai.afn[idx]->common.function_name) : "", \
+ ai.afn[idx] && ai.afn[idx + 1] ? ", " : (ai.afn[idx] && ai.cnt > MAX_ABSTRACT_INFO_CNT ? ", ..." : "")
+
+typedef struct _zend_abstract_info {
+ zend_function *afn[MAX_ABSTRACT_INFO_CNT + 1];
+ int cnt;
+ int ctor;
+} zend_abstract_info;
+
+static void zend_verify_abstract_class_function(zend_function *fn, zend_abstract_info *ai) /* {{{ */
+{
+ if (fn->common.fn_flags & ZEND_ACC_ABSTRACT) {
+ if (ai->cnt < MAX_ABSTRACT_INFO_CNT) {
+ ai->afn[ai->cnt] = fn;
+ }
+ if (fn->common.fn_flags & ZEND_ACC_CTOR) {
+ if (!ai->ctor) {
+ ai->cnt++;
+ ai->ctor = 1;
+ } else {
+ ai->afn[ai->cnt] = NULL;
+ }
+ } else {
+ ai->cnt++;
+ }
+ }
+}
+/* }}} */
+
+void zend_verify_abstract_class(zend_class_entry *ce) /* {{{ */
+{
+ zend_function *func;
+ zend_abstract_info ai;
+
+ ZEND_ASSERT((ce->ce_flags & (ZEND_ACC_IMPLICIT_ABSTRACT_CLASS|ZEND_ACC_INTERFACE|ZEND_ACC_TRAIT|ZEND_ACC_EXPLICIT_ABSTRACT_CLASS)) == ZEND_ACC_IMPLICIT_ABSTRACT_CLASS);
+ memset(&ai, 0, sizeof(ai));
+
+ ZEND_HASH_FOREACH_PTR(&ce->function_table, func) {
+ zend_verify_abstract_class_function(func, &ai);
+ } ZEND_HASH_FOREACH_END();
+
+ if (ai.cnt) {
+ zend_error_noreturn(E_ERROR, "Class %s contains %d abstract method%s and must therefore be declared abstract or implement the remaining methods (" MAX_ABSTRACT_INFO_FMT MAX_ABSTRACT_INFO_FMT MAX_ABSTRACT_INFO_FMT ")",
+ ZSTR_VAL(ce->name), ai.cnt,
+ ai.cnt > 1 ? "s" : "",
+ DISPLAY_ABSTRACT_FN(0),
+ DISPLAY_ABSTRACT_FN(1),
+ DISPLAY_ABSTRACT_FN(2)
+ );
+ } else {
+ /* now everything should be fine and an added ZEND_ACC_IMPLICIT_ABSTRACT_CLASS should be removed */
+ ce->ce_flags &= ~ZEND_ACC_IMPLICIT_ABSTRACT_CLASS;
+ }
+}
+/* }}} */
+
+typedef struct {
+ enum {
+ OBLIGATION_DEPENDENCY,
+ OBLIGATION_COMPATIBILITY,
+ OBLIGATION_PROPERTY_COMPATIBILITY
+ } type;
+ union {
+ zend_class_entry *dependency_ce;
+ struct {
+ /* Traits may use temporary on-stack functions during inheritance checks,
+ * so use copies of functions here as well. */
+ zend_function parent_fn;
+ zend_function child_fn;
+ zend_bool always_error;
+ };
+ struct {
+ const zend_property_info *parent_prop;
+ const zend_property_info *child_prop;
+ };
+ };
+} variance_obligation;
+
+static void variance_obligation_dtor(zval *zv) {
+ efree(Z_PTR_P(zv));
+}
+
+static void variance_obligation_ht_dtor(zval *zv) {
+ zend_hash_destroy(Z_PTR_P(zv));
+ FREE_HASHTABLE(Z_PTR_P(zv));
+}
+
+static HashTable *get_or_init_obligations_for_class(zend_class_entry *ce) {
+ HashTable *ht;
+ zend_ulong key;
+ if (!CG(delayed_variance_obligations)) {
+ ALLOC_HASHTABLE(CG(delayed_variance_obligations));
+ zend_hash_init(CG(delayed_variance_obligations), 0, NULL, variance_obligation_ht_dtor, 0);
+ }
+
+ key = (zend_ulong) (uintptr_t) ce;
+ ht = zend_hash_index_find_ptr(CG(delayed_variance_obligations), key);
+ if (ht) {
+ return ht;
+ }
+
+ ALLOC_HASHTABLE(ht);
+ zend_hash_init(ht, 0, NULL, variance_obligation_dtor, 0);
+ zend_hash_index_add_new_ptr(CG(delayed_variance_obligations), key, ht);
+ ce->ce_flags |= ZEND_ACC_UNRESOLVED_VARIANCE;
+ return ht;
+}
+
+static void add_dependency_obligation(zend_class_entry *ce, zend_class_entry *dependency_ce) {
+ HashTable *obligations = get_or_init_obligations_for_class(ce);
+ variance_obligation *obligation = emalloc(sizeof(variance_obligation));
+ obligation->type = OBLIGATION_DEPENDENCY;
+ obligation->dependency_ce = dependency_ce;
+ zend_hash_next_index_insert_ptr(obligations, obligation);
+}
+
+static void add_compatibility_obligation(
+ zend_class_entry *ce, const zend_function *child_fn, const zend_function *parent_fn,
+ zend_bool always_error) {
+ HashTable *obligations = get_or_init_obligations_for_class(ce);
+ variance_obligation *obligation = emalloc(sizeof(variance_obligation));
+ obligation->type = OBLIGATION_COMPATIBILITY;
+ /* Copy functions, because they may be stack-allocated in the case of traits. */
+ if (child_fn->common.type == ZEND_INTERNAL_FUNCTION) {
+ memcpy(&obligation->child_fn, child_fn, sizeof(zend_internal_function));
+ } else {
+ memcpy(&obligation->child_fn, child_fn, sizeof(zend_op_array));
+ }
+ if (parent_fn->common.type == ZEND_INTERNAL_FUNCTION) {
+ memcpy(&obligation->parent_fn, parent_fn, sizeof(zend_internal_function));
+ } else {
+ memcpy(&obligation->parent_fn, parent_fn, sizeof(zend_op_array));
+ }
+ obligation->always_error = always_error;
+ zend_hash_next_index_insert_ptr(obligations, obligation);
+}
+
+static void add_property_compatibility_obligation(
+ zend_class_entry *ce, const zend_property_info *child_prop,
+ const zend_property_info *parent_prop) {
+ HashTable *obligations = get_or_init_obligations_for_class(ce);
+ variance_obligation *obligation = emalloc(sizeof(variance_obligation));
+ obligation->type = OBLIGATION_PROPERTY_COMPATIBILITY;
+ obligation->child_prop = child_prop;
+ obligation->parent_prop = parent_prop;
+ zend_hash_next_index_insert_ptr(obligations, obligation);
+}
+
+static void resolve_delayed_variance_obligations(zend_class_entry *ce);
+
+static int check_variance_obligation(zval *zv) {
+ variance_obligation *obligation = Z_PTR_P(zv);
+ if (obligation->type == OBLIGATION_DEPENDENCY) {
+ zend_class_entry *dependency_ce = obligation->dependency_ce;
+ if (dependency_ce->ce_flags & ZEND_ACC_UNRESOLVED_VARIANCE) {
+ resolve_delayed_variance_obligations(dependency_ce);
+ }
+ if (!(dependency_ce->ce_flags & ZEND_ACC_LINKED)) {
+ return ZEND_HASH_APPLY_KEEP;
+ }
+ } else if (obligation->type == OBLIGATION_COMPATIBILITY) {
+ zend_string *unresolved_class;
+ inheritance_status status = zend_do_perform_implementation_check(
+ &unresolved_class, &obligation->child_fn, &obligation->parent_fn);
+
+ if (UNEXPECTED(status != INHERITANCE_SUCCESS)) {
+ if (EXPECTED(status == INHERITANCE_UNRESOLVED)) {
+ return ZEND_HASH_APPLY_KEEP;
+ }
+ ZEND_ASSERT(status == INHERITANCE_ERROR);
+ emit_incompatible_method_error_or_warning(
+ &obligation->child_fn, &obligation->parent_fn, status, unresolved_class,
+ obligation->always_error);
+ }
+ /* Either the compatibility check was successful or only threw a warning. */
+ } else {
+ ZEND_ASSERT(obligation->type == OBLIGATION_PROPERTY_COMPATIBILITY);
+ inheritance_status status =
+ property_types_compatible(obligation->parent_prop, obligation->child_prop);
+ if (status != INHERITANCE_SUCCESS) {
+ if (status == INHERITANCE_UNRESOLVED) {
+ return ZEND_HASH_APPLY_KEEP;
+ }
+ ZEND_ASSERT(status == INHERITANCE_ERROR);
+ emit_incompatible_property_error(obligation->child_prop, obligation->parent_prop);
+ }
+ }
+ return ZEND_HASH_APPLY_REMOVE;
+}
+
+static void load_delayed_classes() {
+ HashTable *delayed_autoloads = CG(delayed_autoloads);
+ zend_string *name;
+
+ if (!delayed_autoloads) {
+ return;
+ }
+
+ /* Take ownership of this HT, to avoid concurrent modification during autoloading. */
+ CG(delayed_autoloads) = NULL;
+
+ ZEND_HASH_FOREACH_STR_KEY(delayed_autoloads, name) {
+ zend_lookup_class(name);
+ } ZEND_HASH_FOREACH_END();
+
+ zend_hash_destroy(delayed_autoloads);
+ FREE_HASHTABLE(delayed_autoloads);
+}
+
+static void resolve_delayed_variance_obligations(zend_class_entry *ce) {
+ HashTable *all_obligations = CG(delayed_variance_obligations), *obligations;
+ zend_ulong num_key = (zend_ulong) (uintptr_t) ce;
+
+ ZEND_ASSERT(all_obligations != NULL);
+ obligations = zend_hash_index_find_ptr(all_obligations, num_key);
+ ZEND_ASSERT(obligations != NULL);
+
+ zend_hash_apply(obligations, check_variance_obligation);
+ if (zend_hash_num_elements(obligations) == 0) {
+ ce->ce_flags &= ~ZEND_ACC_UNRESOLVED_VARIANCE;
+ ce->ce_flags |= ZEND_ACC_LINKED;
+ zend_hash_index_del(all_obligations, num_key);
+ }
+}
+
+static void report_variance_errors(zend_class_entry *ce) {
+ HashTable *all_obligations = CG(delayed_variance_obligations), *obligations;
+ variance_obligation *obligation;
+ zend_ulong num_key = (zend_ulong) (uintptr_t) ce;
+
+ ZEND_ASSERT(all_obligations != NULL);
+ obligations = zend_hash_index_find_ptr(all_obligations, num_key);
+ ZEND_ASSERT(obligations != NULL);
+
+ ZEND_HASH_FOREACH_PTR(obligations, obligation) {
+ inheritance_status status;
+ zend_string *unresolved_class;
+
+ if (obligation->type == OBLIGATION_COMPATIBILITY) {
+ /* Just used to fetch the unresolved_class in this case. */
+ status = zend_do_perform_implementation_check(
+ &unresolved_class, &obligation->child_fn, &obligation->parent_fn);
+ ZEND_ASSERT(status == INHERITANCE_UNRESOLVED);
+ emit_incompatible_method_error_or_warning(
+ &obligation->child_fn, &obligation->parent_fn,
+ status, unresolved_class, obligation->always_error);
+ } else if (obligation->type == OBLIGATION_PROPERTY_COMPATIBILITY) {
+ emit_incompatible_property_error(obligation->child_prop, obligation->parent_prop);
+ } else {
+ zend_error_noreturn(E_CORE_ERROR, "Bug #78647");
+ }
+ } ZEND_HASH_FOREACH_END();
+
+ /* Only warnings were thrown above -- that means that there are incompatibilities, but only
+ * ones that we permit. Mark all classes with open obligations as fully linked. */
+ ce->ce_flags &= ~ZEND_ACC_UNRESOLVED_VARIANCE;
+ ce->ce_flags |= ZEND_ACC_LINKED;
+ zend_hash_index_del(all_obligations, num_key);
+}
+
+static void check_unrecoverable_load_failure(zend_class_entry *ce) {
+ /* If this class has been used while unlinked through a variance obligation, it is not legal
+ * to remove the class from the class table and throw an exception, because there is already
+ * a dependence on the inheritance hierarchy of this specific class. Instead we fall back to
+ * a fatal error, as would happen if we did not allow exceptions in the first place. */
+ if (ce->ce_flags & ZEND_ACC_HAS_UNLINKED_USES) {
+ zend_string *exception_str;
+ zval exception_zv;
+ ZEND_ASSERT(EG(exception) && "Exception must have been thrown");
+ ZVAL_OBJ(&exception_zv, EG(exception));
+ Z_ADDREF(exception_zv);
+ zend_clear_exception();
+ exception_str = zval_get_string(&exception_zv);
+ zend_error_noreturn(E_ERROR,
+ "During inheritance of %s with variance dependencies: Uncaught %s", ZSTR_VAL(ce->name), ZSTR_VAL(exception_str));
+ }
+}
+
+ZEND_API int zend_do_link_class(zend_class_entry *ce, zend_string *lc_parent_name) /* {{{ */
+{
+ /* Load parent/interface dependencies first, so we can still gracefully abort linking
+ * with an exception and remove the class from the class table. This is only possible
+ * if no variance obligations on the current class have been added during autoloading. */
+ zend_class_entry *parent = NULL;
+ zend_class_entry **interfaces = NULL;
+
+ if (ce->parent_name) {
+ parent = zend_fetch_class_by_name(
+ ce->parent_name, lc_parent_name,
+ ZEND_FETCH_CLASS_ALLOW_NEARLY_LINKED | ZEND_FETCH_CLASS_EXCEPTION);
+ if (!parent) {
+ check_unrecoverable_load_failure(ce);
+ return FAILURE;
+ }
+ }
+
+ if (ce->num_interfaces) {
+ /* Also copy the parent interfaces here, so we don't need to reallocate later. */
+ uint32_t i, num_parent_interfaces = parent ? parent->num_interfaces : 0;
+ interfaces = emalloc(
+ sizeof(zend_class_entry *) * (ce->num_interfaces + num_parent_interfaces));
+ if (num_parent_interfaces) {
+ memcpy(interfaces, parent->interfaces,
+ sizeof(zend_class_entry *) * num_parent_interfaces);
+ }
+ for (i = 0; i < ce->num_interfaces; i++) {
+ zend_class_entry *iface = zend_fetch_class_by_name(
+ ce->interface_names[i].name, ce->interface_names[i].lc_name,
+ ZEND_FETCH_CLASS_INTERFACE |
+ ZEND_FETCH_CLASS_ALLOW_NEARLY_LINKED | ZEND_FETCH_CLASS_EXCEPTION);
+ if (!iface) {
+ check_unrecoverable_load_failure(ce);
+ efree(interfaces);
+ return FAILURE;
+ }
+ interfaces[num_parent_interfaces + i] = iface;
+ }
+ }
+
+ if (parent) {
+ if (!(parent->ce_flags & ZEND_ACC_LINKED)) {
+ add_dependency_obligation(ce, parent);
+ }
+ zend_do_inheritance(ce, parent);
+ }
+ if (ce->ce_flags & ZEND_ACC_IMPLEMENT_TRAITS) {
+ zend_do_bind_traits(ce);
+ }
+ if (ce->ce_flags & ZEND_ACC_IMPLEMENT_INTERFACES) {
+ zend_do_implement_interfaces(ce, interfaces);
+ }
+ if ((ce->ce_flags & (ZEND_ACC_IMPLICIT_ABSTRACT_CLASS|ZEND_ACC_INTERFACE|ZEND_ACC_TRAIT|ZEND_ACC_EXPLICIT_ABSTRACT_CLASS)) == ZEND_ACC_IMPLICIT_ABSTRACT_CLASS) {
+ zend_verify_abstract_class(ce);
+ }
+
+ zend_build_properties_info_table(ce);
+
+ if (!(ce->ce_flags & ZEND_ACC_UNRESOLVED_VARIANCE)) {
+ ce->ce_flags |= ZEND_ACC_LINKED;
+ return SUCCESS;
+ }
+
+ ce->ce_flags |= ZEND_ACC_NEARLY_LINKED;
+ load_delayed_classes();
+ if (ce->ce_flags & ZEND_ACC_UNRESOLVED_VARIANCE) {
+ resolve_delayed_variance_obligations(ce);
+ if (!(ce->ce_flags & ZEND_ACC_LINKED)) {
+ report_variance_errors(ce);
+ }
+ }
+
+ return SUCCESS;
+}
+/* }}} */
+
+/* Check whether early binding is prevented due to unresolved types in inheritance checks. */
+static inheritance_status zend_can_early_bind(zend_class_entry *ce, zend_class_entry *parent_ce) /* {{{ */
+{
+ inheritance_status ret = INHERITANCE_SUCCESS;
+ zend_string *key;
+ zend_function *parent_func;
+ zend_property_info *parent_info;
+
+ ZEND_HASH_FOREACH_STR_KEY_PTR(&parent_ce->function_table, key, parent_func) {
+ zval *zv = zend_hash_find_ex(&ce->function_table, key, 1);
+ if (zv) {
+ zend_function *child_func = Z_FUNC_P(zv);
+ inheritance_status status =
+ do_inheritance_check_on_method_ex(child_func, parent_func, ce, NULL, 1, 0);
+
+ if (UNEXPECTED(status != INHERITANCE_SUCCESS)) {
+ if (EXPECTED(status == INHERITANCE_UNRESOLVED)) {
+ return INHERITANCE_UNRESOLVED;
+ }
+ ZEND_ASSERT(status == INHERITANCE_ERROR);
+ ret = INHERITANCE_ERROR;
+ }
+ }
+ } ZEND_HASH_FOREACH_END();
+
+ ZEND_HASH_FOREACH_STR_KEY_PTR(&parent_ce->properties_info, key, parent_info) {
+ zval *zv;
+ if ((parent_info->flags & ZEND_ACC_PRIVATE) || !ZEND_TYPE_IS_SET(parent_info->type)) {
+ continue;
+ }
+
+ zv = zend_hash_find_ex(&ce->properties_info, key, 1);
+ if (zv) {
+ zend_property_info *child_info = Z_PTR_P(zv);
+ if (ZEND_TYPE_IS_SET(child_info->type)) {
+ inheritance_status status = property_types_compatible(parent_info, child_info);
+ if (UNEXPECTED(status != INHERITANCE_SUCCESS)) {
+ if (EXPECTED(status == INHERITANCE_UNRESOLVED)) {
+ return INHERITANCE_UNRESOLVED;
+ }
+ ZEND_ASSERT(status == INHERITANCE_ERROR);
+ ret = INHERITANCE_ERROR;
+ }
+ }
+ }
+ } ZEND_HASH_FOREACH_END();
+
+ return ret;
+}
+/* }}} */
+
+zend_bool zend_try_early_bind(zend_class_entry *ce, zend_class_entry *parent_ce, zend_string *lcname, zval *delayed_early_binding) /* {{{ */
+{
+ inheritance_status status = zend_can_early_bind(ce, parent_ce);
+
+ if (EXPECTED(status != INHERITANCE_UNRESOLVED)) {
+ if (delayed_early_binding) {
+ if (UNEXPECTED(zend_hash_set_bucket_key(EG(class_table), (Bucket*)delayed_early_binding, lcname) == NULL)) {
+ 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));
+ return 0;
+ }
+ } else {
+ if (UNEXPECTED(zend_hash_add_ptr(CG(class_table), lcname, ce) == NULL)) {
+ return 0;
+ }
+ }
+ zend_do_inheritance_ex(ce, parent_ce, status == INHERITANCE_SUCCESS);
+ zend_build_properties_info_table(ce);
+ if ((ce->ce_flags & (ZEND_ACC_IMPLICIT_ABSTRACT_CLASS|ZEND_ACC_INTERFACE|ZEND_ACC_TRAIT|ZEND_ACC_EXPLICIT_ABSTRACT_CLASS)) == ZEND_ACC_IMPLICIT_ABSTRACT_CLASS) {
+ zend_verify_abstract_class(ce);
+ }
+ ZEND_ASSERT(!(ce->ce_flags & ZEND_ACC_UNRESOLVED_VARIANCE));
+ ce->ce_flags |= ZEND_ACC_LINKED;
+ return 1;
+ }
+ return 0;
+}
+/* }}} */
diff --git a/Zend/zend_inheritance.h b/Zend/zend_inheritance.h
index ef2b0676df..c4e9e10675 100644
--- a/Zend/zend_inheritance.h
+++ b/Zend/zend_inheritance.h
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| Zend Engine |
+----------------------------------------------------------------------+
- | Copyright (c) 1998-2018 Zend Technologies Ltd. (http://www.zend.com) |
+ | Copyright (c) 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 |
@@ -24,27 +24,19 @@
BEGIN_EXTERN_C()
-ZEND_API void zend_do_inherit_interfaces(zend_class_entry *ce, const zend_class_entry *iface);
ZEND_API void zend_do_implement_interface(zend_class_entry *ce, zend_class_entry *iface);
+ZEND_API void zend_do_inheritance_ex(zend_class_entry *ce, zend_class_entry *parent_ce, zend_bool checked);
-ZEND_API void zend_do_implement_trait(zend_class_entry *ce, zend_class_entry *trait);
-ZEND_API void zend_do_bind_traits(zend_class_entry *ce);
+#define zend_do_inheritance(ce, parent_ce) \
+ zend_do_inheritance_ex(ce, parent_ce, 0)
-ZEND_API void zend_do_inheritance(zend_class_entry *ce, zend_class_entry *parent_ce);
-void zend_do_early_binding(void);
+ZEND_API int zend_do_link_class(zend_class_entry *ce, zend_string *lc_parent_name);
+void zend_verify_abstract_class(zend_class_entry *ce);
void zend_check_deprecated_constructor(const zend_class_entry *ce);
+void zend_build_properties_info_table(zend_class_entry *ce);
+zend_bool zend_try_early_bind(zend_class_entry *ce, zend_class_entry *parent_ce, zend_string *lcname, zval *delayed_early_binding);
END_EXTERN_C()
#endif
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * indent-tabs-mode: t
- * End:
- * vim600: sw=4 ts=4 fdm=marker
- * vim<600: sw=4 ts=4
- */
diff --git a/Zend/zend_ini.c b/Zend/zend_ini.c
index b8185950ae..e4b9e6bc5e 100644
--- a/Zend/zend_ini.c
+++ b/Zend/zend_ini.c
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| Zend Engine |
+----------------------------------------------------------------------+
- | Copyright (c) 1998-2018 Zend Technologies Ltd. (http://www.zend.com) |
+ | Copyright (c) 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 |
@@ -36,11 +36,8 @@ static int zend_remove_ini_entries(zval *el, void *arg) /* {{{ */
{
zend_ini_entry *ini_entry = (zend_ini_entry *)Z_PTR_P(el);
int module_number = *(int *)arg;
- if (ini_entry->module_number == module_number) {
- return 1;
- } else {
- return 0;
- }
+
+ return ini_entry->module_number == module_number;
}
/* }}} */
@@ -74,14 +71,6 @@ static int zend_restore_ini_entry_cb(zend_ini_entry *ini_entry, int stage) /* {{
}
/* }}} */
-static int zend_restore_ini_entry_wrapper(zval *el) /* {{{ */
-{
- zend_ini_entry *ini_entry = (zend_ini_entry *)Z_PTR_P(el);
- zend_restore_ini_entry_cb(ini_entry, ZEND_INI_STAGE_DEACTIVATE);
- return 1;
-}
-/* }}} */
-
static void free_ini_entry(zval *zv) /* {{{ */
{
zend_ini_entry *entry = (zend_ini_entry*)Z_PTR_P(zv);
@@ -137,7 +126,11 @@ ZEND_API int zend_ini_global_shutdown(void) /* {{{ */
ZEND_API int zend_ini_deactivate(void) /* {{{ */
{
if (EG(modified_ini_directives)) {
- zend_hash_apply(EG(modified_ini_directives), zend_restore_ini_entry_wrapper);
+ zend_ini_entry *ini_entry;
+
+ ZEND_HASH_FOREACH_PTR(EG(modified_ini_directives), ini_entry) {
+ zend_restore_ini_entry_cb(ini_entry, ZEND_INI_STAGE_DEACTIVATE);
+ } ZEND_HASH_FOREACH_END();
zend_hash_destroy(EG(modified_ini_directives));
FREE_HASHTABLE(EG(modified_ini_directives));
EG(modified_ini_directives) = NULL;
@@ -280,21 +273,15 @@ ZEND_API void zend_unregister_ini_entries(int module_number) /* {{{ */
/* }}} */
#ifdef ZTS
-static int zend_ini_refresh_cache(zval *el, void *arg) /* {{{ */
-{
- zend_ini_entry *p = (zend_ini_entry *)Z_PTR_P(el);
- int stage = (int)(zend_intptr_t)arg;
-
- if (p->on_modify) {
- p->on_modify(p, p->value, p->mh_arg1, p->mh_arg2, p->mh_arg3, stage);
- }
- return 0;
-}
-/* }}} */
-
ZEND_API void zend_ini_refresh_caches(int stage) /* {{{ */
{
- zend_hash_apply_with_argument(EG(ini_directives), zend_ini_refresh_cache, (void *)(zend_intptr_t) stage);
+ zend_ini_entry *p;
+
+ ZEND_HASH_FOREACH_PTR(EG(ini_directives), p) {
+ if (p->on_modify) {
+ p->on_modify(p, p->value, p->mh_arg1, p->mh_arg2, p->mh_arg3, stage);
+ }
+ } ZEND_HASH_FOREACH_END();
}
/* }}} */
#endif
@@ -518,46 +505,6 @@ ZEND_API zend_bool zend_ini_parse_bool(zend_string *str)
}
}
-#if TONY_20070307
-static void zend_ini_displayer_cb(zend_ini_entry *ini_entry, int type) /* {{{ */
-{
- if (ini_entry->displayer) {
- ini_entry->displayer(ini_entry, type);
- } else {
- char *display_string;
- uint32_t display_string_length;
-
- if (type == ZEND_INI_DISPLAY_ORIG && ini_entry->modified) {
- if (ini_entry->orig_value) {
- display_string = ini_entry->orig_value;
- display_string_length = ini_entry->orig_value_length;
- } else {
- if (zend_uv.html_errors) {
- display_string = NO_VALUE_HTML;
- display_string_length = sizeof(NO_VALUE_HTML) - 1;
- } else {
- display_string = NO_VALUE_PLAINTEXT;
- display_string_length = sizeof(NO_VALUE_PLAINTEXT) - 1;
- }
- }
- } else if (ini_entry->value && ini_entry->value[0]) {
- display_string = ini_entry->value;
- display_string_length = ini_entry->value_length;
- } else {
- if (zend_uv.html_errors) {
- display_string = NO_VALUE_HTML;
- display_string_length = sizeof(NO_VALUE_HTML) - 1;
- } else {
- display_string = NO_VALUE_PLAINTEXT;
- display_string_length = sizeof(NO_VALUE_PLAINTEXT) - 1;
- }
- }
- ZEND_WRITE(display_string, display_string_length);
- }
-}
-/* }}} */
-#endif
-
ZEND_INI_DISP(zend_ini_boolean_displayer_cb) /* {{{ */
{
int value;
@@ -751,13 +698,3 @@ ZEND_API ZEND_INI_MH(OnUpdateStringUnempty) /* {{{ */
return SUCCESS;
}
/* }}} */
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * indent-tabs-mode: t
- * End:
- * vim600: sw=4 ts=4 fdm=marker
- * vim<600: sw=4 ts=4
- */
diff --git a/Zend/zend_ini.h b/Zend/zend_ini.h
index 5299dcd532..596444880a 100644
--- a/Zend/zend_ini.h
+++ b/Zend/zend_ini.h
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| Zend Engine |
+----------------------------------------------------------------------+
- | Copyright (c) 1998-2018 Zend Technologies Ltd. (http://www.zend.com) |
+ | Copyright (c) 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 |
@@ -26,7 +26,7 @@
#define ZEND_INI_ALL (ZEND_INI_USER|ZEND_INI_PERDIR|ZEND_INI_SYSTEM)
#define ZEND_INI_MH(name) int name(zend_ini_entry *entry, zend_string *new_value, void *mh_arg1, void *mh_arg2, void *mh_arg3, int stage)
-#define ZEND_INI_DISP(name) void name(zend_ini_entry *ini_entry, int type)
+#define ZEND_INI_DISP(name) ZEND_COLD void name(zend_ini_entry *ini_entry, int type)
typedef struct _zend_ini_entry_def {
const char *name;
@@ -195,13 +195,3 @@ typedef struct _zend_ini_parser_param {
} zend_ini_parser_param;
#endif /* ZEND_INI_H */
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * indent-tabs-mode: t
- * End:
- * vim600: sw=4 ts=4 fdm=marker
- * vim<600: sw=4 ts=4
- */
diff --git a/Zend/zend_ini_parser.y b/Zend/zend_ini_parser.y
index 30c52277a3..db9b7d670b 100644
--- a/Zend/zend_ini_parser.y
+++ b/Zend/zend_ini_parser.y
@@ -1,9 +1,10 @@
+%require "3.0"
%{
/*
+----------------------------------------------------------------------+
| Zend Engine |
+----------------------------------------------------------------------+
- | Copyright (c) 1998-2018 Zend Technologies Ltd. (http://www.zend.com) |
+ | Copyright (c) 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 |
@@ -31,7 +32,6 @@
#include "win32/syslog.h"
#endif
-#define YYERROR_VERBOSE
#define YYSTYPE zval
int ini_parse(void);
@@ -95,7 +95,7 @@ static void zend_ini_do_op(char type, zval *result, zval *op1, zval *op2)
break;
}
- str_len = zend_sprintf(str_result, "%d", i_result);
+ str_len = sprintf(str_result, "%d", i_result);
ZVAL_NEW_STR(result, zend_string_init(str_result, str_len, ZEND_SYSTEM_INI));
}
/* }}} */
@@ -289,8 +289,10 @@ static void zval_ini_dtor(zval *zv)
%}
%expect 0
-%pure-parser
+%define api.pure full
+%define parse.error verbose
+%token END 0 "end of file"
%token TC_SECTION
%token TC_RAW
%token TC_CONSTANT
@@ -419,13 +421,3 @@ constant_string:
| TC_STRING { $$ = $1; /*printf("TC_STRING: '%s'\n", Z_STRVAL($1));*/ }
| TC_WHITESPACE { $$ = $1; /*printf("TC_WHITESPACE: '%s'\n", Z_STRVAL($1));*/ }
;
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * indent-tabs-mode: t
- * End:
- * vim600: sw=4 ts=4 fdm=marker
- * vim<600: sw=4 ts=4
- */
diff --git a/Zend/zend_ini_scanner.c b/Zend/zend_ini_scanner.c
deleted file mode 100644
index e57a28570b..0000000000
--- a/Zend/zend_ini_scanner.c
+++ /dev/null
@@ -1,3883 +0,0 @@
-/* Generated by re2c 1.0.3 */
-#line 1 "Zend/zend_ini_scanner.l"
-/*
- +----------------------------------------------------------------------+
- | 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: Zeev Suraski <zeev@php.net> |
- | Jani Taskinen <jani@php.net> |
- | Marcus Boerger <helly@php.net> |
- | Nuno Lopes <nlopess@php.net> |
- | Scott MacVicar <scottmac@php.net> |
- +----------------------------------------------------------------------+
-*/
-
-#include <errno.h>
-#include "zend.h"
-#include "zend_API.h"
-#include "zend_globals.h"
-#include <zend_ini_parser.h>
-#include "zend_ini_scanner.h"
-
-#ifdef YYDEBUG
-#undef YYDEBUG
-#endif
-
-#if 0
-# define YYDEBUG(s, c) printf("state: %d char: %c\n", s, c)
-#else
-# define YYDEBUG(s, c)
-#endif
-
-#include "zend_ini_scanner_defs.h"
-
-#define YYCTYPE unsigned char
-/* allow the scanner to read one null byte after the end of the string (from ZEND_MMAP_AHEAD)
- * so that if will be able to terminate to match the current token (e.g. non-enclosed string) */
-#define YYFILL(n) { if (YYCURSOR > YYLIMIT) return 0; }
-#define YYCURSOR SCNG(yy_cursor)
-#define YYLIMIT SCNG(yy_limit)
-#define YYMARKER SCNG(yy_marker)
-
-#define YYGETCONDITION() SCNG(yy_state)
-#define YYSETCONDITION(s) SCNG(yy_state) = s
-
-#define STATE(name) yyc##name
-
-/* emulate flex constructs */
-#define BEGIN(state) YYSETCONDITION(STATE(state))
-#define YYSTATE YYGETCONDITION()
-#define yytext ((char*)SCNG(yy_text))
-#define yyleng SCNG(yy_leng)
-#define yyless(x) do { YYCURSOR = (unsigned char*)yytext + x; \
- yyleng = (unsigned int)x; } while(0)
-
-/* #define yymore() goto yymore_restart */
-
-/* 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
-
-
-/* How it works (for the core ini directives):
- * ===========================================
- *
- * 1. Scanner scans file for tokens and passes them to parser.
- * 2. Parser parses the tokens and passes the name/value pairs to the callback
- * function which stores them in the configuration hash table.
- * 3. Later REGISTER_INI_ENTRIES() is called which triggers the actual
- * registering of ini entries and uses zend_get_configuration_directive()
- * to fetch the previously stored name/value pair from configuration hash table
- * and registers the static ini entries which match the name to the value
- * into EG(ini_directives) hash table.
- * 4. PATH section entries are used per-request from down to top, each overriding
- * previous if one exists. zend_alter_ini_entry() is called for each entry.
- * Settings in PATH section are ZEND_INI_SYSTEM accessible and thus mimics the
- * php_admin_* directives used within Apache httpd.conf when PHP is compiled as
- * module for Apache.
- * 5. User defined ini files (like .htaccess for apache) are parsed for each request and
- * stored in separate hash defined by SAPI.
- */
-
-/* TODO: (ordered by importance :-)
- * ===============================================================================
- *
- * - Separate constant lookup totally from plain strings (using CONSTANT pattern)
- * - Add #if .. #else .. #endif and ==, !=, <, > , <=, >= operators
- * - Add #include "some.ini"
- * - Allow variables to refer to options also when using parse_ini_file()
- *
- */
-
-/* Globals Macros */
-#define SCNG INI_SCNG
-#ifdef ZTS
-ZEND_API ts_rsrc_id ini_scanner_globals_id;
-#else
-ZEND_API zend_ini_scanner_globals ini_scanner_globals;
-#endif
-
-#define ZEND_SYSTEM_INI CG(ini_parser_unbuffered_errors)
-
-/* Eat leading whitespace */
-#define EAT_LEADING_WHITESPACE() \
- while (yyleng) { \
- if (yytext[0] == ' ' || yytext[0] == '\t') { \
- SCNG(yy_text)++; \
- yyleng--; \
- } else { \
- break; \
- } \
- }
-
-/* Eat trailing whitespace + extra char */
-#define EAT_TRAILING_WHITESPACE_EX(ch) \
- while (yyleng && ( \
- (ch != 'X' && yytext[yyleng - 1] == ch) || \
- yytext[yyleng - 1] == '\n' || \
- yytext[yyleng - 1] == '\r' || \
- yytext[yyleng - 1] == '\t' || \
- yytext[yyleng - 1] == ' ') \
- ) { \
- yyleng--; \
- }
-
-/* Eat trailing whitespace */
-#define EAT_TRAILING_WHITESPACE() EAT_TRAILING_WHITESPACE_EX('X')
-
-#define zend_ini_copy_value(retval, str, len) \
- ZVAL_NEW_STR(retval, zend_string_init(str, len, ZEND_SYSTEM_INI))
-
-
-#define RETURN_TOKEN(type, str, len) { \
- if (SCNG(scanner_mode) == ZEND_INI_SCANNER_TYPED && \
- (YYSTATE == STATE(ST_VALUE) || YYSTATE == STATE(ST_RAW))) {\
- zend_ini_copy_typed_value(ini_lval, type, str, len); \
- } else { \
- zend_ini_copy_value(ini_lval, str, len); \
- } \
- return type; \
-}
-
-static inline int convert_to_number(zval *retval, const char *str, const int str_len)
-{
- zend_uchar type;
- int overflow;
- zend_long lval;
- double dval;
-
- if ((type = is_numeric_string_ex(str, str_len, &lval, &dval, 0, &overflow)) != 0) {
- if (type == IS_LONG) {
- ZVAL_LONG(retval, lval);
- return SUCCESS;
- } else if (type == IS_DOUBLE && !overflow) {
- ZVAL_DOUBLE(retval, dval);
- return SUCCESS;
- }
- }
-
- return FAILURE;
-}
-
-static void zend_ini_copy_typed_value(zval *retval, const int type, const char *str, int len)
-{
- switch (type) {
- case BOOL_FALSE:
- case BOOL_TRUE:
- ZVAL_BOOL(retval, type == BOOL_TRUE);
- break;
-
- case NULL_NULL:
- ZVAL_NULL(retval);
- break;
-
- case TC_NUMBER:
- if (convert_to_number(retval, str, len) == SUCCESS) {
- break;
- }
- /* intentional fall-through */
- default:
- zend_ini_copy_value(retval, str, len);
- }
-}
-
-static void _yy_push_state(int new_state)
-{
- zend_stack_push(&SCNG(state_stack), (void *) &YYGETCONDITION());
- YYSETCONDITION(new_state);
-}
-
-#define yy_push_state(state_and_tsrm) _yy_push_state(yyc##state_and_tsrm)
-
-static void yy_pop_state(void)
-{
- int *stack_state = zend_stack_top(&SCNG(state_stack));
- YYSETCONDITION(*stack_state);
- zend_stack_del_top(&SCNG(state_stack));
-}
-
-static void yy_scan_buffer(char *str, unsigned int len)
-{
- YYCURSOR = (YYCTYPE*)str;
- SCNG(yy_start) = YYCURSOR;
- YYLIMIT = YYCURSOR + len;
-}
-
-#define ini_filename SCNG(filename)
-
-/* {{{ init_ini_scanner()
-*/
-static int init_ini_scanner(int scanner_mode, zend_file_handle *fh)
-{
- /* Sanity check */
- if (scanner_mode != ZEND_INI_SCANNER_NORMAL && scanner_mode != ZEND_INI_SCANNER_RAW && scanner_mode != ZEND_INI_SCANNER_TYPED) {
- zend_error(E_WARNING, "Invalid scanner mode");
- return FAILURE;
- }
-
- SCNG(lineno) = 1;
- SCNG(scanner_mode) = scanner_mode;
- SCNG(yy_in) = fh;
-
- if (fh != NULL) {
- ini_filename = zend_strndup(fh->filename, strlen(fh->filename));
- } else {
- ini_filename = NULL;
- }
-
- zend_stack_init(&SCNG(state_stack), sizeof(int));
- BEGIN(INITIAL);
-
- return SUCCESS;
-}
-/* }}} */
-
-/* {{{ shutdown_ini_scanner()
-*/
-void shutdown_ini_scanner(void)
-{
- zend_stack_destroy(&SCNG(state_stack));
- if (ini_filename) {
- free(ini_filename);
- }
-}
-/* }}} */
-
-/* {{{ zend_ini_scanner_get_lineno()
-*/
-ZEND_COLD int zend_ini_scanner_get_lineno(void)
-{
- return SCNG(lineno);
-}
-/* }}} */
-
-/* {{{ zend_ini_scanner_get_filename()
-*/
-ZEND_COLD char *zend_ini_scanner_get_filename(void)
-{
- return ini_filename ? ini_filename : "Unknown";
-}
-/* }}} */
-
-/* {{{ zend_ini_open_file_for_scanning()
-*/
-int zend_ini_open_file_for_scanning(zend_file_handle *fh, int scanner_mode)
-{
- char *buf;
- size_t size;
-
- if (zend_stream_fixup(fh, &buf, &size) == FAILURE) {
- return FAILURE;
- }
-
- if (init_ini_scanner(scanner_mode, fh) == FAILURE) {
- zend_file_handle_dtor(fh);
- return FAILURE;
- }
-
- yy_scan_buffer(buf, (unsigned int)size);
-
- return SUCCESS;
-}
-/* }}} */
-
-/* {{{ zend_ini_prepare_string_for_scanning()
-*/
-int zend_ini_prepare_string_for_scanning(char *str, int scanner_mode)
-{
- int len = (int)strlen(str);
-
- if (init_ini_scanner(scanner_mode, NULL) == FAILURE) {
- return FAILURE;
- }
-
- yy_scan_buffer(str, len);
-
- return SUCCESS;
-}
-/* }}} */
-
-/* {{{ zend_ini_escape_string()
- */
-static void zend_ini_escape_string(zval *lval, char *str, int len, char quote_type)
-{
- register char *s, *t;
- char *end;
-
- zend_ini_copy_value(lval, str, len);
-
- /* convert escape sequences */
- s = t = Z_STRVAL_P(lval);
- end = s + Z_STRLEN_P(lval);
-
- while (s < end) {
- if (*s == '\\') {
- s++;
- if (s >= end) {
- *t++ = '\\';
- continue;
- }
- switch (*s) {
- case '"':
- if (*s != quote_type) {
- *t++ = '\\';
- *t++ = *s;
- break;
- }
- case '\\':
- case '$':
- *t++ = *s;
- Z_STRLEN_P(lval)--;
- break;
- default:
- *t++ = '\\';
- *t++ = *s;
- break;
- }
- } else {
- *t++ = *s;
- }
- if (*s == '\n' || (*s == '\r' && (*(s+1) != '\n'))) {
- SCNG(lineno)++;
- }
- s++;
- }
- *t = 0;
-}
-/* }}} */
-
-int ini_lex(zval *ini_lval)
-{
-restart:
- SCNG(yy_text) = YYCURSOR;
-
-/* yymore_restart: */
- /* detect EOF */
- if (YYCURSOR >= YYLIMIT) {
- if (YYSTATE == STATE(ST_VALUE) || YYSTATE == STATE(ST_RAW)) {
- BEGIN(INITIAL);
- return END_OF_LINE;
- }
- return 0;
- }
-
- /* Eat any UTF-8 BOM we find in the first 3 bytes */
- if (YYCURSOR == SCNG(yy_start) && YYCURSOR + 3 < YYLIMIT) {
- if (memcmp(YYCURSOR, "\xef\xbb\xbf", 3) == 0) {
- YYCURSOR += 3;
- goto restart;
- }
- }
-
-#line 387 "Zend/zend_ini_scanner.c"
-{
- YYCTYPE yych;
- unsigned int yyaccept = 0;
- if (YYGETCONDITION() < 4) {
- if (YYGETCONDITION() < 2) {
- if (YYGETCONDITION() < 1) {
- goto yyc_INITIAL;
- } else {
- goto yyc_ST_OFFSET;
- }
- } else {
- if (YYGETCONDITION() < 3) {
- goto yyc_ST_SECTION_VALUE;
- } else {
- goto yyc_ST_VALUE;
- }
- }
- } else {
- if (YYGETCONDITION() < 6) {
- if (YYGETCONDITION() < 5) {
- goto yyc_ST_SECTION_RAW;
- } else {
- goto yyc_ST_DOUBLE_QUOTES;
- }
- } else {
- if (YYGETCONDITION() < 7) {
- goto yyc_ST_VARNAME;
- } else {
- goto yyc_ST_RAW;
- }
- }
- }
-/* *********************************** */
-yyc_INITIAL:
- {
- static const unsigned char yybm[] = {
- 144, 144, 144, 144, 144, 144, 144, 144,
- 144, 160, 0, 144, 144, 0, 144, 144,
- 144, 144, 144, 144, 144, 144, 144, 144,
- 144, 144, 144, 144, 144, 144, 144, 144,
- 240, 128, 128, 144, 128, 144, 128, 144,
- 128, 128, 144, 144, 144, 144, 144, 144,
- 144, 144, 144, 144, 144, 144, 144, 144,
- 144, 144, 144, 128, 144, 128, 144, 144,
- 144, 144, 144, 144, 144, 144, 144, 144,
- 144, 144, 144, 144, 144, 144, 144, 144,
- 144, 144, 144, 144, 144, 144, 144, 144,
- 144, 144, 144, 128, 144, 144, 128, 144,
- 144, 144, 144, 144, 144, 144, 144, 144,
- 144, 144, 144, 144, 144, 144, 144, 144,
- 144, 144, 144, 144, 144, 144, 144, 144,
- 144, 144, 144, 128, 128, 128, 128, 144,
- 144, 144, 144, 144, 144, 144, 144, 144,
- 144, 144, 144, 144, 144, 144, 144, 144,
- 144, 144, 144, 144, 144, 144, 144, 144,
- 144, 144, 144, 144, 144, 144, 144, 144,
- 144, 144, 144, 144, 144, 144, 144, 144,
- 144, 144, 144, 144, 144, 144, 144, 144,
- 144, 144, 144, 144, 144, 144, 144, 144,
- 144, 144, 144, 144, 144, 144, 144, 144,
- 144, 144, 144, 144, 144, 144, 144, 144,
- 144, 144, 144, 144, 144, 144, 144, 144,
- 144, 144, 144, 144, 144, 144, 144, 144,
- 144, 144, 144, 144, 144, 144, 144, 144,
- 144, 144, 144, 144, 144, 144, 144, 144,
- 144, 144, 144, 144, 144, 144, 144, 144,
- 144, 144, 144, 144, 144, 144, 144, 144,
- 144, 144, 144, 144, 144, 144, 144, 144,
- };
- YYDEBUG(1, *YYCURSOR);
- YYFILL(5);
- yych = *YYCURSOR;
- if (yybm[0+yych] & 64) {
- goto yy12;
- }
- switch (yych) {
- case '\t': goto yy6;
- case '\n': goto yy9;
- case '\r': goto yy11;
- case ' ':
- case '!':
- case '"':
- case '$':
- case '&':
- case '(':
- case ')':
- case '^':
- case '{':
- case '|':
- case '}':
- case '~': goto yy14;
- case ';': goto yy16;
- case '=': goto yy18;
- case 'F':
- case 'f': goto yy21;
- case 'N':
- case 'n': goto yy22;
- case 'O':
- case 'o': goto yy23;
- case 'T':
- case 't': goto yy24;
- case 'Y':
- case 'y': goto yy25;
- case '[': goto yy26;
- default: goto yy3;
- }
-yy3:
- YYDEBUG(3, *YYCURSOR);
- ++YYCURSOR;
- YYFILL(1);
- yych = *YYCURSOR;
-yy4:
- YYDEBUG(4, *YYCURSOR);
- if (yybm[0+yych] & 16) {
- goto yy3;
- }
- if (yych <= '=') goto yy5;
- if (yych <= '[') goto yy28;
-yy5:
- YYDEBUG(5, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 482 "Zend/zend_ini_scanner.l"
- { /* Get option name */
- /* Eat leading whitespace */
- EAT_LEADING_WHITESPACE();
-
- /* Eat trailing whitespace */
- EAT_TRAILING_WHITESPACE();
-
- RETURN_TOKEN(TC_LABEL, yytext, yyleng);
-}
-#line 519 "Zend/zend_ini_scanner.c"
-yy6:
- YYDEBUG(6, *YYCURSOR);
- ++YYCURSOR;
- YYFILL(2);
- yych = *YYCURSOR;
- YYDEBUG(7, *YYCURSOR);
- if (yybm[0+yych] & 32) {
- goto yy6;
- }
- if (yych <= '\r') {
- if (yych <= 0x08) goto yy8;
- if (yych <= '\n') goto yy9;
- if (yych >= '\r') goto yy11;
- } else {
- if (yych <= ';') {
- if (yych >= ';') goto yy16;
- } else {
- if (yych == '=') goto yy18;
- }
- }
-yy8:
- YYDEBUG(8, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 635 "Zend/zend_ini_scanner.l"
- {
- /* eat whitespace */
- goto restart;
-}
-#line 548 "Zend/zend_ini_scanner.c"
-yy9:
- YYDEBUG(9, *YYCURSOR);
- ++YYCURSOR;
-yy10:
- YYDEBUG(10, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 640 "Zend/zend_ini_scanner.l"
- {
- SCNG(lineno)++;
- return END_OF_LINE;
-}
-#line 560 "Zend/zend_ini_scanner.c"
-yy11:
- YYDEBUG(11, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == '\n') goto yy9;
- goto yy10;
-yy12:
- YYDEBUG(12, *YYCURSOR);
- ++YYCURSOR;
- YYFILL(2);
- yych = *YYCURSOR;
- YYDEBUG(13, *YYCURSOR);
- if (yybm[0+yych] & 64) {
- goto yy12;
- }
- if (yych <= '\'') {
- if (yych <= 0x1F) {
- if (yych <= '\n') {
- if (yych <= 0x08) goto yy3;
- if (yych <= '\t') goto yy6;
- goto yy9;
- } else {
- if (yych == '\r') goto yy11;
- goto yy3;
- }
- } else {
- if (yych <= '$') {
- if (yych == '#') goto yy3;
- goto yy5;
- } else {
- if (yych == '&') goto yy5;
- goto yy3;
- }
- }
- } else {
- if (yych <= 'Z') {
- if (yych <= ';') {
- if (yych <= ')') goto yy5;
- if (yych <= ':') goto yy3;
- goto yy16;
- } else {
- if (yych == '=') goto yy18;
- goto yy3;
- }
- } else {
- if (yych <= '^') {
- if (yych <= '[') goto yy28;
- if (yych <= ']') goto yy3;
- goto yy5;
- } else {
- if (yych <= 'z') goto yy3;
- if (yych <= '~') goto yy5;
- goto yy3;
- }
- }
- }
-yy14:
- YYDEBUG(14, *YYCURSOR);
- ++YYCURSOR;
- YYDEBUG(15, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 563 "Zend/zend_ini_scanner.l"
- { /* Disallow these chars outside option values */
- return yytext[0];
-}
-#line 625 "Zend/zend_ini_scanner.c"
-yy16:
- YYDEBUG(16, *YYCURSOR);
- ++YYCURSOR;
- YYFILL(2);
- yych = *YYCURSOR;
- YYDEBUG(17, *YYCURSOR);
- if (yybm[0+yych] & 128) {
- goto yy16;
- }
- if (yych <= '\n') goto yy31;
- goto yy33;
-yy18:
- YYDEBUG(18, *YYCURSOR);
- ++YYCURSOR;
- YYFILL(1);
- yych = *YYCURSOR;
- YYDEBUG(19, *YYCURSOR);
- if (yych == '\t') goto yy18;
- if (yych == ' ') goto yy18;
- YYDEBUG(20, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 492 "Zend/zend_ini_scanner.l"
- { /* Start option value */
- if (SCNG(scanner_mode) == ZEND_INI_SCANNER_RAW) {
- BEGIN(ST_RAW);
- } else {
- BEGIN(ST_VALUE);
- }
- return '=';
-}
-#line 656 "Zend/zend_ini_scanner.c"
-yy21:
- YYDEBUG(21, *YYCURSOR);
- yych = *++YYCURSOR;
- 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 yy35;
- if (yych <= 'T') goto yy4;
- goto yy37;
- } else {
- if (yych <= 'o') {
- if (yych <= 'n') goto yy4;
- goto yy35;
- } else {
- if (yych == 'u') goto yy37;
- goto yy4;
- }
- }
-yy23:
- YYDEBUG(23, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych <= 'N') {
- if (yych == 'F') goto yy38;
- if (yych <= 'M') goto yy4;
- goto yy39;
- } else {
- if (yych <= 'f') {
- if (yych <= 'e') goto yy4;
- goto yy38;
- } else {
- if (yych == 'n') goto yy39;
- goto yy4;
- }
- }
-yy24:
- YYDEBUG(24, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'R') goto yy42;
- if (yych == 'r') goto yy42;
- goto yy4;
-yy25:
- YYDEBUG(25, *YYCURSOR);
- yych = *++YYCURSOR;
- 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 407 "Zend/zend_ini_scanner.l"
- { /* Section start */
- /* Enter section data lookup state */
- if (SCNG(scanner_mode) == ZEND_INI_SCANNER_RAW) {
- BEGIN(ST_SECTION_RAW);
- } else {
- BEGIN(ST_SECTION_VALUE);
- }
- return TC_SECTION;
-}
-#line 722 "Zend/zend_ini_scanner.c"
-yy28:
- YYDEBUG(28, *YYCURSOR);
- ++YYCURSOR;
- YYFILL(1);
- yych = *YYCURSOR;
- YYDEBUG(29, *YYCURSOR);
- if (yych == '\t') goto yy28;
- if (yych == ' ') goto yy28;
- YYDEBUG(30, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 432 "Zend/zend_ini_scanner.l"
- { /* Start of option with offset */
- /* Eat leading whitespace */
- EAT_LEADING_WHITESPACE();
-
- /* Eat trailing whitespace and [ */
- EAT_TRAILING_WHITESPACE_EX('[');
-
- /* Enter offset lookup state */
- BEGIN(ST_OFFSET);
-
- RETURN_TOKEN(TC_OFFSET, yytext, yyleng);
-}
-#line 746 "Zend/zend_ini_scanner.c"
-yy31:
- YYDEBUG(31, *YYCURSOR);
- ++YYCURSOR;
-yy32:
- YYDEBUG(32, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 645 "Zend/zend_ini_scanner.l"
- { /* Comment */
- BEGIN(INITIAL);
- SCNG(lineno)++;
- return END_OF_LINE;
-}
-#line 759 "Zend/zend_ini_scanner.c"
-yy33:
- YYDEBUG(33, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == '\n') goto yy31;
- goto yy32;
-yy34:
- YYDEBUG(34, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'L') goto yy44;
- if (yych == 'l') goto yy44;
- goto yy4;
-yy35:
- YYDEBUG(35, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych <= '\'') {
- if (yych <= 0x1F) {
- if (yych <= '\n') {
- if (yych <= 0x08) goto yy4;
- if (yych <= '\t') goto yy45;
- } else {
- if (yych != '\r') goto yy4;
- }
- } else {
- if (yych <= '#') {
- if (yych <= ' ') goto yy47;
- if (yych >= '#') goto yy4;
- } else {
- if (yych == '%') goto yy4;
- if (yych >= '\'') goto yy4;
- }
- }
- } else {
- if (yych <= 'N') {
- if (yych <= ';') {
- if (yych <= ')') goto yy36;
- if (yych <= ':') goto yy4;
- } else {
- if (yych == '=') goto yy36;
- if (yych <= 'M') goto yy4;
- goto yy49;
- }
- } else {
- if (yych <= 'm') {
- if (yych != '^') goto yy4;
- } else {
- if (yych <= 'n') goto yy49;
- if (yych <= 'z') goto yy4;
- if (yych >= 0x7F) goto yy4;
- }
- }
- }
-yy36:
- YYDEBUG(36, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#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 818 "Zend/zend_ini_scanner.c"
-yy37:
- YYDEBUG(37, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'L') goto yy50;
- if (yych == 'l') goto yy50;
- goto yy4;
-yy38:
- YYDEBUG(38, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'F') goto yy47;
- if (yych == 'f') goto yy47;
- goto yy4;
-yy39:
- YYDEBUG(39, *YYCURSOR);
- ++YYCURSOR;
- YYFILL(1);
- yych = *YYCURSOR;
- YYDEBUG(40, *YYCURSOR);
- if (yych <= '&') {
- if (yych <= 0x1F) {
- if (yych <= '\n') {
- if (yych <= 0x08) goto yy3;
- if (yych <= '\t') goto yy51;
- } else {
- if (yych != '\r') goto yy3;
- }
- } else {
- if (yych <= '#') {
- if (yych <= ' ') goto yy39;
- if (yych >= '#') goto yy3;
- } else {
- if (yych == '%') goto yy3;
- }
- }
- } else {
- if (yych <= '=') {
- if (yych <= ':') {
- if (yych <= '\'') goto yy3;
- if (yych >= '*') goto yy3;
- } else {
- if (yych == '<') goto yy3;
- }
- } else {
- if (yych <= ']') {
- if (yych == '[') goto yy28;
- goto yy3;
- } else {
- if (yych <= '^') goto yy41;
- if (yych <= 'z') goto yy3;
- if (yych >= 0x7F) goto yy3;
- }
- }
- }
-yy41:
- YYDEBUG(41, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#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 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 == 'S') goto yy49;
- if (yych == 's') goto yy49;
- goto yy4;
-yy45:
- YYDEBUG(45, *YYCURSOR);
- ++YYCURSOR;
- YYFILL(1);
- yych = *YYCURSOR;
- YYDEBUG(46, *YYCURSOR);
- 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 <= '&') {
- if (yych <= 0x1F) {
- if (yych <= '\n') {
- if (yych <= 0x08) goto yy3;
- if (yych <= '\t') goto yy45;
- goto yy36;
- } else {
- if (yych == '\r') goto yy36;
- goto yy3;
- }
- } else {
- if (yych <= '#') {
- if (yych <= ' ') goto yy47;
- if (yych <= '"') goto yy36;
- goto yy3;
- } else {
- if (yych == '%') goto yy3;
- goto yy36;
- }
- }
- } else {
- if (yych <= '=') {
- if (yych <= ':') {
- if (yych <= '\'') goto yy3;
- if (yych <= ')') goto yy36;
- goto yy3;
- } else {
- if (yych == '<') goto yy3;
- goto yy36;
- }
- } else {
- if (yych <= ']') {
- if (yych == '[') goto yy28;
- goto yy3;
- } else {
- if (yych <= '^') goto yy36;
- if (yych <= 'z') goto yy3;
- if (yych <= '~') goto yy36;
- goto yy3;
- }
- }
- }
-yy49:
- YYDEBUG(49, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'E') goto yy47;
- if (yych == 'e') goto yy47;
- goto yy4;
-yy50:
- YYDEBUG(50, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'L') goto yy54;
- if (yych == 'l') goto yy54;
- goto yy4;
-yy51:
- YYDEBUG(51, *YYCURSOR);
- ++YYCURSOR;
- YYFILL(1);
- yych = *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 yy39;
- if (yych == 'e') goto yy39;
- goto yy4;
-yy54:
- YYDEBUG(54, *YYCURSOR);
- ++YYCURSOR;
- YYFILL(1);
- yych = *YYCURSOR;
- YYDEBUG(55, *YYCURSOR);
- if (yych <= '&') {
- if (yych <= 0x1F) {
- if (yych <= '\n') {
- if (yych <= 0x08) goto yy3;
- if (yych <= '\t') goto yy57;
- } else {
- if (yych != '\r') goto yy3;
- }
- } else {
- if (yych <= '#') {
- if (yych <= ' ') goto yy54;
- if (yych >= '#') goto yy3;
- } else {
- if (yych == '%') goto yy3;
- }
- }
- } else {
- if (yych <= '=') {
- if (yych <= ':') {
- if (yych <= '\'') goto yy3;
- if (yych >= '*') goto yy3;
- } else {
- if (yych == '<') goto yy3;
- }
- } else {
- if (yych <= ']') {
- if (yych == '[') goto yy28;
- goto yy3;
- } else {
- if (yych <= '^') goto yy56;
- if (yych <= 'z') goto yy3;
- if (yych >= 0x7F) goto yy3;
- }
- }
- }
-yy56:
- YYDEBUG(56, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 478 "Zend/zend_ini_scanner.l"
- {
- RETURN_TOKEN(NULL_NULL, "", 0);
-}
-#line 1030 "Zend/zend_ini_scanner.c"
-yy57:
- YYDEBUG(57, *YYCURSOR);
- ++YYCURSOR;
- YYFILL(1);
- yych = *YYCURSOR;
- YYDEBUG(58, *YYCURSOR);
- if (yych == '\t') goto yy57;
- if (yych == ' ') goto yy57;
- goto yy56;
- }
-/* *********************************** */
-yyc_ST_OFFSET:
- {
- static const unsigned char yybm[] = {
- 132, 132, 132, 132, 132, 132, 132, 132,
- 132, 140, 128, 132, 132, 128, 132, 132,
- 132, 132, 132, 132, 132, 132, 132, 132,
- 132, 132, 132, 132, 132, 132, 132, 132,
- 140, 132, 128, 132, 192, 132, 132, 0,
- 132, 132, 132, 132, 132, 132, 132, 132,
- 180, 180, 180, 180, 180, 180, 180, 180,
- 180, 180, 132, 128, 132, 132, 132, 132,
- 132, 164, 164, 164, 164, 164, 164, 164,
- 164, 164, 164, 164, 164, 164, 164, 164,
- 164, 164, 164, 164, 164, 164, 164, 164,
- 164, 164, 164, 132, 192, 128, 132, 164,
- 132, 164, 164, 164, 164, 164, 164, 164,
- 164, 164, 164, 164, 164, 164, 164, 164,
- 164, 164, 164, 164, 164, 164, 164, 164,
- 164, 164, 164, 132, 132, 132, 132, 132,
- 132, 132, 132, 132, 132, 132, 132, 132,
- 132, 132, 132, 132, 132, 132, 132, 132,
- 132, 132, 132, 132, 132, 132, 132, 132,
- 132, 132, 132, 132, 132, 132, 132, 132,
- 132, 132, 132, 132, 132, 132, 132, 132,
- 132, 132, 132, 132, 132, 132, 132, 132,
- 132, 132, 132, 132, 132, 132, 132, 132,
- 132, 132, 132, 132, 132, 132, 132, 132,
- 132, 132, 132, 132, 132, 132, 132, 132,
- 132, 132, 132, 132, 132, 132, 132, 132,
- 132, 132, 132, 132, 132, 132, 132, 132,
- 132, 132, 132, 132, 132, 132, 132, 132,
- 132, 132, 132, 132, 132, 132, 132, 132,
- 132, 132, 132, 132, 132, 132, 132, 132,
- 132, 132, 132, 132, 132, 132, 132, 132,
- 132, 132, 132, 132, 132, 132, 132, 132,
- };
- YYDEBUG(59, *YYCURSOR);
- YYFILL(2);
- yych = *YYCURSOR;
- if (yybm[0+yych] & 8) {
- goto yy64;
- }
- if (yych <= '/') {
- if (yych <= '"') {
- if (yych <= '\f') {
- if (yych <= 0x08) goto yy61;
- if (yych <= '\n') goto yy66;
- } else {
- if (yych <= '\r') goto yy66;
- if (yych >= '"') goto yy68;
- }
- } else {
- if (yych <= '&') {
- if (yych == '$') goto yy70;
- } else {
- if (yych <= '\'') goto yy71;
- if (yych <= ',') goto yy61;
- if (yych <= '.') goto yy72;
- }
- }
- } else {
- if (yych <= '[') {
- if (yych <= ';') {
- if (yych <= '9') goto yy73;
- if (yych >= ';') goto yy66;
- } else {
- if (yych <= '@') goto yy61;
- if (yych <= 'Z') goto yy76;
- }
- } else {
- if (yych <= '^') {
- if (yych <= '\\') goto yy79;
- if (yych <= ']') goto yy80;
- } else {
- if (yych == '`') goto yy61;
- if (yych <= 'z') goto yy76;
- }
- }
- }
-yy61:
- YYDEBUG(61, *YYCURSOR);
- yyaccept = 0;
- YYMARKER = ++YYCURSOR;
- YYFILL(1);
- yych = *YYCURSOR;
-yy62:
- YYDEBUG(62, *YYCURSOR);
- if (yybm[0+yych] & 4) {
- goto yy61;
- }
- 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 581 "Zend/zend_ini_scanner.l"
- { /* Get rest as section/offset value */
- RETURN_TOKEN(TC_STRING, yytext, yyleng);
-}
-#line 1143 "Zend/zend_ini_scanner.c"
-yy64:
- YYDEBUG(64, *YYCURSOR);
- yyaccept = 0;
- YYMARKER = ++YYCURSOR;
- YYFILL(1);
- yych = *YYCURSOR;
- YYDEBUG(65, *YYCURSOR);
- if (yybm[0+yych] & 8) {
- goto yy64;
- }
- if (yych <= '$') {
- if (yych <= '\r') {
- if (yych <= 0x08) goto yy61;
- if (yych <= '\n') goto yy63;
- if (yych <= '\f') goto yy61;
- goto yy63;
- } else {
- if (yych == '"') goto yy68;
- if (yych <= '#') goto yy61;
- goto yy82;
- }
- } else {
- if (yych <= ';') {
- if (yych == '\'') goto yy63;
- if (yych <= ':') goto yy61;
- goto yy63;
- } else {
- if (yych <= '[') goto yy61;
- if (yych <= '\\') goto yy79;
- if (yych <= ']') goto yy80;
- goto yy61;
- }
- }
-yy66:
- YYDEBUG(66, *YYCURSOR);
- ++YYCURSOR;
-yy67:
- YYDEBUG(67, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 656 "Zend/zend_ini_scanner.l"
- {
- return 0;
-}
-#line 1187 "Zend/zend_ini_scanner.c"
-yy68:
- YYDEBUG(68, *YYCURSOR);
- ++YYCURSOR;
- YYDEBUG(69, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 585 "Zend/zend_ini_scanner.l"
- { /* Double quoted '"' string start */
- yy_push_state(ST_DOUBLE_QUOTES);
- return '"';
-}
-#line 1198 "Zend/zend_ini_scanner.c"
-yy70:
- YYDEBUG(70, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych <= '\\') {
- if (yych <= 0x00) goto yy67;
- if (yych <= '[') goto yy61;
- goto yy84;
- } else {
- if (yych == '{') goto yy86;
- goto yy61;
- }
-yy71:
- YYDEBUG(71, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yybm[0+yych] & 128) {
- goto yy88;
- }
- goto yy67;
-yy72:
- YYDEBUG(72, *YYCURSOR);
- yyaccept = 0;
- yych = *(YYMARKER = ++YYCURSOR);
- if (yych <= '/') goto yy62;
- if (yych <= '9') goto yy90;
- goto yy62;
-yy73:
- YYDEBUG(73, *YYCURSOR);
- yyaccept = 1;
- YYMARKER = ++YYCURSOR;
- YYFILL(1);
- yych = *YYCURSOR;
- YYDEBUG(74, *YYCURSOR);
- if (yybm[0+yych] & 16) {
- goto yy73;
- }
- if (yych <= '&') {
- if (yych <= '\r') {
- if (yych == '\n') goto yy75;
- if (yych <= '\f') goto yy61;
- } else {
- if (yych <= '"') {
- if (yych <= '!') goto yy61;
- } else {
- if (yych == '$') goto yy82;
- goto yy61;
- }
- }
- } else {
- if (yych <= ':') {
- if (yych <= '\'') goto yy75;
- if (yych == '.') goto yy90;
- goto yy61;
- } else {
- if (yych <= '[') {
- if (yych >= '<') goto yy61;
- } else {
- if (yych <= '\\') goto yy79;
- if (yych >= '^') goto yy61;
- }
- }
- }
-yy75:
- YYDEBUG(75, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 559 "Zend/zend_ini_scanner.l"
- { /* Get number option value as string */
- RETURN_TOKEN(TC_NUMBER, yytext, yyleng);
-}
-#line 1267 "Zend/zend_ini_scanner.c"
-yy76:
- YYDEBUG(76, *YYCURSOR);
- yyaccept = 2;
- YYMARKER = ++YYCURSOR;
- YYFILL(1);
- yych = *YYCURSOR;
- YYDEBUG(77, *YYCURSOR);
- if (yybm[0+yych] & 32) {
- goto yy76;
- }
- if (yych <= '$') {
- if (yych <= '\r') {
- if (yych == '\n') goto yy78;
- if (yych <= '\f') goto yy61;
- } else {
- if (yych == '"') goto yy78;
- if (yych <= '#') goto yy61;
- goto yy82;
- }
- } else {
- if (yych <= ';') {
- if (yych == '\'') goto yy78;
- if (yych <= ':') goto yy61;
- } else {
- if (yych <= '[') goto yy61;
- if (yych <= '\\') goto yy79;
- if (yych >= '^') goto yy61;
- }
- }
-yy78:
- YYDEBUG(78, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 555 "Zend/zend_ini_scanner.l"
- { /* Get constant option value */
- RETURN_TOKEN(TC_CONSTANT, yytext, yyleng);
-}
-#line 1304 "Zend/zend_ini_scanner.c"
-yy79:
- YYDEBUG(79, *YYCURSOR);
- ++YYCURSOR;
- YYFILL(1);
- yych = *YYCURSOR;
- goto yy61;
-yy80:
- YYDEBUG(80, *YYCURSOR);
- ++YYCURSOR;
- YYDEBUG(81, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 445 "Zend/zend_ini_scanner.l"
- { /* End of section or an option offset */
- BEGIN(INITIAL);
- return ']';
-}
-#line 1321 "Zend/zend_ini_scanner.c"
-yy82:
- YYDEBUG(82, *YYCURSOR);
- ++YYCURSOR;
- YYFILL(1);
- yych = *YYCURSOR;
- if (yych <= '\\') {
- if (yych <= 0x00) goto yy83;
- if (yych <= '[') goto yy61;
- goto yy84;
- } else {
- if (yych != '{') goto yy61;
- }
-yy83:
- YYDEBUG(83, *YYCURSOR);
- YYCURSOR = YYMARKER;
- if (yyaccept <= 1) {
- if (yyaccept == 0) {
- goto yy63;
- } else {
- goto yy75;
- }
- } else {
- goto yy78;
- }
-yy84:
- YYDEBUG(84, *YYCURSOR);
- ++YYCURSOR;
- YYFILL(1);
- yych = *YYCURSOR;
- YYDEBUG(85, *YYCURSOR);
- if (yybm[0+yych] & 64) {
- goto yy84;
- }
- goto yy61;
-yy86:
- YYDEBUG(86, *YYCURSOR);
- ++YYCURSOR;
- YYDEBUG(87, *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 1366 "Zend/zend_ini_scanner.c"
-yy88:
- YYDEBUG(88, *YYCURSOR);
- ++YYCURSOR;
- YYFILL(1);
- yych = *YYCURSOR;
- YYDEBUG(89, *YYCURSOR);
- if (yybm[0+yych] & 128) {
- goto yy88;
- }
- goto yy92;
-yy90:
- YYDEBUG(90, *YYCURSOR);
- yyaccept = 1;
- YYMARKER = ++YYCURSOR;
- YYFILL(1);
- yych = *YYCURSOR;
- YYDEBUG(91, *YYCURSOR);
- if (yych <= '&') {
- if (yych <= '\r') {
- if (yych == '\n') goto yy75;
- if (yych <= '\f') goto yy61;
- goto yy75;
- } else {
- if (yych <= '"') {
- if (yych <= '!') goto yy61;
- goto yy75;
- } else {
- if (yych == '$') goto yy82;
- goto yy61;
- }
- }
- } else {
- if (yych <= ':') {
- if (yych <= '\'') goto yy75;
- if (yych <= '/') goto yy61;
- if (yych <= '9') goto yy90;
- goto yy61;
- } else {
- if (yych <= '[') {
- if (yych <= ';') goto yy75;
- goto yy61;
- } else {
- if (yych <= '\\') goto yy79;
- if (yych <= ']') goto yy75;
- goto yy61;
- }
- }
- }
-yy92:
- YYDEBUG(92, *YYCURSOR);
- ++YYCURSOR;
- YYDEBUG(93, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 417 "Zend/zend_ini_scanner.l"
- { /* Raw string */
- /* Eat leading and trailing single quotes */
- if (yytext[0] == '\'' && yytext[yyleng - 1] == '\'') {
- SCNG(yy_text)++;
- yyleng = yyleng - 2;
- }
- RETURN_TOKEN(TC_RAW, yytext, yyleng);
-}
-#line 1429 "Zend/zend_ini_scanner.c"
- }
-/* *********************************** */
-yyc_ST_SECTION_VALUE:
- {
- static const unsigned char yybm[] = {
- 132, 132, 132, 132, 132, 132, 132, 132,
- 132, 140, 128, 132, 132, 128, 132, 132,
- 132, 132, 132, 132, 132, 132, 132, 132,
- 132, 132, 132, 132, 132, 132, 132, 132,
- 140, 132, 128, 132, 192, 132, 132, 0,
- 132, 132, 132, 132, 132, 132, 132, 132,
- 180, 180, 180, 180, 180, 180, 180, 180,
- 180, 180, 132, 128, 132, 132, 132, 132,
- 132, 164, 164, 164, 164, 164, 164, 164,
- 164, 164, 164, 164, 164, 164, 164, 164,
- 164, 164, 164, 164, 164, 164, 164, 164,
- 164, 164, 164, 132, 192, 128, 132, 164,
- 132, 164, 164, 164, 164, 164, 164, 164,
- 164, 164, 164, 164, 164, 164, 164, 164,
- 164, 164, 164, 164, 164, 164, 164, 164,
- 164, 164, 164, 132, 132, 132, 132, 132,
- 132, 132, 132, 132, 132, 132, 132, 132,
- 132, 132, 132, 132, 132, 132, 132, 132,
- 132, 132, 132, 132, 132, 132, 132, 132,
- 132, 132, 132, 132, 132, 132, 132, 132,
- 132, 132, 132, 132, 132, 132, 132, 132,
- 132, 132, 132, 132, 132, 132, 132, 132,
- 132, 132, 132, 132, 132, 132, 132, 132,
- 132, 132, 132, 132, 132, 132, 132, 132,
- 132, 132, 132, 132, 132, 132, 132, 132,
- 132, 132, 132, 132, 132, 132, 132, 132,
- 132, 132, 132, 132, 132, 132, 132, 132,
- 132, 132, 132, 132, 132, 132, 132, 132,
- 132, 132, 132, 132, 132, 132, 132, 132,
- 132, 132, 132, 132, 132, 132, 132, 132,
- 132, 132, 132, 132, 132, 132, 132, 132,
- 132, 132, 132, 132, 132, 132, 132, 132,
- };
- YYDEBUG(94, *YYCURSOR);
- YYFILL(2);
- yych = *YYCURSOR;
- if (yybm[0+yych] & 8) {
- goto yy99;
- }
- if (yych <= '/') {
- if (yych <= '"') {
- if (yych <= '\f') {
- if (yych <= 0x08) goto yy96;
- if (yych <= '\n') goto yy101;
- } else {
- if (yych <= '\r') goto yy101;
- if (yych >= '"') goto yy103;
- }
- } else {
- if (yych <= '&') {
- if (yych == '$') goto yy105;
- } else {
- if (yych <= '\'') goto yy106;
- if (yych <= ',') goto yy96;
- if (yych <= '.') goto yy107;
- }
- }
- } else {
- if (yych <= '[') {
- if (yych <= ';') {
- if (yych <= '9') goto yy108;
- if (yych >= ';') goto yy101;
- } else {
- if (yych <= '@') goto yy96;
- if (yych <= 'Z') goto yy111;
- }
- } else {
- if (yych <= '^') {
- if (yych <= '\\') goto yy114;
- if (yych <= ']') goto yy115;
- } else {
- if (yych == '`') goto yy96;
- if (yych <= 'z') goto yy111;
- }
- }
- }
-yy96:
- YYDEBUG(96, *YYCURSOR);
- yyaccept = 0;
- YYMARKER = ++YYCURSOR;
- YYFILL(1);
- yych = *YYCURSOR;
-yy97:
- YYDEBUG(97, *YYCURSOR);
- if (yybm[0+yych] & 4) {
- goto yy96;
- }
- 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 581 "Zend/zend_ini_scanner.l"
- { /* Get rest as section/offset value */
- RETURN_TOKEN(TC_STRING, yytext, yyleng);
-}
-#line 1533 "Zend/zend_ini_scanner.c"
-yy99:
- YYDEBUG(99, *YYCURSOR);
- yyaccept = 0;
- YYMARKER = ++YYCURSOR;
- YYFILL(1);
- yych = *YYCURSOR;
- YYDEBUG(100, *YYCURSOR);
- if (yybm[0+yych] & 8) {
- goto yy99;
- }
- if (yych <= '$') {
- if (yych <= '\r') {
- if (yych <= 0x08) goto yy96;
- if (yych <= '\n') goto yy98;
- if (yych <= '\f') goto yy96;
- goto yy98;
- } else {
- if (yych == '"') goto yy103;
- if (yych <= '#') goto yy96;
- goto yy118;
- }
- } else {
- if (yych <= ';') {
- if (yych == '\'') goto yy98;
- if (yych <= ':') goto yy96;
- goto yy98;
- } else {
- if (yych <= '[') goto yy96;
- if (yych <= '\\') goto yy114;
- if (yych <= ']') goto yy98;
- goto yy96;
- }
- }
-yy101:
- YYDEBUG(101, *YYCURSOR);
- ++YYCURSOR;
-yy102:
- YYDEBUG(102, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 656 "Zend/zend_ini_scanner.l"
- {
- return 0;
-}
-#line 1577 "Zend/zend_ini_scanner.c"
-yy103:
- YYDEBUG(103, *YYCURSOR);
- ++YYCURSOR;
- YYDEBUG(104, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 585 "Zend/zend_ini_scanner.l"
- { /* Double quoted '"' string start */
- yy_push_state(ST_DOUBLE_QUOTES);
- return '"';
-}
-#line 1588 "Zend/zend_ini_scanner.c"
-yy105:
- YYDEBUG(105, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych <= '\\') {
- if (yych <= 0x00) goto yy102;
- if (yych <= '[') goto yy96;
- goto yy120;
- } else {
- if (yych == '{') goto yy122;
- goto yy96;
- }
-yy106:
- YYDEBUG(106, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yybm[0+yych] & 128) {
- goto yy124;
- }
- goto yy102;
-yy107:
- YYDEBUG(107, *YYCURSOR);
- yyaccept = 0;
- yych = *(YYMARKER = ++YYCURSOR);
- if (yych <= '/') goto yy97;
- if (yych <= '9') goto yy126;
- goto yy97;
-yy108:
- YYDEBUG(108, *YYCURSOR);
- yyaccept = 1;
- YYMARKER = ++YYCURSOR;
- YYFILL(1);
- yych = *YYCURSOR;
- YYDEBUG(109, *YYCURSOR);
- if (yybm[0+yych] & 16) {
- goto yy108;
- }
- if (yych <= '&') {
- if (yych <= '\r') {
- if (yych == '\n') goto yy110;
- if (yych <= '\f') goto yy96;
- } else {
- if (yych <= '"') {
- if (yych <= '!') goto yy96;
- } else {
- if (yych == '$') goto yy118;
- goto yy96;
- }
- }
- } else {
- if (yych <= ':') {
- if (yych <= '\'') goto yy110;
- if (yych == '.') goto yy126;
- goto yy96;
- } else {
- if (yych <= '[') {
- if (yych >= '<') goto yy96;
- } else {
- if (yych <= '\\') goto yy114;
- if (yych >= '^') goto yy96;
- }
- }
- }
-yy110:
- YYDEBUG(110, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 559 "Zend/zend_ini_scanner.l"
- { /* Get number option value as string */
- RETURN_TOKEN(TC_NUMBER, yytext, yyleng);
-}
-#line 1657 "Zend/zend_ini_scanner.c"
-yy111:
- YYDEBUG(111, *YYCURSOR);
- yyaccept = 2;
- YYMARKER = ++YYCURSOR;
- YYFILL(1);
- yych = *YYCURSOR;
- YYDEBUG(112, *YYCURSOR);
- if (yybm[0+yych] & 32) {
- goto yy111;
- }
- if (yych <= '$') {
- if (yych <= '\r') {
- if (yych == '\n') goto yy113;
- if (yych <= '\f') goto yy96;
- } else {
- if (yych == '"') goto yy113;
- if (yych <= '#') goto yy96;
- goto yy118;
- }
- } else {
- if (yych <= ';') {
- if (yych == '\'') goto yy113;
- if (yych <= ':') goto yy96;
- } else {
- if (yych <= '[') goto yy96;
- if (yych <= '\\') goto yy114;
- if (yych >= '^') goto yy96;
- }
- }
-yy113:
- YYDEBUG(113, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 555 "Zend/zend_ini_scanner.l"
- { /* Get constant option value */
- RETURN_TOKEN(TC_CONSTANT, yytext, yyleng);
-}
-#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(116, *YYCURSOR);
- if (yych <= '\f') {
- if (yych <= 0x08) goto yy117;
- if (yych <= '\t') goto yy115;
- if (yych <= '\n') goto yy128;
- } else {
- if (yych <= '\r') goto yy129;
- if (yych == ' ') goto yy115;
- }
-yy117:
- YYDEBUG(117, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 426 "Zend/zend_ini_scanner.l"
- { /* End of section */
- BEGIN(INITIAL);
- SCNG(lineno)++;
- return ']';
-}
-#line 1724 "Zend/zend_ini_scanner.c"
-yy118:
- YYDEBUG(118, *YYCURSOR);
- ++YYCURSOR;
- YYFILL(1);
- yych = *YYCURSOR;
- if (yych <= '\\') {
- if (yych <= 0x00) goto yy119;
- if (yych <= '[') goto yy96;
- goto yy120;
- } else {
- if (yych != '{') goto yy96;
- }
-yy119:
- YYDEBUG(119, *YYCURSOR);
- YYCURSOR = YYMARKER;
- if (yyaccept <= 1) {
- if (yyaccept == 0) {
- goto yy98;
- } else {
- goto yy110;
- }
- } else {
- goto yy113;
- }
-yy120:
- YYDEBUG(120, *YYCURSOR);
- ++YYCURSOR;
- YYFILL(1);
- yych = *YYCURSOR;
- YYDEBUG(121, *YYCURSOR);
- if (yybm[0+yych] & 64) {
- goto yy120;
- }
- goto yy96;
-yy122:
- YYDEBUG(122, *YYCURSOR);
- ++YYCURSOR;
- YYDEBUG(123, *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 1769 "Zend/zend_ini_scanner.c"
-yy124:
- YYDEBUG(124, *YYCURSOR);
- ++YYCURSOR;
- YYFILL(1);
- yych = *YYCURSOR;
- YYDEBUG(125, *YYCURSOR);
- if (yybm[0+yych] & 128) {
- goto yy124;
- }
- goto yy130;
-yy126:
- YYDEBUG(126, *YYCURSOR);
- yyaccept = 1;
- YYMARKER = ++YYCURSOR;
- YYFILL(1);
- yych = *YYCURSOR;
- YYDEBUG(127, *YYCURSOR);
- if (yych <= '&') {
- if (yych <= '\r') {
- if (yych == '\n') goto yy110;
- if (yych <= '\f') goto yy96;
- goto yy110;
- } else {
- if (yych <= '"') {
- if (yych <= '!') goto yy96;
- goto yy110;
- } else {
- if (yych == '$') goto yy118;
- goto yy96;
- }
- }
- } else {
- if (yych <= ':') {
- if (yych <= '\'') goto yy110;
- if (yych <= '/') goto yy96;
- if (yych <= '9') goto yy126;
- goto yy96;
- } else {
- if (yych <= '[') {
- if (yych <= ';') goto yy110;
- goto yy96;
- } else {
- if (yych <= '\\') goto yy114;
- if (yych <= ']') goto yy110;
- goto yy96;
- }
- }
- }
-yy128:
- YYDEBUG(128, *YYCURSOR);
- ++YYCURSOR;
- goto yy117;
-yy129:
- YYDEBUG(129, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == '\n') goto yy128;
- goto yy117;
-yy130:
- YYDEBUG(130, *YYCURSOR);
- ++YYCURSOR;
- YYDEBUG(131, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 417 "Zend/zend_ini_scanner.l"
- { /* Raw string */
- /* Eat leading and trailing single quotes */
- if (yytext[0] == '\'' && yytext[yyleng - 1] == '\'') {
- SCNG(yy_text)++;
- yyleng = yyleng - 2;
- }
- RETURN_TOKEN(TC_RAW, yytext, yyleng);
-}
-#line 1841 "Zend/zend_ini_scanner.c"
- }
-/* *********************************** */
-yyc_ST_VALUE:
- {
- static const unsigned char yybm[] = {
- 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, 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, 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, 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(132, *YYCURSOR);
- YYFILL(6);
- yych = *YYCURSOR;
- if (yybm[0+yych] & 4) {
- goto yy139;
- }
- switch (yych) {
- case 0x00: goto yy134;
- case '\t':
- case '\n': goto yy142;
- case '\r': goto yy144;
- case ' ':
- case '!':
- case '&':
- case '(':
- case ')':
- case '^':
- case '|':
- case '~': goto yy145;
- case '"': goto yy148;
- case '$': goto yy150;
- case '\'': goto yy151;
- case '-':
- case '.': goto yy152;
- case '0':
- case '1':
- case '2':
- case '3':
- case '4':
- case '5':
- case '6':
- case '7':
- case '8':
- case '9': goto yy153;
- case ';': goto yy156;
- case '=': goto yy158;
- case 'A':
- case 'B':
- case 'C':
- case 'D':
- case 'E':
- case 'G':
- case 'H':
- case 'I':
- case 'J':
- case 'K':
- case 'L':
- case 'M':
- case 'P':
- case 'Q':
- case 'R':
- case 'S':
- case 'U':
- case 'V':
- case 'W':
- case 'X':
- case 'Z':
- case '_':
- case 'a':
- case 'b':
- case 'c':
- case 'd':
- case 'e':
- case 'g':
- case 'h':
- case 'i':
- case 'j':
- case 'k':
- case 'l':
- case 'm':
- case 'p':
- case 'q':
- case 'r':
- case 's':
- case 'u':
- case 'v':
- case 'w':
- case 'x':
- case 'z': goto yy160;
- case 'F':
- case 'f': goto yy163;
- case 'N':
- case 'n': goto yy164;
- case 'O':
- case 'o': goto yy165;
- case 'T':
- case 't': goto yy166;
- case 'Y':
- case 'y': goto yy167;
- default: goto yy136;
- }
-yy134:
- YYDEBUG(134, *YYCURSOR);
- ++YYCURSOR;
-yy135:
- YYDEBUG(135, *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 1982 "Zend/zend_ini_scanner.c"
-yy136:
- YYDEBUG(136, *YYCURSOR);
- yyaccept = 0;
- YYMARKER = ++YYCURSOR;
- YYFILL(1);
- yych = *YYCURSOR;
-yy137:
- YYDEBUG(137, *YYCURSOR);
- if (yybm[0+yych] & 2) {
- goto yy136;
- }
- if (yych <= '"') goto yy138;
- if (yych <= '$') goto yy168;
-yy138:
- YYDEBUG(138, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 577 "Zend/zend_ini_scanner.l"
- { /* Get everything else as option/offset value */
- RETURN_TOKEN(TC_STRING, yytext, yyleng);
-}
-#line 2003 "Zend/zend_ini_scanner.c"
-yy139:
- YYDEBUG(139, *YYCURSOR);
- ++YYCURSOR;
- YYFILL(2);
- yych = *YYCURSOR;
- YYDEBUG(140, *YYCURSOR);
- if (yybm[0+yych] & 4) {
- goto yy139;
- }
- if (yych <= '\r') {
- if (yych <= 0x08) goto yy141;
- if (yych <= '\n') goto yy142;
- if (yych >= '\r') goto yy144;
- } else {
- if (yych <= '"') {
- if (yych >= '"') goto yy148;
- } else {
- if (yych == ';') goto yy156;
- }
- }
-yy141:
- YYDEBUG(141, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 631 "Zend/zend_ini_scanner.l"
- {
- RETURN_TOKEN(TC_WHITESPACE, yytext, yyleng);
-}
-#line 2031 "Zend/zend_ini_scanner.c"
-yy142:
- YYDEBUG(142, *YYCURSOR);
- ++YYCURSOR;
-yy143:
- YYDEBUG(143, *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 2044 "Zend/zend_ini_scanner.c"
-yy144:
- YYDEBUG(144, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == '\n') goto yy142;
- goto yy143;
-yy145:
- YYDEBUG(145, *YYCURSOR);
- ++YYCURSOR;
- YYFILL(1);
- yych = *YYCURSOR;
- YYDEBUG(146, *YYCURSOR);
- if (yych == '\t') goto yy145;
- if (yych == ' ') goto yy145;
- YYDEBUG(147, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 567 "Zend/zend_ini_scanner.l"
- { /* Boolean operators */
- return yytext[0];
-}
-#line 2064 "Zend/zend_ini_scanner.c"
-yy148:
- YYDEBUG(148, *YYCURSOR);
- ++YYCURSOR;
- YYDEBUG(149, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 585 "Zend/zend_ini_scanner.l"
- { /* Double quoted '"' string start */
- yy_push_state(ST_DOUBLE_QUOTES);
- return '"';
-}
-#line 2075 "Zend/zend_ini_scanner.c"
-yy150:
- YYDEBUG(150, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych <= '\\') {
- if (yych <= 0x00) goto yy135;
- if (yych <= '[') goto yy136;
- goto yy170;
- } else {
- if (yych == '{') goto yy171;
- goto yy136;
- }
-yy151:
- YYDEBUG(151, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yybm[0+yych] & 64) {
- goto yy173;
- }
- goto yy135;
-yy152:
- YYDEBUG(152, *YYCURSOR);
- yyaccept = 0;
- yych = *(YYMARKER = ++YYCURSOR);
- if (yych <= '/') goto yy137;
- if (yych <= '9') goto yy175;
- goto yy137;
-yy153:
- YYDEBUG(153, *YYCURSOR);
- yyaccept = 1;
- YYMARKER = ++YYCURSOR;
- YYFILL(1);
- yych = *YYCURSOR;
- YYDEBUG(154, *YYCURSOR);
- if (yybm[0+yych] & 8) {
- goto yy153;
- }
- if (yych <= '-') {
- if (yych <= 0x1F) {
- if (yych <= '\n') {
- if (yych <= 0x00) goto yy155;
- if (yych <= 0x08) goto yy136;
- } else {
- if (yych != '\r') goto yy136;
- }
- } else {
- if (yych <= '$') {
- if (yych <= '"') goto yy155;
- if (yych <= '#') goto yy136;
- goto yy168;
- } else {
- if (yych <= '%') goto yy136;
- if (yych >= '*') goto yy136;
- }
- }
- } else {
- if (yych <= ']') {
- if (yych <= ';') {
- if (yych <= '.') goto yy175;
- if (yych <= ':') goto yy136;
- } else {
- if (yych != '=') goto yy136;
- }
- } else {
- if (yych <= '|') {
- if (yych <= '^') goto yy155;
- if (yych <= '{') goto yy136;
- } else {
- if (yych != '~') goto yy136;
- }
- }
- }
-yy155:
- YYDEBUG(155, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 559 "Zend/zend_ini_scanner.l"
- { /* Get number option value as string */
- RETURN_TOKEN(TC_NUMBER, yytext, yyleng);
-}
-#line 2153 "Zend/zend_ini_scanner.c"
-yy156:
- YYDEBUG(156, *YYCURSOR);
- ++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 571 "Zend/zend_ini_scanner.l"
- { /* Make = used in option value to trigger error */
- yyless(0);
- BEGIN(INITIAL);
- return END_OF_LINE;
-}
-#line 2176 "Zend/zend_ini_scanner.c"
-yy160:
- YYDEBUG(160, *YYCURSOR);
- yyaccept = 2;
- YYMARKER = ++YYCURSOR;
- YYFILL(1);
- yych = *YYCURSOR;
- YYDEBUG(161, *YYCURSOR);
- if (yybm[0+yych] & 32) {
- goto yy160;
- }
- if (yych <= ')') {
- if (yych <= '\r') {
- if (yych <= 0x08) {
- if (yych >= 0x01) goto yy136;
- } else {
- if (yych <= '\n') goto yy162;
- if (yych <= '\f') goto yy136;
- }
- } else {
- if (yych <= '#') {
- if (yych <= 0x1F) goto yy136;
- if (yych >= '#') goto yy136;
- } else {
- if (yych <= '$') goto yy168;
- if (yych <= '%') goto yy136;
- }
- }
- } else {
- if (yych <= ']') {
- if (yych <= ';') {
- if (yych <= ':') goto yy136;
- } else {
- if (yych != '=') goto yy136;
- }
- } else {
- if (yych <= '|') {
- if (yych <= '^') goto yy162;
- if (yych <= '{') goto yy136;
- } else {
- if (yych != '~') goto yy136;
- }
- }
- }
-yy162:
- YYDEBUG(162, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 555 "Zend/zend_ini_scanner.l"
- { /* Get constant option value */
- RETURN_TOKEN(TC_CONSTANT, yytext, yyleng);
-}
-#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 yy162;
- if (yych <= 0x08) goto yy137;
- goto yy162;
- } else {
- if (yych == '\r') goto yy162;
- if (yych <= 0x1F) goto yy137;
- goto yy162;
- }
- } else {
- if (yych <= '/') {
- if (yych <= '%') goto yy137;
- if (yych <= ')') goto yy162;
- goto yy137;
- } else {
- if (yych <= '9') goto yy160;
- if (yych == ';') goto yy162;
- goto yy137;
- }
- }
- } else {
- if (yych <= '_') {
- if (yych <= 'A') {
- if (yych <= '=') goto yy162;
- if (yych <= '@') goto yy137;
- goto yy180;
- } else {
- if (yych <= 'Z') goto yy160;
- if (yych <= ']') goto yy137;
- if (yych <= '^') goto yy162;
- goto yy160;
- }
- } else {
- if (yych <= '{') {
- if (yych <= '`') goto yy137;
- if (yych <= 'a') goto yy180;
- if (yych <= 'z') goto yy160;
- goto yy137;
- } else {
- if (yych == '}') goto yy137;
- if (yych <= '~') goto yy162;
- goto yy137;
- }
- }
- }
-yy164:
- YYDEBUG(164, *YYCURSOR);
- yyaccept = 2;
- yych = *(YYMARKER = ++YYCURSOR);
- if (yych <= 'N') {
- if (yych <= '%') {
- if (yych <= '\f') {
- if (yych <= 0x00) goto yy162;
- if (yych <= 0x08) goto yy137;
- if (yych <= '\n') goto yy162;
- goto yy137;
- } else {
- if (yych <= '\r') goto yy162;
- if (yych <= 0x1F) goto yy137;
- if (yych <= '"') goto yy162;
- goto yy137;
- }
- } else {
- if (yych <= ':') {
- if (yych <= ')') goto yy162;
- if (yych <= '/') goto yy137;
- if (yych <= '9') goto yy160;
- goto yy137;
- } else {
- if (yych <= '<') {
- if (yych <= ';') goto yy162;
- goto yy137;
- } else {
- if (yych <= '=') goto yy162;
- if (yych <= '@') goto yy137;
- goto yy160;
- }
- }
- }
- } else {
- if (yych <= 'n') {
- if (yych <= 'Z') {
- if (yych <= 'O') goto yy181;
- if (yych == 'U') goto yy183;
- goto yy160;
- } else {
- if (yych <= '^') {
- if (yych <= ']') goto yy137;
- goto yy162;
- } else {
- if (yych == '`') goto yy137;
- goto yy160;
- }
- }
- } else {
- if (yych <= 'z') {
- if (yych <= 'o') goto yy181;
- if (yych == 'u') goto yy183;
- goto yy160;
- } else {
- if (yych <= '|') {
- if (yych <= '{') goto yy137;
- goto yy162;
- } else {
- if (yych == '~') goto yy162;
- goto yy137;
- }
- }
- }
- }
-yy165:
- YYDEBUG(165, *YYCURSOR);
- yyaccept = 2;
- yych = *(YYMARKER = ++YYCURSOR);
- if (yych <= 'E') {
- if (yych <= '%') {
- if (yych <= '\f') {
- if (yych <= 0x00) goto yy162;
- if (yych <= 0x08) goto yy137;
- if (yych <= '\n') goto yy162;
- goto yy137;
- } else {
- if (yych <= '\r') goto yy162;
- if (yych <= 0x1F) goto yy137;
- if (yych <= '"') goto yy162;
- goto yy137;
- }
- } else {
- if (yych <= ':') {
- if (yych <= ')') goto yy162;
- if (yych <= '/') goto yy137;
- if (yych <= '9') goto yy160;
- goto yy137;
- } else {
- if (yych <= '<') {
- if (yych <= ';') goto yy162;
- goto yy137;
- } else {
- if (yych <= '=') goto yy162;
- if (yych <= '@') goto yy137;
- goto yy160;
- }
- }
- }
- } else {
- if (yych <= 'e') {
- if (yych <= 'Z') {
- if (yych <= 'F') goto yy184;
- if (yych == 'N') goto yy185;
- goto yy160;
- } else {
- if (yych <= '^') {
- if (yych <= ']') goto yy137;
- goto yy162;
- } else {
- if (yych == '`') goto yy137;
- goto yy160;
- }
- }
- } else {
- if (yych <= 'z') {
- if (yych <= 'f') goto yy184;
- if (yych == 'n') goto yy185;
- goto yy160;
- } else {
- if (yych <= '|') {
- if (yych <= '{') goto yy137;
- goto yy162;
- } else {
- if (yych == '~') goto yy162;
- goto yy137;
- }
- }
- }
- }
-yy166:
- YYDEBUG(166, *YYCURSOR);
- yyaccept = 2;
- yych = *(YYMARKER = ++YYCURSOR);
- if (yych <= '=') {
- if (yych <= '"') {
- if (yych <= '\n') {
- if (yych <= 0x00) goto yy162;
- if (yych <= 0x08) goto yy137;
- goto yy162;
- } else {
- if (yych == '\r') goto yy162;
- if (yych <= 0x1F) goto yy137;
- goto yy162;
- }
- } else {
- if (yych <= '9') {
- if (yych <= '%') goto yy137;
- if (yych <= ')') goto yy162;
- if (yych <= '/') goto yy137;
- goto yy160;
- } else {
- if (yych == ';') goto yy162;
- if (yych <= '<') goto yy137;
- goto yy162;
- }
- }
- } else {
- if (yych <= '`') {
- if (yych <= 'Z') {
- if (yych <= '@') goto yy137;
- if (yych == 'R') goto yy187;
- goto yy160;
- } else {
- if (yych <= ']') goto yy137;
- if (yych <= '^') goto yy162;
- if (yych <= '_') goto yy160;
- goto yy137;
- }
- } else {
- if (yych <= '{') {
- if (yych == 'r') goto yy187;
- if (yych <= 'z') goto yy160;
- goto yy137;
- } else {
- if (yych == '}') goto yy137;
- if (yych <= '~') goto yy162;
- goto yy137;
- }
- }
- }
-yy167:
- YYDEBUG(167, *YYCURSOR);
- yyaccept = 2;
- yych = *(YYMARKER = ++YYCURSOR);
- if (yych <= '=') {
- if (yych <= '"') {
- if (yych <= '\n') {
- if (yych <= 0x00) goto yy162;
- if (yych <= 0x08) goto yy137;
- goto yy162;
- } else {
- if (yych == '\r') goto yy162;
- if (yych <= 0x1F) goto yy137;
- goto yy162;
- }
- } else {
- if (yych <= '9') {
- if (yych <= '%') goto yy137;
- if (yych <= ')') goto yy162;
- if (yych <= '/') goto yy137;
- goto yy160;
- } else {
- if (yych == ';') goto yy162;
- if (yych <= '<') goto yy137;
- goto yy162;
- }
- }
- } else {
- if (yych <= '`') {
- if (yych <= 'Z') {
- if (yych <= '@') goto yy137;
- if (yych == 'E') goto yy188;
- goto yy160;
- } else {
- if (yych <= ']') goto yy137;
- if (yych <= '^') goto yy162;
- if (yych <= '_') goto yy160;
- goto yy137;
- }
- } else {
- if (yych <= '{') {
- if (yych == 'e') goto yy188;
- if (yych <= 'z') goto yy160;
- goto yy137;
- } else {
- if (yych == '}') goto yy137;
- if (yych <= '~') goto yy162;
- goto yy137;
- }
- }
- }
-yy168:
- YYDEBUG(168, *YYCURSOR);
- ++YYCURSOR;
- YYFILL(1);
- yych = *YYCURSOR;
- if (yych <= '\\') {
- if (yych <= 0x00) goto yy169;
- if (yych <= '[') goto yy136;
- goto yy170;
- } else {
- if (yych != '{') goto yy136;
- }
-yy169:
- YYDEBUG(169, *YYCURSOR);
- YYCURSOR = YYMARKER;
- if (yyaccept <= 2) {
- if (yyaccept <= 1) {
- if (yyaccept == 0) {
- goto yy138;
- } else {
- goto yy155;
- }
- } else {
- goto yy162;
- }
- } else {
- if (yyaccept <= 4) {
- if (yyaccept == 3) {
- goto yy182;
- } else {
- goto yy186;
- }
- } else {
- goto yy203;
- }
- }
-yy170:
- YYDEBUG(170, *YYCURSOR);
- ++YYCURSOR;
- YYFILL(1);
- yych = *YYCURSOR;
- if (yybm[0+yych] & 128) {
- goto yy189;
- }
- goto yy136;
-yy171:
- YYDEBUG(171, *YYCURSOR);
- ++YYCURSOR;
- YYDEBUG(172, *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 2566 "Zend/zend_ini_scanner.c"
-yy173:
- YYDEBUG(173, *YYCURSOR);
- ++YYCURSOR;
- YYFILL(1);
- yych = *YYCURSOR;
- YYDEBUG(174, *YYCURSOR);
- if (yybm[0+yych] & 64) {
- goto yy173;
- }
- goto yy191;
-yy175:
- YYDEBUG(175, *YYCURSOR);
- yyaccept = 1;
- YYMARKER = ++YYCURSOR;
- YYFILL(1);
- yych = *YYCURSOR;
- YYDEBUG(176, *YYCURSOR);
- if (yych <= '/') {
- if (yych <= 0x1F) {
- if (yych <= '\n') {
- if (yych <= 0x00) goto yy155;
- if (yych <= 0x08) goto yy136;
- goto yy155;
- } else {
- if (yych == '\r') goto yy155;
- goto yy136;
- }
- } else {
- if (yych <= '$') {
- if (yych <= '"') goto yy155;
- if (yych <= '#') goto yy136;
- goto yy168;
- } else {
- if (yych <= '%') goto yy136;
- if (yych <= ')') goto yy155;
- goto yy136;
- }
- }
- } else {
- if (yych <= ']') {
- if (yych <= ';') {
- if (yych <= '9') goto yy175;
- if (yych <= ':') goto yy136;
- goto yy155;
- } else {
- if (yych == '=') goto yy155;
- goto yy136;
- }
- } else {
- if (yych <= '|') {
- if (yych <= '^') goto yy155;
- if (yych <= '{') goto yy136;
- goto yy155;
- } else {
- if (yych == '~') goto yy155;
- goto yy136;
- }
- }
- }
-yy177:
- YYDEBUG(177, *YYCURSOR);
- ++YYCURSOR;
-yy178:
- YYDEBUG(178, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 645 "Zend/zend_ini_scanner.l"
- { /* Comment */
- BEGIN(INITIAL);
- SCNG(lineno)++;
- return END_OF_LINE;
-}
-#line 2638 "Zend/zend_ini_scanner.c"
-yy179:
- YYDEBUG(179, *YYCURSOR);
- yych = *++YYCURSOR;
- 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 yy162;
- if (yych <= 0x08) goto yy137;
- goto yy162;
- } else {
- if (yych == '\r') goto yy162;
- if (yych <= 0x1F) goto yy137;
- goto yy162;
- }
- } else {
- if (yych <= '9') {
- if (yych <= '%') goto yy137;
- if (yych <= ')') goto yy162;
- if (yych <= '/') goto yy137;
- goto yy160;
- } else {
- if (yych == ';') goto yy162;
- if (yych <= '<') goto yy137;
- goto yy162;
- }
- }
- } else {
- if (yych <= '`') {
- if (yych <= 'Z') {
- if (yych <= '@') goto yy137;
- if (yych == 'L') goto yy193;
- goto yy160;
- } else {
- if (yych <= ']') goto yy137;
- if (yych <= '^') goto yy162;
- if (yych <= '_') goto yy160;
- goto yy137;
- }
- } else {
- if (yych <= '{') {
- if (yych == 'l') goto yy193;
- if (yych <= 'z') goto yy160;
- goto yy137;
- } else {
- if (yych == '}') goto yy137;
- if (yych <= '~') goto yy162;
- goto yy137;
- }
- }
- }
-yy181:
- YYDEBUG(181, *YYCURSOR);
- yyaccept = 3;
- yych = *(YYMARKER = ++YYCURSOR);
- if (yych <= '<') {
- if (yych <= ' ') {
- if (yych <= '\n') {
- if (yych <= 0x00) goto yy182;
- if (yych <= 0x08) goto yy137;
- if (yych <= '\t') goto yy194;
- } else {
- if (yych == '\r') goto yy182;
- if (yych <= 0x1F) goto yy137;
- goto yy194;
- }
- } else {
- if (yych <= '/') {
- if (yych <= '"') goto yy182;
- if (yych <= '%') goto yy137;
- if (yych >= '*') goto yy137;
- } else {
- if (yych <= '9') goto yy160;
- if (yych != ';') goto yy137;
- }
- }
- } else {
- if (yych <= '_') {
- if (yych <= 'N') {
- if (yych <= '=') goto yy182;
- if (yych <= '@') goto yy137;
- if (yych <= 'M') goto yy160;
- goto yy196;
- } else {
- if (yych <= 'Z') goto yy160;
- if (yych <= ']') goto yy137;
- if (yych >= '_') goto yy160;
- }
- } else {
- if (yych <= 'z') {
- if (yych <= '`') goto yy137;
- if (yych == 'n') goto yy196;
- goto yy160;
- } else {
- if (yych <= '|') {
- if (yych <= '{') goto yy137;
- } else {
- if (yych != '~') goto yy137;
- }
- }
- }
- }
-yy182:
- YYDEBUG(182, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#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 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 yy162;
- if (yych <= 0x08) goto yy137;
- goto yy162;
- } else {
- if (yych == '\r') goto yy162;
- if (yych <= 0x1F) goto yy137;
- goto yy162;
- }
- } else {
- if (yych <= '9') {
- if (yych <= '%') goto yy137;
- if (yych <= ')') goto yy162;
- if (yych <= '/') goto yy137;
- goto yy160;
- } else {
- if (yych == ';') goto yy162;
- if (yych <= '<') goto yy137;
- goto yy162;
- }
- }
- } else {
- if (yych <= '`') {
- if (yych <= 'Z') {
- if (yych <= '@') goto yy137;
- if (yych == 'L') goto yy197;
- goto yy160;
- } else {
- if (yych <= ']') goto yy137;
- if (yych <= '^') goto yy162;
- if (yych <= '_') goto yy160;
- goto yy137;
- }
- } else {
- if (yych <= '{') {
- if (yych == 'l') goto yy197;
- if (yych <= 'z') goto yy160;
- goto yy137;
- } else {
- if (yych == '}') goto yy137;
- if (yych <= '~') goto yy162;
- goto yy137;
- }
- }
- }
-yy184:
- YYDEBUG(184, *YYCURSOR);
- yyaccept = 2;
- yych = *(YYMARKER = ++YYCURSOR);
- if (yych <= '=') {
- if (yych <= '"') {
- if (yych <= '\n') {
- if (yych <= 0x00) goto yy162;
- if (yych <= 0x08) goto yy137;
- goto yy162;
- } else {
- if (yych == '\r') goto yy162;
- if (yych <= 0x1F) goto yy137;
- goto yy162;
- }
- } else {
- if (yych <= '9') {
- if (yych <= '%') goto yy137;
- if (yych <= ')') goto yy162;
- if (yych <= '/') goto yy137;
- goto yy160;
- } else {
- if (yych == ';') goto yy162;
- if (yych <= '<') goto yy137;
- goto yy162;
- }
- }
- } else {
- if (yych <= '`') {
- if (yych <= 'Z') {
- if (yych <= '@') goto yy137;
- if (yych == 'F') goto yy198;
- goto yy160;
- } else {
- if (yych <= ']') goto yy137;
- if (yych <= '^') goto yy162;
- if (yych <= '_') goto yy160;
- goto yy137;
- }
- } else {
- if (yych <= '{') {
- if (yych == 'f') goto yy198;
- if (yych <= 'z') goto yy160;
- goto yy137;
- } else {
- if (yych == '}') goto yy137;
- if (yych <= '~') goto yy162;
- goto yy137;
- }
- }
- }
-yy185:
- YYDEBUG(185, *YYCURSOR);
- yyaccept = 4;
- yych = *(YYMARKER = ++YYCURSOR);
- if (yybm[0+yych] & 32) {
- goto yy160;
- }
- if (yych <= ')') {
- if (yych <= '\f') {
- if (yych <= 0x08) {
- if (yych >= 0x01) goto yy137;
- } else {
- if (yych <= '\t') goto yy199;
- if (yych >= '\v') goto yy137;
- }
- } else {
- if (yych <= ' ') {
- if (yych <= '\r') goto yy186;
- if (yych <= 0x1F) goto yy137;
- goto yy199;
- } else {
- if (yych <= '"') goto yy186;
- if (yych <= '%') goto yy137;
- }
- }
- } else {
- if (yych <= ']') {
- if (yych <= ';') {
- if (yych <= ':') goto yy137;
- } else {
- if (yych != '=') goto yy137;
- }
- } else {
- if (yych <= '|') {
- if (yych <= '^') goto yy186;
- if (yych <= '{') goto yy137;
- } else {
- if (yych != '~') goto yy137;
- }
- }
- }
-yy186:
- YYDEBUG(186, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#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 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 yy162;
- if (yych <= 0x08) goto yy137;
- goto yy162;
- } else {
- if (yych == '\r') goto yy162;
- if (yych <= 0x1F) goto yy137;
- goto yy162;
- }
- } else {
- if (yych <= '9') {
- if (yych <= '%') goto yy137;
- if (yych <= ')') goto yy162;
- if (yych <= '/') goto yy137;
- goto yy160;
- } else {
- if (yych == ';') goto yy162;
- if (yych <= '<') goto yy137;
- goto yy162;
- }
- }
- } else {
- if (yych <= '`') {
- if (yych <= 'Z') {
- if (yych <= '@') goto yy137;
- if (yych == 'U') goto yy201;
- goto yy160;
- } else {
- if (yych <= ']') goto yy137;
- if (yych <= '^') goto yy162;
- if (yych <= '_') goto yy160;
- goto yy137;
- }
- } else {
- if (yych <= '{') {
- if (yych == 'u') goto yy201;
- if (yych <= 'z') goto yy160;
- goto yy137;
- } else {
- if (yych == '}') goto yy137;
- if (yych <= '~') goto yy162;
- goto yy137;
- }
- }
- }
-yy188:
- YYDEBUG(188, *YYCURSOR);
- yyaccept = 2;
- yych = *(YYMARKER = ++YYCURSOR);
- if (yych <= '=') {
- if (yych <= '"') {
- if (yych <= '\n') {
- if (yych <= 0x00) goto yy162;
- if (yych <= 0x08) goto yy137;
- goto yy162;
- } else {
- if (yych == '\r') goto yy162;
- if (yych <= 0x1F) goto yy137;
- goto yy162;
- }
- } else {
- if (yych <= '9') {
- if (yych <= '%') goto yy137;
- if (yych <= ')') goto yy162;
- if (yych <= '/') goto yy137;
- goto yy160;
- } else {
- if (yych == ';') goto yy162;
- if (yych <= '<') goto yy137;
- goto yy162;
- }
- }
- } else {
- if (yych <= '`') {
- if (yych <= 'Z') {
- if (yych <= '@') goto yy137;
- if (yych == 'S') goto yy185;
- goto yy160;
- } else {
- if (yych <= ']') goto yy137;
- if (yych <= '^') goto yy162;
- if (yych <= '_') goto yy160;
- goto yy137;
- }
- } else {
- if (yych <= '{') {
- if (yych == 's') goto yy185;
- if (yych <= 'z') goto yy160;
- goto yy137;
- } else {
- if (yych == '}') goto yy137;
- if (yych <= '~') goto yy162;
- goto yy137;
- }
- }
- }
-yy189:
- YYDEBUG(189, *YYCURSOR);
- ++YYCURSOR;
- YYFILL(1);
- yych = *YYCURSOR;
- YYDEBUG(190, *YYCURSOR);
- if (yybm[0+yych] & 128) {
- goto yy189;
- }
- if (yych <= 0x00) goto yy138;
- if (yych == '\\') goto yy170;
- goto yy136;
-yy191:
- YYDEBUG(191, *YYCURSOR);
- ++YYCURSOR;
- YYDEBUG(192, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 417 "Zend/zend_ini_scanner.l"
- { /* Raw string */
- /* Eat leading and trailing single quotes */
- if (yytext[0] == '\'' && yytext[yyleng - 1] == '\'') {
- SCNG(yy_text)++;
- yyleng = yyleng - 2;
- }
- RETURN_TOKEN(TC_RAW, yytext, yyleng);
-}
-#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 yy162;
- if (yych <= 0x08) goto yy137;
- goto yy162;
- } else {
- if (yych == '\r') goto yy162;
- if (yych <= 0x1F) goto yy137;
- goto yy162;
- }
- } else {
- if (yych <= '9') {
- if (yych <= '%') goto yy137;
- if (yych <= ')') goto yy162;
- if (yych <= '/') goto yy137;
- goto yy160;
- } else {
- if (yych == ';') goto yy162;
- if (yych <= '<') goto yy137;
- goto yy162;
- }
- }
- } else {
- if (yych <= '`') {
- if (yych <= 'Z') {
- if (yych <= '@') goto yy137;
- if (yych == 'S') goto yy196;
- goto yy160;
- } else {
- if (yych <= ']') goto yy137;
- if (yych <= '^') goto yy162;
- if (yych <= '_') goto yy160;
- goto yy137;
- }
- } else {
- if (yych <= '{') {
- if (yych == 's') goto yy196;
- if (yych <= 'z') goto yy160;
- goto yy137;
- } else {
- if (yych == '}') goto yy137;
- if (yych <= '~') goto yy162;
- goto yy137;
- }
- }
- }
-yy194:
- YYDEBUG(194, *YYCURSOR);
- ++YYCURSOR;
- YYFILL(1);
- yych = *YYCURSOR;
- 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 yy162;
- if (yych <= 0x08) goto yy137;
- goto yy162;
- } else {
- if (yych == '\r') goto yy162;
- if (yych <= 0x1F) goto yy137;
- goto yy162;
- }
- } else {
- if (yych <= '9') {
- if (yych <= '%') goto yy137;
- if (yych <= ')') goto yy162;
- if (yych <= '/') goto yy137;
- goto yy160;
- } else {
- if (yych == ';') goto yy162;
- if (yych <= '<') goto yy137;
- goto yy162;
- }
- }
- } else {
- if (yych <= '`') {
- if (yych <= 'Z') {
- if (yych <= '@') goto yy137;
- if (yych == 'E') goto yy198;
- goto yy160;
- } else {
- if (yych <= ']') goto yy137;
- if (yych <= '^') goto yy162;
- if (yych <= '_') goto yy160;
- goto yy137;
- }
- } else {
- if (yych <= '{') {
- if (yych == 'e') goto yy198;
- if (yych <= 'z') goto yy160;
- goto yy137;
- } else {
- if (yych == '}') goto yy137;
- if (yych <= '~') goto yy162;
- goto yy137;
- }
- }
- }
-yy197:
- YYDEBUG(197, *YYCURSOR);
- yyaccept = 2;
- yych = *(YYMARKER = ++YYCURSOR);
- if (yych <= '=') {
- if (yych <= '"') {
- if (yych <= '\n') {
- if (yych <= 0x00) goto yy162;
- if (yych <= 0x08) goto yy137;
- goto yy162;
- } else {
- if (yych == '\r') goto yy162;
- if (yych <= 0x1F) goto yy137;
- goto yy162;
- }
- } else {
- if (yych <= '9') {
- if (yych <= '%') goto yy137;
- if (yych <= ')') goto yy162;
- if (yych <= '/') goto yy137;
- goto yy160;
- } else {
- if (yych == ';') goto yy162;
- if (yych <= '<') goto yy137;
- goto yy162;
- }
- }
- } else {
- if (yych <= '`') {
- if (yych <= 'Z') {
- if (yych <= '@') goto yy137;
- if (yych == 'L') goto yy202;
- goto yy160;
- } else {
- if (yych <= ']') goto yy137;
- if (yych <= '^') goto yy162;
- if (yych <= '_') goto yy160;
- goto yy137;
- }
- } else {
- if (yych <= '{') {
- if (yych == 'l') goto yy202;
- if (yych <= 'z') goto yy160;
- goto yy137;
- } else {
- if (yych == '}') goto yy137;
- if (yych <= '~') goto yy162;
- goto yy137;
- }
- }
- }
-yy198:
- YYDEBUG(198, *YYCURSOR);
- yyaccept = 3;
- yych = *(YYMARKER = ++YYCURSOR);
- if (yybm[0+yych] & 32) {
- goto yy160;
- }
- if (yych <= ')') {
- if (yych <= '\f') {
- if (yych <= 0x08) {
- if (yych <= 0x00) goto yy182;
- goto yy137;
- } else {
- if (yych <= '\t') goto yy194;
- if (yych <= '\n') goto yy182;
- goto yy137;
- }
- } else {
- if (yych <= ' ') {
- if (yych <= '\r') goto yy182;
- if (yych <= 0x1F) goto yy137;
- goto yy194;
- } else {
- if (yych <= '"') goto yy182;
- if (yych <= '%') goto yy137;
- goto yy182;
- }
- }
- } else {
- if (yych <= ']') {
- if (yych <= ';') {
- if (yych <= ':') goto yy137;
- goto yy182;
- } else {
- if (yych == '=') goto yy182;
- goto yy137;
- }
- } else {
- if (yych <= '|') {
- if (yych <= '^') goto yy182;
- if (yych <= '{') goto yy137;
- goto yy182;
- } else {
- if (yych == '~') goto yy182;
- goto yy137;
- }
- }
- }
-yy199:
- YYDEBUG(199, *YYCURSOR);
- ++YYCURSOR;
- YYFILL(1);
- yych = *YYCURSOR;
- 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 yy162;
- if (yych <= 0x08) goto yy137;
- goto yy162;
- } else {
- if (yych == '\r') goto yy162;
- if (yych <= 0x1F) goto yy137;
- goto yy162;
- }
- } else {
- if (yych <= '9') {
- if (yych <= '%') goto yy137;
- if (yych <= ')') goto yy162;
- if (yych <= '/') goto yy137;
- goto yy160;
- } else {
- if (yych == ';') goto yy162;
- if (yych <= '<') goto yy137;
- goto yy162;
- }
- }
- } else {
- if (yych <= '`') {
- if (yych <= 'Z') {
- if (yych <= '@') goto yy137;
- if (yych == 'E') goto yy185;
- goto yy160;
- } else {
- if (yych <= ']') goto yy137;
- if (yych <= '^') goto yy162;
- if (yych <= '_') goto yy160;
- goto yy137;
- }
- } else {
- if (yych <= '{') {
- if (yych == 'e') goto yy185;
- if (yych <= 'z') goto yy160;
- goto yy137;
- } else {
- if (yych == '}') goto yy137;
- if (yych <= '~') goto yy162;
- goto yy137;
- }
- }
- }
-yy202:
- YYDEBUG(202, *YYCURSOR);
- yyaccept = 5;
- yych = *(YYMARKER = ++YYCURSOR);
- if (yybm[0+yych] & 32) {
- goto yy160;
- }
- if (yych <= ')') {
- if (yych <= '\f') {
- if (yych <= 0x08) {
- if (yych >= 0x01) goto yy137;
- } else {
- if (yych <= '\t') goto yy204;
- if (yych >= '\v') goto yy137;
- }
- } else {
- if (yych <= ' ') {
- if (yych <= '\r') goto yy203;
- if (yych <= 0x1F) goto yy137;
- goto yy204;
- } else {
- if (yych <= '"') goto yy203;
- if (yych <= '%') goto yy137;
- }
- }
- } else {
- if (yych <= ']') {
- if (yych <= ';') {
- if (yych <= ':') goto yy137;
- } else {
- if (yych != '=') goto yy137;
- }
- } else {
- if (yych <= '|') {
- if (yych <= '^') goto yy203;
- if (yych <= '{') goto yy137;
- } else {
- if (yych != '~') goto yy137;
- }
- }
- }
-yy203:
- YYDEBUG(203, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 478 "Zend/zend_ini_scanner.l"
- {
- RETURN_TOKEN(NULL_NULL, "", 0);
-}
-#line 3352 "Zend/zend_ini_scanner.c"
-yy204:
- YYDEBUG(204, *YYCURSOR);
- ++YYCURSOR;
- YYFILL(1);
- yych = *YYCURSOR;
- 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:
- {
- static const unsigned char yybm[] = {
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 0, 0, 128, 128, 0, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 0, 0, 128, 0, 128, 0, 128,
- 0, 0, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 0, 128, 0, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 0, 128, 128, 0, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 0, 0, 0, 0, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 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(228, *YYCURSOR);
- YYFILL(1);
- yych = *YYCURSOR;
- if (yybm[0+yych] & 128) {
- goto yy230;
- }
- if (yych == '}') goto yy235;
- goto yy233;
-yy230:
- YYDEBUG(230, *YYCURSOR);
- ++YYCURSOR;
- YYFILL(1);
- yych = *YYCURSOR;
- YYDEBUG(231, *YYCURSOR);
- if (yybm[0+yych] & 128) {
- goto yy230;
- }
- YYDEBUG(232, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 455 "Zend/zend_ini_scanner.l"
- { /* Variable name */
- /* Eat leading whitespace */
- EAT_LEADING_WHITESPACE();
-
- /* Eat trailing whitespace */
- EAT_TRAILING_WHITESPACE();
-
- RETURN_TOKEN(TC_VARNAME, yytext, yyleng);
-}
-#line 3648 "Zend/zend_ini_scanner.c"
-yy233:
- YYDEBUG(233, *YYCURSOR);
- ++YYCURSOR;
- YYDEBUG(234, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 656 "Zend/zend_ini_scanner.l"
- {
- return 0;
-}
-#line 3658 "Zend/zend_ini_scanner.c"
-yy235:
- YYDEBUG(235, *YYCURSOR);
- ++YYCURSOR;
- YYDEBUG(236, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 465 "Zend/zend_ini_scanner.l"
- { /* Variable end */
- yy_pop_state();
- return '}';
-}
-#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 660 "Zend/zend_ini_scanner.l"
-
-}
diff --git a/Zend/zend_ini_scanner.h b/Zend/zend_ini_scanner.h
index 8d6e00d055..ddb9247d37 100644
--- a/Zend/zend_ini_scanner.h
+++ b/Zend/zend_ini_scanner.h
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| Zend Engine |
+----------------------------------------------------------------------+
- | Copyright (c) 1998-2018 Zend Technologies Ltd. (http://www.zend.com) |
+ | Copyright (c) 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 |
@@ -35,13 +35,3 @@ void shutdown_ini_scanner(void);
END_EXTERN_C()
#endif /* _ZEND_INI_SCANNER_H */
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * indent-tabs-mode: t
- * End:
- * vim600: sw=4 ts=4 fdm=marker
- * vim<600: sw=4 ts=4
- */
diff --git a/Zend/zend_ini_scanner.l b/Zend/zend_ini_scanner.l
index ed4b85ad68..1f4bc34742 100644
--- a/Zend/zend_ini_scanner.l
+++ b/Zend/zend_ini_scanner.l
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| Zend Engine |
+----------------------------------------------------------------------+
- | Copyright (c) 1998-2018 Zend Technologies Ltd. (http://www.zend.com) |
+ | Copyright (c) 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 |
@@ -104,6 +104,7 @@
#define SCNG INI_SCNG
#ifdef ZTS
ZEND_API ts_rsrc_id ini_scanner_globals_id;
+ZEND_API size_t ini_scanner_globals_offset;
#else
ZEND_API zend_ini_scanner_globals ini_scanner_globals;
#endif
diff --git a/Zend/zend_ini_scanner_defs.h b/Zend/zend_ini_scanner_defs.h
deleted file mode 100644
index e446d7aeea..0000000000
--- a/Zend/zend_ini_scanner_defs.h
+++ /dev/null
@@ -1,13 +0,0 @@
-/* Generated by re2c 1.0.3 */
-#line 3 "Zend/zend_ini_scanner_defs.h"
-
-enum YYCONDTYPE {
- yycINITIAL,
- yycST_OFFSET,
- yycST_SECTION_VALUE,
- yycST_VALUE,
- yycST_SECTION_RAW,
- yycST_DOUBLE_QUOTES,
- yycST_VARNAME,
- yycST_RAW,
-};
diff --git a/Zend/zend_interfaces.c b/Zend/zend_interfaces.c
index addc9e560f..ff6784be31 100644
--- a/Zend/zend_interfaces.c
+++ b/Zend/zend_interfaces.c
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| Zend Engine |
+----------------------------------------------------------------------+
- | Copyright (c) 1998-2018 Zend Technologies Ltd. (http://www.zend.com) |
+ | Copyright (c) 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 |
@@ -249,7 +249,8 @@ 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);
+ Z_ADDREF_P(object);
+ ZVAL_OBJ(&iterator->it.data, Z_OBJ_P(object));
iterator->it.funcs = &zend_interface_iterator_funcs_iterator;
iterator->ce = Z_OBJCE_P(object);
ZVAL_UNDEF(&iterator->value);
@@ -290,9 +291,12 @@ static int zend_implement_traversable(zend_class_entry *interface, zend_class_en
if (class_type->get_iterator || (class_type->parent && class_type->parent->get_iterator)) {
return SUCCESS;
}
- for (i = 0; i < class_type->num_interfaces; i++) {
- if (class_type->interfaces[i] == zend_ce_aggregate || class_type->interfaces[i] == zend_ce_iterator) {
- return SUCCESS;
+ if (class_type->num_interfaces) {
+ ZEND_ASSERT(class_type->ce_flags & ZEND_ACC_RESOLVED_INTERFACES);
+ for (i = 0; i < class_type->num_interfaces; i++) {
+ if (class_type->interfaces[i] == zend_ce_aggregate || class_type->interfaces[i] == zend_ce_iterator) {
+ return SUCCESS;
+ }
}
}
zend_error_noreturn(E_CORE_ERROR, "Class %s must implement interface %s as part of either %s or %s",
@@ -309,14 +313,16 @@ static int zend_implement_aggregate(zend_class_entry *interface, zend_class_entr
{
uint32_t i;
int t = -1;
+ zend_class_iterator_funcs *funcs_ptr;
if (class_type->get_iterator) {
if (class_type->type == ZEND_INTERNAL_CLASS) {
/* inheritance ensures the class has necessary userland methods */
return SUCCESS;
} else if (class_type->get_iterator != zend_user_it_get_new_iterator) {
- /* c-level get_iterator cannot be changed (exception being only Traversable is implmented) */
+ /* c-level get_iterator cannot be changed (exception being only Traversable is implemented) */
if (class_type->num_interfaces) {
+ ZEND_ASSERT(class_type->ce_flags & ZEND_ACC_RESOLVED_INTERFACES);
for (i = 0; i < class_type->num_interfaces; i++) {
if (class_type->interfaces[i] == zend_ce_iterator) {
zend_error_noreturn(E_ERROR, "Class %s cannot implement both %s and %s at the same time",
@@ -335,17 +341,28 @@ static int zend_implement_aggregate(zend_class_entry *interface, zend_class_entr
}
}
}
- 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));
+ if (class_type->parent
+ && (class_type->parent->ce_flags & ZEND_ACC_REUSE_GET_ITERATOR)) {
+ class_type->get_iterator = class_type->parent->get_iterator;
+ class_type->ce_flags |= ZEND_ACC_REUSE_GET_ITERATOR;
} 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));
+ class_type->get_iterator = zend_user_it_get_new_iterator;
}
+ funcs_ptr = class_type->iterator_funcs_ptr;
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);
+ if (!funcs_ptr) {
+ funcs_ptr = calloc(1, sizeof(zend_class_iterator_funcs));
+ class_type->iterator_funcs_ptr = funcs_ptr;
+ }
+ funcs_ptr->zf_new_iterator = zend_hash_str_find_ptr(&class_type->function_table, "getiterator", sizeof("getiterator") - 1);
+ } else {
+ if (!funcs_ptr) {
+ funcs_ptr = zend_arena_alloc(&CG(arena), sizeof(zend_class_iterator_funcs));
+ class_type->iterator_funcs_ptr = funcs_ptr;
+ memset(funcs_ptr, 0, sizeof(zend_class_iterator_funcs));
+ } else {
+ funcs_ptr->zf_new_iterator = NULL;
+ }
}
return SUCCESS;
}
@@ -354,6 +371,8 @@ static int zend_implement_aggregate(zend_class_entry *interface, zend_class_entr
/* {{{ zend_implement_iterator */
static int zend_implement_iterator(zend_class_entry *interface, zend_class_entry *class_type)
{
+ zend_class_iterator_funcs *funcs_ptr;
+
if (class_type->get_iterator && class_type->get_iterator != zend_user_it_get_iterator) {
if (class_type->type == ZEND_INTERNAL_CLASS) {
/* inheritance ensures the class has the necessary userland methods */
@@ -369,25 +388,37 @@ static int zend_implement_iterator(zend_class_entry *interface, zend_class_entry
return FAILURE;
}
}
- class_type->get_iterator = zend_user_it_get_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));
+ if (class_type->parent
+ && (class_type->parent->ce_flags & ZEND_ACC_REUSE_GET_ITERATOR)) {
+ class_type->get_iterator = class_type->parent->get_iterator;
+ class_type->ce_flags |= ZEND_ACC_REUSE_GET_ITERATOR;
} 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));
+ class_type->get_iterator = zend_user_it_get_iterator;
}
+ funcs_ptr = class_type->iterator_funcs_ptr;
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);
+ if (!funcs_ptr) {
+ funcs_ptr = calloc(1, sizeof(zend_class_iterator_funcs));
+ class_type->iterator_funcs_ptr = funcs_ptr;
+ } else {
+ funcs_ptr->zf_rewind = zend_hash_str_find_ptr(&class_type->function_table, "rewind", sizeof("rewind") - 1);
+ funcs_ptr->zf_valid = zend_hash_str_find_ptr(&class_type->function_table, "valid", sizeof("valid") - 1);
+ funcs_ptr->zf_key = zend_hash_str_find_ptr(&class_type->function_table, "key", sizeof("key") - 1);
+ funcs_ptr->zf_current = zend_hash_str_find_ptr(&class_type->function_table, "current", sizeof("current") - 1);
+ funcs_ptr->zf_next = zend_hash_str_find_ptr(&class_type->function_table, "next", sizeof("next") - 1);
+ }
+ } else {
+ if (!funcs_ptr) {
+ funcs_ptr = zend_arena_alloc(&CG(arena), sizeof(zend_class_iterator_funcs));
+ class_type->iterator_funcs_ptr = funcs_ptr;
+ memset(funcs_ptr, 0, sizeof(zend_class_iterator_funcs));
+ } else {
+ funcs_ptr->zf_valid = NULL;
+ funcs_ptr->zf_current = NULL;
+ funcs_ptr->zf_key = NULL;
+ funcs_ptr->zf_next = NULL;
+ funcs_ptr->zf_rewind = NULL;
+ }
}
return SUCCESS;
}
@@ -544,7 +575,7 @@ ZEND_END_ARG_INFO()
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_FENTRY(unserialize, NULL, arginfo_serializable_serialize, ZEND_ACC_PUBLIC|ZEND_ACC_ABSTRACT)
ZEND_FE_END
};
@@ -575,13 +606,3 @@ ZEND_API void zend_register_interfaces(void)
REGISTER_MAGIC_INTERFACE(countable, Countable);
}
/* }}} */
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * indent-tabs-mode: t
- * End:
- * vim600: sw=4 ts=4 fdm=marker
- * vim<600: sw=4 ts=4
- */
diff --git a/Zend/zend_interfaces.h b/Zend/zend_interfaces.h
index 52a8396dd0..44770a1813 100644
--- a/Zend/zend_interfaces.h
+++ b/Zend/zend_interfaces.h
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| Zend Engine |
+----------------------------------------------------------------------+
- | Copyright (c) 1998-2018 Zend Technologies Ltd. (http://www.zend.com) |
+ | Copyright (c) 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 |
@@ -80,13 +80,3 @@ ZEND_API int zend_class_unserialize_deny(zval *object, zend_class_entry *ce, con
END_EXTERN_C()
#endif /* ZEND_INTERFACES_H */
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * indent-tabs-mode: t
- * End:
- * vim600: sw=4 ts=4 fdm=marker
- * vim<600: sw=4 ts=4
- */
diff --git a/Zend/zend_istdiostream.h b/Zend/zend_istdiostream.h
index e814539e67..74470d2ae5 100644
--- a/Zend/zend_istdiostream.h
+++ b/Zend/zend_istdiostream.h
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| Zend Engine |
+----------------------------------------------------------------------+
- | Copyright (c) 1998-2018 Zend Technologies Ltd. (http://www.zend.com) |
+ | Copyright (c) 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 |
@@ -32,13 +32,3 @@ public:
#endif
#endif
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * indent-tabs-mode: t
- * End:
- * vim600: sw=4 ts=4 fdm=marker
- * vim<600: sw=4 ts=4
- */
diff --git a/Zend/zend_iterators.c b/Zend/zend_iterators.c
index 81606ef6eb..379a316c38 100644
--- a/Zend/zend_iterators.c
+++ b/Zend/zend_iterators.c
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| Zend Engine |
+----------------------------------------------------------------------+
- | Copyright (c) 1998-2018 Zend Technologies Ltd. (http://www.zend.com) |
+ | Copyright (c) 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 |
@@ -24,6 +24,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 HashTable *iter_wrapper_get_gc(zval *object, zval **table, int *n);
static const zend_object_handlers iterator_object_handlers = {
0,
@@ -51,7 +52,7 @@ static const zend_object_handlers iterator_object_handlers = {
NULL, /* count */
NULL, /* get_debug_info */
NULL, /* get_closure */
- NULL, /* get_gc */
+ iter_wrapper_get_gc,
NULL, /* do_operation */
NULL /* compare */
};
@@ -71,6 +72,13 @@ static void iter_wrapper_dtor(zend_object *object)
{
}
+static HashTable *iter_wrapper_get_gc(zval *object, zval **table, int *n) {
+ /* TODO: We need a get_gc iterator handler */
+ *table = NULL;
+ *n = 0;
+ return NULL;
+}
+
ZEND_API void zend_iterator_init(zend_object_iterator *iter)
{
zend_object_std_init(&iter->std, &zend_iterator_class_entry);
@@ -94,13 +102,3 @@ ZEND_API zend_object_iterator* zend_iterator_unwrap(zval *array_ptr)
}
return NULL;
}
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * indent-tabs-mode: t
- * End:
- * vim600: sw=4 ts=4 fdm=marker
- * vim<600: sw=4 ts=4
- */
diff --git a/Zend/zend_iterators.h b/Zend/zend_iterators.h
index 15c828abd1..941b260885 100644
--- a/Zend/zend_iterators.h
+++ b/Zend/zend_iterators.h
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| Zend Engine |
+----------------------------------------------------------------------+
- | Copyright (c) 1998-2018 Zend Technologies Ltd. (http://www.zend.com) |
+ | Copyright (c) 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 |
@@ -60,12 +60,12 @@ struct _zend_object_iterator {
};
typedef struct _zend_class_iterator_funcs {
- union _zend_function *zf_new_iterator;
- union _zend_function *zf_valid;
- union _zend_function *zf_current;
- union _zend_function *zf_key;
- union _zend_function *zf_next;
- union _zend_function *zf_rewind;
+ zend_function *zf_new_iterator;
+ zend_function *zf_valid;
+ zend_function *zf_current;
+ zend_function *zf_key;
+ zend_function *zf_next;
+ zend_function *zf_rewind;
} zend_class_iterator_funcs;
BEGIN_EXTERN_C()
@@ -78,13 +78,3 @@ ZEND_API void zend_iterator_dtor(zend_object_iterator *iter);
ZEND_API void zend_register_iterator_wrapper(void);
END_EXTERN_C()
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * indent-tabs-mode: t
- * End:
- * vim600: sw=4 ts=4 fdm=marker
- * vim<600: sw=4 ts=4
- */
diff --git a/Zend/zend_language_parser.y b/Zend/zend_language_parser.y
index 95823ae750..56a354b9cc 100644
--- a/Zend/zend_language_parser.y
+++ b/Zend/zend_language_parser.y
@@ -1,9 +1,10 @@
+%require "3.0"
%{
/*
+----------------------------------------------------------------------+
| Zend Engine |
+----------------------------------------------------------------------+
- | Copyright (c) 1998-2018 Zend Technologies Ltd. (http://www.zend.com) |
+ | Copyright (c) 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 |
@@ -32,7 +33,6 @@
#define yytnamerr zend_yytnamerr
static YYSIZE_T zend_yytnamerr(char*, const char*);
-#define YYERROR_VERBOSE
#define YYSTYPE zend_parser_stack_elem
#ifdef _MSC_VER
@@ -42,7 +42,8 @@ static YYSIZE_T zend_yytnamerr(char*, const char*);
%}
-%pure-parser
+%define api.pure full
+%define parse.error verbose
%expect 0
%code requires {
@@ -51,16 +52,16 @@ static YYSIZE_T zend_yytnamerr(char*, const char*);
%destructor { zend_ast_destroy($$); } <ast>
%destructor { if ($$) zend_string_release_ex($$, 0); } <str>
-%left T_INCLUDE T_INCLUDE_ONCE T_EVAL T_REQUIRE T_REQUIRE_ONCE
-%left ','
+%precedence PREC_ARROW_FUNCTION
+%precedence T_INCLUDE T_INCLUDE_ONCE T_REQUIRE T_REQUIRE_ONCE
%left T_LOGICAL_OR
%left T_LOGICAL_XOR
%left T_LOGICAL_AND
-%right T_PRINT
-%right T_YIELD
-%right T_DOUBLE_ARROW
-%right T_YIELD_FROM
-%left '=' T_PLUS_EQUAL T_MINUS_EQUAL T_MUL_EQUAL T_DIV_EQUAL T_CONCAT_EQUAL T_MOD_EQUAL T_AND_EQUAL T_OR_EQUAL T_XOR_EQUAL T_SL_EQUAL T_SR_EQUAL T_POW_EQUAL
+%precedence T_PRINT
+%precedence T_YIELD
+%precedence T_DOUBLE_ARROW
+%precedence T_YIELD_FROM
+%precedence '=' T_PLUS_EQUAL T_MINUS_EQUAL T_MUL_EQUAL T_DIV_EQUAL T_CONCAT_EQUAL T_MOD_EQUAL T_AND_EQUAL T_OR_EQUAL T_XOR_EQUAL T_SL_EQUAL T_SR_EQUAL T_POW_EQUAL T_COALESCE_EQUAL
%left '?' ':'
%right T_COALESCE
%left T_BOOLEAN_OR
@@ -73,17 +74,16 @@ static YYSIZE_T zend_yytnamerr(char*, const char*);
%left T_SL T_SR
%left '+' '-' '.'
%left '*' '/' '%'
-%right '!'
-%nonassoc T_INSTANCEOF
-%right '~' T_INC T_DEC T_INT_CAST T_DOUBLE_CAST T_STRING_CAST T_ARRAY_CAST T_OBJECT_CAST T_BOOL_CAST T_UNSET_CAST '@'
+%precedence '!'
+%precedence T_INSTANCEOF
+%precedence '~' T_INT_CAST T_DOUBLE_CAST T_STRING_CAST T_ARRAY_CAST T_OBJECT_CAST T_BOOL_CAST T_UNSET_CAST '@'
%right T_POW
-%right '['
-%nonassoc T_NEW T_CLONE
-%left T_NOELSE
-%left T_ELSEIF
-%left T_ELSE
-%left T_ENDIF
-%right T_STATIC T_ABSTRACT T_FINAL T_PRIVATE T_PROTECTED T_PUBLIC
+%precedence T_NEW T_CLONE
+
+/* Resolve danging else conflict */
+%precedence T_NOELSE
+%precedence T_ELSEIF
+%precedence T_ELSE
%token <ast> T_LNUMBER "integer number (T_LNUMBER)"
%token <ast> T_DNUMBER "floating-point number (T_DNUMBER)"
@@ -118,6 +118,7 @@ static YYSIZE_T zend_yytnamerr(char*, const char*);
%token T_XOR_EQUAL "^= (T_XOR_EQUAL)"
%token T_SL_EQUAL "<<= (T_SL_EQUAL)"
%token T_SR_EQUAL ">>= (T_SR_EQUAL)"
+%token T_COALESCE_EQUAL "??= (T_COALESCE_EQUAL)"
%token T_BOOLEAN_OR "|| (T_BOOLEAN_OR)"
%token T_BOOLEAN_AND "&& (T_BOOLEAN_AND)"
%token T_IS_EQUAL "== (T_IS_EQUAL)"
@@ -165,6 +166,7 @@ static YYSIZE_T zend_yytnamerr(char*, const char*);
%token T_CONTINUE "continue (T_CONTINUE)"
%token T_GOTO "goto (T_GOTO)"
%token T_FUNCTION "function (T_FUNCTION)"
+%token T_FN "fn (T_FN)"
%token T_CONST "const (T_CONST)"
%token T_RETURN "return (T_RETURN)"
%token T_TRY "try (T_TRY)"
@@ -220,6 +222,7 @@ static YYSIZE_T zend_yytnamerr(char*, const char*);
%token T_COALESCE "?? (T_COALESCE)"
%token T_POW "** (T_POW)"
%token T_POW_EQUAL "**= (T_POW_EQUAL)"
+%token T_BAD_CHARACTER "invalid character (T_BAD_CHARACTER)"
/* Token used to force a parse error from the lexer */
%token T_ERROR
@@ -252,11 +255,13 @@ static YYSIZE_T zend_yytnamerr(char*, const char*);
%type <ast> array_pair non_empty_array_pair_list array_pair_list possible_array_pair
%type <ast> isset_variable type return_type type_expr
%type <ast> identifier
+%type <ast> inline_function
-%type <num> returns_ref function is_reference is_variadic variable_modifiers
+%type <num> returns_ref function fn is_reference is_variadic variable_modifiers
%type <num> method_modifiers non_empty_member_modifiers member_modifier
%type <num> class_modifiers class_modifier use_type backup_fn_flags
+%type <ptr> backup_lex_pos
%type <str> backup_doc_comment
%% /* Rules */
@@ -272,7 +277,7 @@ reserved_non_modifiers:
| T_THROW | T_USE | T_INSTEADOF | T_GLOBAL | T_VAR | T_UNSET | T_ISSET | T_EMPTY | T_CONTINUE | T_GOTO
| T_FUNCTION | T_CONST | T_RETURN | T_PRINT | T_YIELD | T_LIST | T_SWITCH | T_ENDSWITCH | T_CASE | T_DEFAULT | T_BREAK
| T_ARRAY | T_CALLABLE | T_EXTENDS | T_IMPLEMENTS | T_NAMESPACE | T_TRAIT | T_INTERFACE | T_CLASS
- | T_CLASS_C | T_TRAIT_C | T_FUNC_C | T_METHOD_C | T_LINE | T_FILE | T_DIR | T_NS_C
+ | T_CLASS_C | T_TRAIT_C | T_FUNC_C | T_METHOD_C | T_LINE | T_FILE | T_DIR | T_NS_C | T_FN
;
semi_reserved:
@@ -716,8 +721,9 @@ class_statement_list:
class_statement:
- variable_modifiers property_list ';'
- { $$ = $2; $$->attr = $1; }
+ variable_modifiers optional_type property_list ';'
+ { $$ = zend_ast_create(ZEND_AST_PROP_GROUP, $2, $3);
+ $$->attr = $1; }
| method_modifiers T_CONST class_const_list ';'
{ $$ = $3; $$->attr = $1; }
| T_USE name_list trait_adaptations
@@ -882,29 +888,31 @@ expr:
{ $$ = zend_ast_create(ZEND_AST_ASSIGN_REF, $1, $4); }
| T_CLONE expr { $$ = zend_ast_create(ZEND_AST_CLONE, $2); }
| variable T_PLUS_EQUAL expr
- { $$ = zend_ast_create_assign_op(ZEND_ASSIGN_ADD, $1, $3); }
+ { $$ = zend_ast_create_assign_op(ZEND_ADD, $1, $3); }
| variable T_MINUS_EQUAL expr
- { $$ = zend_ast_create_assign_op(ZEND_ASSIGN_SUB, $1, $3); }
+ { $$ = zend_ast_create_assign_op(ZEND_SUB, $1, $3); }
| variable T_MUL_EQUAL expr
- { $$ = zend_ast_create_assign_op(ZEND_ASSIGN_MUL, $1, $3); }
+ { $$ = zend_ast_create_assign_op(ZEND_MUL, $1, $3); }
| variable T_POW_EQUAL expr
- { $$ = zend_ast_create_assign_op(ZEND_ASSIGN_POW, $1, $3); }
+ { $$ = zend_ast_create_assign_op(ZEND_POW, $1, $3); }
| variable T_DIV_EQUAL expr
- { $$ = zend_ast_create_assign_op(ZEND_ASSIGN_DIV, $1, $3); }
+ { $$ = zend_ast_create_assign_op(ZEND_DIV, $1, $3); }
| variable T_CONCAT_EQUAL expr
- { $$ = zend_ast_create_assign_op(ZEND_ASSIGN_CONCAT, $1, $3); }
+ { $$ = zend_ast_create_assign_op(ZEND_CONCAT, $1, $3); }
| variable T_MOD_EQUAL expr
- { $$ = zend_ast_create_assign_op(ZEND_ASSIGN_MOD, $1, $3); }
+ { $$ = zend_ast_create_assign_op(ZEND_MOD, $1, $3); }
| variable T_AND_EQUAL expr
- { $$ = zend_ast_create_assign_op(ZEND_ASSIGN_BW_AND, $1, $3); }
+ { $$ = zend_ast_create_assign_op(ZEND_BW_AND, $1, $3); }
| variable T_OR_EQUAL expr
- { $$ = zend_ast_create_assign_op(ZEND_ASSIGN_BW_OR, $1, $3); }
+ { $$ = zend_ast_create_assign_op(ZEND_BW_OR, $1, $3); }
| variable T_XOR_EQUAL expr
- { $$ = zend_ast_create_assign_op(ZEND_ASSIGN_BW_XOR, $1, $3); }
+ { $$ = zend_ast_create_assign_op(ZEND_BW_XOR, $1, $3); }
| variable T_SL_EQUAL expr
- { $$ = zend_ast_create_assign_op(ZEND_ASSIGN_SL, $1, $3); }
+ { $$ = zend_ast_create_assign_op(ZEND_SL, $1, $3); }
| variable T_SR_EQUAL expr
- { $$ = zend_ast_create_assign_op(ZEND_ASSIGN_SR, $1, $3); }
+ { $$ = zend_ast_create_assign_op(ZEND_SR, $1, $3); }
+ | variable T_COALESCE_EQUAL expr
+ { $$ = zend_ast_create(ZEND_AST_ASSIGN_COALESCE, $1, $3); }
| variable T_INC { $$ = zend_ast_create(ZEND_AST_POST_INC, $1); }
| T_INC variable { $$ = zend_ast_create(ZEND_AST_PRE_INC, $2); }
| variable T_DEC { $$ = zend_ast_create(ZEND_AST_POST_DEC, $1); }
@@ -931,8 +939,8 @@ expr:
| expr '%' expr { $$ = zend_ast_create_binary_op(ZEND_MOD, $1, $3); }
| expr T_SL expr { $$ = zend_ast_create_binary_op(ZEND_SL, $1, $3); }
| expr T_SR expr { $$ = zend_ast_create_binary_op(ZEND_SR, $1, $3); }
- | '+' expr %prec T_INC { $$ = zend_ast_create(ZEND_AST_UNARY_PLUS, $2); }
- | '-' expr %prec T_INC { $$ = zend_ast_create(ZEND_AST_UNARY_MINUS, $2); }
+ | '+' expr %prec '~' { $$ = zend_ast_create(ZEND_AST_UNARY_PLUS, $2); }
+ | '-' expr %prec '~' { $$ = zend_ast_create(ZEND_AST_UNARY_MINUS, $2); }
| '!' expr { $$ = zend_ast_create_ex(ZEND_AST_UNARY_OP, ZEND_BOOL_NOT, $2); }
| '~' expr { $$ = zend_ast_create_ex(ZEND_AST_UNARY_OP, ZEND_BW_NOT, $2); }
| expr T_IS_IDENTICAL expr
@@ -955,7 +963,11 @@ expr:
{ $$ = zend_ast_create_binary_op(ZEND_SPACESHIP, $1, $3); }
| expr T_INSTANCEOF class_name_reference
{ $$ = zend_ast_create(ZEND_AST_INSTANCEOF, $1, $3); }
- | '(' expr ')' { $$ = $2; }
+ | '(' expr ')' {
+ $$ = $2;
+ if ($$->kind == ZEND_AST_CONDITIONAL) $$->attr = ZEND_PARENTHESIZED_CONDITIONAL;
+ if ($$->kind == ZEND_AST_BINARY_OP && $$->attr == ZEND_CONCAT) $$->attr = ZEND_PARENTHESIZED_CONCAT;
+ }
| new_expr { $$ = $1; }
| expr '?' expr ':' expr
{ $$ = zend_ast_create(ZEND_AST_CONDITIONAL, $1, $3, $5); }
@@ -980,16 +992,27 @@ expr:
| T_YIELD expr { $$ = zend_ast_create(ZEND_AST_YIELD, $2, NULL); CG(extra_fn_flags) |= ZEND_ACC_GENERATOR; }
| T_YIELD expr T_DOUBLE_ARROW expr { $$ = zend_ast_create(ZEND_AST_YIELD, $4, $2); CG(extra_fn_flags) |= ZEND_ACC_GENERATOR; }
| T_YIELD_FROM expr { $$ = zend_ast_create(ZEND_AST_YIELD_FROM, $2); CG(extra_fn_flags) |= ZEND_ACC_GENERATOR; }
- | function returns_ref backup_doc_comment '(' parameter_list ')' lexical_vars return_type
+ | inline_function { $$ = $1; }
+ | T_STATIC inline_function { $$ = $2; ((zend_ast_decl *) $$)->flags |= ZEND_ACC_STATIC; }
+;
+
+
+inline_function:
+ function returns_ref backup_doc_comment '(' parameter_list ')' lexical_vars return_type
backup_fn_flags '{' inner_statement_list '}' backup_fn_flags
{ $$ = zend_ast_create_decl(ZEND_AST_CLOSURE, $2 | $13, $1, $3,
zend_string_init("{closure}", sizeof("{closure}") - 1, 0),
- $5, $7, $11, $8); CG(extra_fn_flags) = $9; }
- | T_STATIC function returns_ref backup_doc_comment '(' parameter_list ')' lexical_vars
- return_type backup_fn_flags '{' inner_statement_list '}' backup_fn_flags
- { $$ = zend_ast_create_decl(ZEND_AST_CLOSURE, $3 | $14 | ZEND_ACC_STATIC, $2, $4,
- zend_string_init("{closure}", sizeof("{closure}") - 1, 0),
- $6, $8, $12, $9); CG(extra_fn_flags) = $10; }
+ $5, $7, $11, $8); CG(extra_fn_flags) = $9; }
+ | fn returns_ref '(' parameter_list ')' return_type backup_doc_comment T_DOUBLE_ARROW backup_fn_flags backup_lex_pos expr backup_fn_flags
+ { $$ = zend_ast_create_decl(ZEND_AST_ARROW_FUNC, $2 | $12, $1, $7,
+ zend_string_init("{closure}", sizeof("{closure}") - 1, 0), $4, NULL,
+ zend_ast_create(ZEND_AST_RETURN, $11), $6);
+ ((zend_ast_decl *) $$)->lex_pos = $10;
+ CG(extra_fn_flags) = $9; }
+;
+
+fn:
+ T_FN { $$ = CG(zend_lineno); }
;
function:
@@ -1001,7 +1024,11 @@ backup_doc_comment:
;
backup_fn_flags:
- /* empty */ { $$ = CG(extra_fn_flags); CG(extra_fn_flags) = 0; }
+ %prec PREC_ARROW_FUNCTION /* empty */ { $$ = CG(extra_fn_flags); CG(extra_fn_flags) = 0; }
+;
+
+backup_lex_pos:
+ /* empty */ { $$ = LANG_SCNG(yy_text); }
;
returns_ref:
@@ -1095,9 +1122,9 @@ scalar:
constant:
name { $$ = zend_ast_create(ZEND_AST_CONST, $1); }
| class_name T_PAAMAYIM_NEKUDOTAYIM identifier
- { $$ = zend_ast_create(ZEND_AST_CLASS_CONST, $1, $3); }
+ { $$ = zend_ast_create_class_const_or_name($1, $3); }
| variable_class_name T_PAAMAYIM_NEKUDOTAYIM identifier
- { $$ = zend_ast_create(ZEND_AST_CLASS_CONST, $1, $3); }
+ { $$ = zend_ast_create_class_const_or_name($1, $3); }
;
optional_expr:
@@ -1129,7 +1156,7 @@ callable_variable:
| constant '[' optional_expr ']'
{ $$ = zend_ast_create(ZEND_AST_DIM, $1, $3); }
| dereferencable '{' expr '}'
- { $$ = zend_ast_create(ZEND_AST_DIM, $1, $3); }
+ { $$ = zend_ast_create_ex(ZEND_AST_DIM, ZEND_DIM_ALTERNATIVE_SYNTAX, $1, $3); }
| dereferencable T_OBJECT_OPERATOR property_name argument_list
{ $$ = zend_ast_create(ZEND_AST_METHOD_CALL, $1, $3, $4); }
| function_call { $$ = $1; }
@@ -1163,7 +1190,7 @@ new_variable:
| new_variable '[' optional_expr ']'
{ $$ = zend_ast_create(ZEND_AST_DIM, $1, $3); }
| new_variable '{' expr '}'
- { $$ = zend_ast_create(ZEND_AST_DIM, $1, $3); }
+ { $$ = zend_ast_create_ex(ZEND_AST_DIM, ZEND_DIM_ALTERNATIVE_SYNTAX, $1, $3); }
| new_variable T_OBJECT_OPERATOR property_name
{ $$ = zend_ast_create(ZEND_AST_PROP, $1, $3); }
| class_name T_PAAMAYIM_NEKUDOTAYIM simple_variable
@@ -1210,6 +1237,8 @@ array_pair:
{ $$ = zend_ast_create_ex(ZEND_AST_ARRAY_ELEM, 1, $4, $1); }
| '&' variable
{ $$ = zend_ast_create_ex(ZEND_AST_ARRAY_ELEM, 1, $2, NULL); }
+ | T_ELLIPSIS expr
+ { $$ = zend_ast_create(ZEND_AST_UNPACK, $2); }
| expr T_DOUBLE_ARROW T_LIST '(' array_pair_list ')'
{ $5->attr = ZEND_ARRAY_SYNTAX_LIST;
$$ = zend_ast_create(ZEND_AST_ARRAY_ELEM, $5, $1); }
@@ -1365,13 +1394,3 @@ static YYSIZE_T zend_yytnamerr(char *yyres, const char *yystr)
yystpcpy(yyres, yystr);
return strlen(yystr);
}
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * indent-tabs-mode: t
- * End:
- * vim600: sw=4 ts=4 fdm=marker
- * vim<600: sw=4 ts=4
- */
diff --git a/Zend/zend_language_scanner.c b/Zend/zend_language_scanner.c
deleted file mode 100644
index 4bbb777126..0000000000
--- a/Zend/zend_language_scanner.c
+++ /dev/null
@@ -1,8192 +0,0 @@
-/* Generated by re2c 1.3 */
-#line 1 "Zend/zend_language_scanner.l"
-/*
- +----------------------------------------------------------------------+
- | 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: Marcus Boerger <helly@php.net> |
- | Nuno Lopes <nlopess@php.net> |
- | Scott MacVicar <scottmac@php.net> |
- | Flex version authors: |
- | Andi Gutmans <andi@php.net> |
- | Zeev Suraski <zeev@php.net> |
- +----------------------------------------------------------------------+
-*/
-
-#if 0
-# define YYDEBUG(s, c) printf("state: %d char: %c\n", s, c)
-#else
-# define YYDEBUG(s, c)
-#endif
-
-#include "zend_language_scanner_defs.h"
-
-#include <errno.h>
-#include "zend.h"
-#ifdef ZEND_WIN32
-# include <Winuser.h>
-#endif
-#include "zend_alloc.h"
-#include <zend_language_parser.h>
-#include "zend_compile.h"
-#include "zend_language_scanner.h"
-#include "zend_highlight.h"
-#include "zend_constants.h"
-#include "zend_variables.h"
-#include "zend_operators.h"
-#include "zend_API.h"
-#include "zend_strtod.h"
-#include "zend_exceptions.h"
-#include "zend_virtual_cwd.h"
-#include "tsrm_config_common.h"
-
-#define YYCTYPE unsigned char
-#define YYFILL(n) { if ((YYCURSOR + n) >= (YYLIMIT + ZEND_MMAP_AHEAD)) { return 0; } }
-#define YYCURSOR SCNG(yy_cursor)
-#define YYLIMIT SCNG(yy_limit)
-#define YYMARKER SCNG(yy_marker)
-
-#define YYGETCONDITION() SCNG(yy_state)
-#define YYSETCONDITION(s) SCNG(yy_state) = s
-
-#define STATE(name) yyc##name
-
-/* emulate flex constructs */
-#define BEGIN(state) YYSETCONDITION(STATE(state))
-#define YYSTATE YYGETCONDITION()
-#define yytext ((char*)SCNG(yy_text))
-#define yyleng SCNG(yy_leng)
-#define yyless(x) do { YYCURSOR = (unsigned char*)yytext + x; \
- yyleng = (unsigned int)x; } while(0)
-#define yymore() goto yymore_restart
-
-/* perform sanity check. If this message is triggered you should
- increase the ZEND_MMAP_AHEAD value in the zend_streams.h file */
-#define YYMAXFILL 16
-
-#if ZEND_MMAP_AHEAD < YYMAXFILL
-# error ZEND_MMAP_AHEAD should be greater than or equal to YYMAXFILL
-#endif
-
-#ifdef HAVE_STDARG_H
-# include <stdarg.h>
-#endif
-
-#ifdef HAVE_UNISTD_H
-# include <unistd.h>
-#endif
-
-/* Globals Macros */
-#define SCNG LANG_SCNG
-#ifdef ZTS
-ZEND_API ts_rsrc_id language_scanner_globals_id;
-#else
-ZEND_API zend_php_scanner_globals language_scanner_globals;
-#endif
-
-#define HANDLE_NEWLINES(s, l) \
-do { \
- char *p = (s), *boundary = p+(l); \
- \
- while (p<boundary) { \
- if (*p == '\n' || (*p == '\r' && (*(p+1) != '\n'))) { \
- CG(zend_lineno)++; \
- } \
- p++; \
- } \
-} while (0)
-
-#define HANDLE_NEWLINE(c) \
-{ \
- if (c == '\n' || c == '\r') { \
- CG(zend_lineno)++; \
- } \
-}
-
-/* To save initial string length after scanning to first variable */
-#define SET_DOUBLE_QUOTES_SCANNED_LENGTH(len) SCNG(scanned_string_len) = (len)
-#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'))
-
-BEGIN_EXTERN_C()
-
-static size_t encoding_filter_script_to_internal(unsigned char **to, size_t *to_length, const unsigned char *from, size_t from_length)
-{
- const zend_encoding *internal_encoding = zend_multibyte_get_internal_encoding();
- ZEND_ASSERT(internal_encoding);
- return zend_multibyte_encoding_converter(to, to_length, from, from_length, internal_encoding, LANG_SCNG(script_encoding));
-}
-
-static size_t encoding_filter_script_to_intermediate(unsigned char **to, size_t *to_length, const unsigned char *from, size_t from_length)
-{
- return zend_multibyte_encoding_converter(to, to_length, from, from_length, zend_multibyte_encoding_utf8, LANG_SCNG(script_encoding));
-}
-
-static size_t encoding_filter_intermediate_to_script(unsigned char **to, size_t *to_length, const unsigned char *from, size_t from_length)
-{
- return zend_multibyte_encoding_converter(to, to_length, from, from_length,
-LANG_SCNG(script_encoding), zend_multibyte_encoding_utf8);
-}
-
-static size_t encoding_filter_intermediate_to_internal(unsigned char **to, size_t *to_length, const unsigned char *from, size_t from_length)
-{
- const zend_encoding *internal_encoding = zend_multibyte_get_internal_encoding();
- ZEND_ASSERT(internal_encoding);
- return zend_multibyte_encoding_converter(to, to_length, from, from_length,
-internal_encoding, zend_multibyte_encoding_utf8);
-}
-
-
-static void _yy_push_state(int new_state)
-{
- zend_stack_push(&SCNG(state_stack), (void *) &YYGETCONDITION());
- YYSETCONDITION(new_state);
-}
-
-#define yy_push_state(state_and_tsrm) _yy_push_state(yyc##state_and_tsrm)
-
-static void yy_pop_state(void)
-{
- int *stack_state = zend_stack_top(&SCNG(state_stack));
- YYSETCONDITION(*stack_state);
- zend_stack_del_top(&SCNG(state_stack));
-}
-
-static void yy_scan_buffer(char *str, unsigned int len)
-{
- YYCURSOR = (YYCTYPE*)str;
- YYLIMIT = YYCURSOR + len;
- if (!SCNG(yy_start)) {
- SCNG(yy_start) = YYCURSOR;
- }
-}
-
-void startup_scanner(void)
-{
- CG(parse_error) = 0;
- CG(doc_comment) = NULL;
- 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) {
- efree(heredoc_label->label);
-}
-
-void shutdown_scanner(void)
-{
- CG(parse_error) = 0;
- RESET_DOC_COMMENT();
- 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;
-}
-
-ZEND_API void zend_save_lexical_state(zend_lex_state *lex_state)
-{
- lex_state->yy_leng = SCNG(yy_leng);
- lex_state->yy_start = SCNG(yy_start);
- lex_state->yy_text = SCNG(yy_text);
- lex_state->yy_cursor = SCNG(yy_cursor);
- lex_state->yy_marker = SCNG(yy_marker);
- lex_state->yy_limit = SCNG(yy_limit);
-
- lex_state->state_stack = SCNG(state_stack);
- zend_stack_init(&SCNG(state_stack), sizeof(int));
-
- lex_state->heredoc_label_stack = SCNG(heredoc_label_stack);
- zend_ptr_stack_init(&SCNG(heredoc_label_stack));
-
- lex_state->in = SCNG(yy_in);
- lex_state->yy_state = YYSTATE;
- lex_state->filename = zend_get_compiled_filename();
- lex_state->lineno = CG(zend_lineno);
-
- lex_state->script_org = SCNG(script_org);
- lex_state->script_org_size = SCNG(script_org_size);
- lex_state->script_filtered = SCNG(script_filtered);
- lex_state->script_filtered_size = SCNG(script_filtered_size);
- lex_state->input_filter = SCNG(input_filter);
- lex_state->output_filter = SCNG(output_filter);
- lex_state->script_encoding = SCNG(script_encoding);
-
- lex_state->on_event = SCNG(on_event);
- lex_state->on_event_context = SCNG(on_event_context);
-
- lex_state->ast = CG(ast);
- lex_state->ast_arena = CG(ast_arena);
-}
-
-ZEND_API void zend_restore_lexical_state(zend_lex_state *lex_state)
-{
- SCNG(yy_leng) = lex_state->yy_leng;
- SCNG(yy_start) = lex_state->yy_start;
- SCNG(yy_text) = lex_state->yy_text;
- SCNG(yy_cursor) = lex_state->yy_cursor;
- SCNG(yy_marker) = lex_state->yy_marker;
- SCNG(yy_limit) = lex_state->yy_limit;
-
- zend_stack_destroy(&SCNG(state_stack));
- SCNG(state_stack) = lex_state->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_label_stack) = lex_state->heredoc_label_stack;
-
- SCNG(yy_in) = lex_state->in;
- YYSETCONDITION(lex_state->yy_state);
- CG(zend_lineno) = lex_state->lineno;
- zend_restore_compiled_filename(lex_state->filename);
-
- if (SCNG(script_filtered)) {
- efree(SCNG(script_filtered));
- SCNG(script_filtered) = NULL;
- }
- SCNG(script_org) = lex_state->script_org;
- SCNG(script_org_size) = lex_state->script_org_size;
- SCNG(script_filtered) = lex_state->script_filtered;
- SCNG(script_filtered_size) = lex_state->script_filtered_size;
- SCNG(input_filter) = lex_state->input_filter;
- SCNG(output_filter) = lex_state->output_filter;
- SCNG(script_encoding) = lex_state->script_encoding;
-
- SCNG(on_event) = lex_state->on_event;
- SCNG(on_event_context) = lex_state->on_event_context;
-
- CG(ast) = lex_state->ast;
- CG(ast_arena) = lex_state->ast_arena;
-
- RESET_DOC_COMMENT();
-}
-
-ZEND_API void zend_destroy_file_handle(zend_file_handle *file_handle)
-{
- zend_llist_del_element(&CG(open_files), file_handle, (int (*)(void *, void *)) zend_compare_file_handles);
- /* zend_file_handle_dtor() operates on the copy, so we have to NULLify the original here */
- file_handle->opened_path = NULL;
- if (file_handle->free_filename) {
- file_handle->filename = NULL;
- }
-}
-
-ZEND_API void zend_lex_tstring(zval *zv)
-{
- if (SCNG(on_event)) {
- SCNG(on_event)(ON_FEEDBACK, T_STRING, 0, SCNG(on_event_context));
- }
-
- ZVAL_STRINGL(zv, (char*)SCNG(yy_text), SCNG(yy_leng));
-}
-
-#define BOM_UTF32_BE "\x00\x00\xfe\xff"
-#define BOM_UTF32_LE "\xff\xfe\x00\x00"
-#define BOM_UTF16_BE "\xfe\xff"
-#define BOM_UTF16_LE "\xff\xfe"
-#define BOM_UTF8 "\xef\xbb\xbf"
-
-static const zend_encoding *zend_multibyte_detect_utf_encoding(const unsigned char *script, size_t script_size)
-{
- const unsigned char *p;
- int wchar_size = 2;
- int le = 0;
-
- /* utf-16 or utf-32? */
- p = script;
- assert(p >= script);
- while ((size_t)(p-script) < script_size) {
- p = memchr(p, 0, script_size-(p-script)-2);
- if (!p) {
- break;
- }
- if (*(p+1) == '\0' && *(p+2) == '\0') {
- wchar_size = 4;
- break;
- }
-
- /* searching for UTF-32 specific byte orders, so this will do */
- p += 4;
- }
-
- /* BE or LE? */
- p = script;
- assert(p >= script);
- while ((size_t)(p-script) < script_size) {
- if (*p == '\0' && *(p+wchar_size-1) != '\0') {
- /* BE */
- le = 0;
- break;
- } else if (*p != '\0' && *(p+wchar_size-1) == '\0') {
- /* LE* */
- le = 1;
- break;
- }
- p += wchar_size;
- }
-
- if (wchar_size == 2) {
- return le ? zend_multibyte_encoding_utf16le : zend_multibyte_encoding_utf16be;
- } else {
- return le ? zend_multibyte_encoding_utf32le : zend_multibyte_encoding_utf32be;
- }
-
- return NULL;
-}
-
-static const zend_encoding* zend_multibyte_detect_unicode(void)
-{
- const zend_encoding *script_encoding = NULL;
- int bom_size;
- unsigned char *pos1, *pos2;
-
- if (LANG_SCNG(script_org_size) < sizeof(BOM_UTF32_LE)-1) {
- return NULL;
- }
-
- /* check out BOM */
- if (!memcmp(LANG_SCNG(script_org), BOM_UTF32_BE, sizeof(BOM_UTF32_BE)-1)) {
- script_encoding = zend_multibyte_encoding_utf32be;
- bom_size = sizeof(BOM_UTF32_BE)-1;
- } else if (!memcmp(LANG_SCNG(script_org), BOM_UTF32_LE, sizeof(BOM_UTF32_LE)-1)) {
- script_encoding = zend_multibyte_encoding_utf32le;
- bom_size = sizeof(BOM_UTF32_LE)-1;
- } else if (!memcmp(LANG_SCNG(script_org), BOM_UTF16_BE, sizeof(BOM_UTF16_BE)-1)) {
- script_encoding = zend_multibyte_encoding_utf16be;
- bom_size = sizeof(BOM_UTF16_BE)-1;
- } else if (!memcmp(LANG_SCNG(script_org), BOM_UTF16_LE, sizeof(BOM_UTF16_LE)-1)) {
- script_encoding = zend_multibyte_encoding_utf16le;
- bom_size = sizeof(BOM_UTF16_LE)-1;
- } else if (!memcmp(LANG_SCNG(script_org), BOM_UTF8, sizeof(BOM_UTF8)-1)) {
- script_encoding = zend_multibyte_encoding_utf8;
- bom_size = sizeof(BOM_UTF8)-1;
- }
-
- if (script_encoding) {
- /* remove BOM */
- LANG_SCNG(script_org) += bom_size;
- LANG_SCNG(script_org_size) -= bom_size;
-
- return script_encoding;
- }
-
- /* script contains NULL bytes -> auto-detection */
- if ((pos1 = memchr(LANG_SCNG(script_org), 0, LANG_SCNG(script_org_size)))) {
- /* check if the NULL byte is after the __HALT_COMPILER(); */
- pos2 = LANG_SCNG(script_org);
-
- while ((size_t)(pos1 - pos2) >= sizeof("__HALT_COMPILER();")-1) {
- pos2 = memchr(pos2, '_', pos1 - pos2);
- if (!pos2) break;
- pos2++;
- if (strncasecmp((char*)pos2, "_HALT_COMPILER", sizeof("_HALT_COMPILER")-1) == 0) {
- pos2 += sizeof("_HALT_COMPILER")-1;
- while (*pos2 == ' ' ||
- *pos2 == '\t' ||
- *pos2 == '\r' ||
- *pos2 == '\n') {
- pos2++;
- }
- if (*pos2 == '(') {
- pos2++;
- while (*pos2 == ' ' ||
- *pos2 == '\t' ||
- *pos2 == '\r' ||
- *pos2 == '\n') {
- pos2++;
- }
- if (*pos2 == ')') {
- pos2++;
- while (*pos2 == ' ' ||
- *pos2 == '\t' ||
- *pos2 == '\r' ||
- *pos2 == '\n') {
- pos2++;
- }
- if (*pos2 == ';') {
- return NULL;
- }
- }
- }
- }
- }
- /* make best effort if BOM is missing */
- return zend_multibyte_detect_utf_encoding(LANG_SCNG(script_org), LANG_SCNG(script_org_size));
- }
-
- return NULL;
-}
-
-static const zend_encoding* zend_multibyte_find_script_encoding(void)
-{
- const zend_encoding *script_encoding;
-
- if (CG(detect_unicode)) {
- /* check out bom(byte order mark) and see if containing wchars */
- script_encoding = zend_multibyte_detect_unicode();
- if (script_encoding != NULL) {
- /* bom or wchar detection is prior to 'script_encoding' option */
- return script_encoding;
- }
- }
-
- /* if no script_encoding specified, just leave alone */
- if (!CG(script_encoding_list) || !CG(script_encoding_list_size)) {
- return NULL;
- }
-
- /* if multiple encodings specified, detect automagically */
- if (CG(script_encoding_list_size) > 1) {
- return zend_multibyte_encoding_detector(LANG_SCNG(script_org), LANG_SCNG(script_org_size), CG(script_encoding_list), CG(script_encoding_list_size));
- }
-
- return CG(script_encoding_list)[0];
-}
-
-ZEND_API int zend_multibyte_set_filter(const zend_encoding *onetime_encoding)
-{
- const zend_encoding *internal_encoding = zend_multibyte_get_internal_encoding();
- const zend_encoding *script_encoding = onetime_encoding ? onetime_encoding: zend_multibyte_find_script_encoding();
-
- if (!script_encoding) {
- return FAILURE;
- }
-
- /* judge input/output filter */
- LANG_SCNG(script_encoding) = script_encoding;
- LANG_SCNG(input_filter) = NULL;
- LANG_SCNG(output_filter) = NULL;
-
- if (!internal_encoding || LANG_SCNG(script_encoding) == internal_encoding) {
- if (!zend_multibyte_check_lexer_compatibility(LANG_SCNG(script_encoding))) {
- /* and if not, work around w/ script_encoding -> utf-8 -> script_encoding conversion */
- LANG_SCNG(input_filter) = encoding_filter_script_to_intermediate;
- LANG_SCNG(output_filter) = encoding_filter_intermediate_to_script;
- } else {
- LANG_SCNG(input_filter) = NULL;
- LANG_SCNG(output_filter) = NULL;
- }
- return SUCCESS;
- }
-
- if (zend_multibyte_check_lexer_compatibility(internal_encoding)) {
- LANG_SCNG(input_filter) = encoding_filter_script_to_internal;
- LANG_SCNG(output_filter) = NULL;
- } else if (zend_multibyte_check_lexer_compatibility(LANG_SCNG(script_encoding))) {
- LANG_SCNG(input_filter) = NULL;
- LANG_SCNG(output_filter) = encoding_filter_script_to_internal;
- } else {
- /* both script and internal encodings are incompatible w/ flex */
- LANG_SCNG(input_filter) = encoding_filter_script_to_intermediate;
- LANG_SCNG(output_filter) = encoding_filter_intermediate_to_internal;
- }
-
- return 0;
-}
-
-ZEND_API int open_file_for_scanning(zend_file_handle *file_handle)
-{
- char *buf;
- size_t size, offset = 0;
- zend_string *compiled_filename;
-
- /* The shebang line was read, get the current position to obtain the buffer start */
- if (CG(start_lineno) == 2 && file_handle->type == ZEND_HANDLE_FP && file_handle->handle.fp) {
- if ((offset = ftell(file_handle->handle.fp)) == (size_t)-1) {
- offset = 0;
- }
- }
-
- if (zend_stream_fixup(file_handle, &buf, &size) == FAILURE) {
- return FAILURE;
- }
-
- zend_llist_add_element(&CG(open_files), file_handle);
- if (file_handle->handle.stream.handle >= (void*)file_handle && file_handle->handle.stream.handle <= (void*)(file_handle+1)) {
- zend_file_handle *fh = (zend_file_handle*)zend_llist_get_last(&CG(open_files));
- size_t diff = (char*)file_handle->handle.stream.handle - (char*)file_handle;
- fh->handle.stream.handle = (void*)(((char*)fh) + diff);
- file_handle->handle.stream.handle = fh->handle.stream.handle;
- }
-
- /* Reset the scanner for scanning the new file */
- SCNG(yy_in) = file_handle;
- SCNG(yy_start) = NULL;
-
- if (size != (size_t)-1) {
- if (CG(multibyte)) {
- SCNG(script_org) = (unsigned char*)buf;
- SCNG(script_org_size) = size;
- SCNG(script_filtered) = NULL;
-
- zend_multibyte_set_filter(NULL);
-
- if (SCNG(input_filter)) {
- if ((size_t)-1 == SCNG(input_filter)(&SCNG(script_filtered), &SCNG(script_filtered_size), SCNG(script_org), SCNG(script_org_size))) {
- zend_error_noreturn(E_COMPILE_ERROR, "Could not convert the script from the detected "
- "encoding \"%s\" to a compatible encoding", zend_multibyte_get_encoding_name(LANG_SCNG(script_encoding)));
- }
- buf = (char*)SCNG(script_filtered);
- size = SCNG(script_filtered_size);
- }
- }
- SCNG(yy_start) = (unsigned char *)buf - offset;
- yy_scan_buffer(buf, (unsigned int)size);
- } else {
- zend_error_noreturn(E_COMPILE_ERROR, "zend_stream_mmap() failed");
- }
-
- BEGIN(INITIAL);
-
- if (file_handle->opened_path) {
- compiled_filename = zend_string_copy(file_handle->opened_path);
- } else {
- compiled_filename = zend_string_init(file_handle->filename, strlen(file_handle->filename), 0);
- }
-
- zend_set_compiled_filename(compiled_filename);
- zend_string_release_ex(compiled_filename, 0);
-
- if (CG(start_lineno)) {
- CG(zend_lineno) = CG(start_lineno);
- CG(start_lineno) = 0;
- } else {
- CG(zend_lineno) = 1;
- }
-
- RESET_DOC_COMMENT();
- CG(increment_lineno) = 0;
- return SUCCESS;
-}
-END_EXTERN_C()
-
-static zend_op_array *zend_compile(int type)
-{
- zend_op_array *op_array = NULL;
- zend_bool original_in_compilation = CG(in_compilation);
-
- CG(in_compilation) = 1;
- CG(ast) = NULL;
- CG(ast_arena) = zend_arena_create(1024 * 32);
-
- if (!zendparse()) {
- int last_lineno = CG(zend_lineno);
- zend_file_context original_file_context;
- zend_oparray_context original_oparray_context;
- zend_op_array *original_active_op_array = CG(active_op_array);
-
- op_array = emalloc(sizeof(zend_op_array));
- init_op_array(op_array, type, INITIAL_OP_ARRAY_SIZE);
- CG(active_op_array) = op_array;
-
- if (zend_ast_process) {
- zend_ast_process(CG(ast));
- }
-
- zend_file_context_begin(&original_file_context);
- zend_oparray_context_begin(&original_oparray_context);
- zend_compile_top_stmt(CG(ast));
- CG(zend_lineno) = last_lineno;
- zend_emit_final_return(type == ZEND_USER_FUNCTION);
- op_array->line_start = 1;
- op_array->line_end = last_lineno;
- pass_two(op_array);
- zend_oparray_context_end(&original_oparray_context);
- zend_file_context_end(&original_file_context);
-
- CG(active_op_array) = original_active_op_array;
- }
-
- zend_ast_destroy(CG(ast));
- zend_arena_destroy(CG(ast_arena));
-
- CG(in_compilation) = original_in_compilation;
-
- return op_array;
-}
-
-ZEND_API zend_op_array *compile_file(zend_file_handle *file_handle, int type)
-{
- zend_lex_state original_lex_state;
- zend_op_array *op_array = NULL;
- zend_save_lexical_state(&original_lex_state);
-
- if (open_file_for_scanning(file_handle)==FAILURE) {
- if (type==ZEND_REQUIRE) {
- zend_message_dispatcher(ZMSG_FAILED_REQUIRE_FOPEN, file_handle->filename);
- zend_bailout();
- } else {
- zend_message_dispatcher(ZMSG_FAILED_INCLUDE_FOPEN, file_handle->filename);
- }
- } else {
- op_array = zend_compile(ZEND_USER_FUNCTION);
- }
-
- zend_restore_lexical_state(&original_lex_state);
- return op_array;
-}
-
-
-zend_op_array *compile_filename(int type, zval *filename)
-{
- zend_file_handle file_handle;
- zval tmp;
- zend_op_array *retval;
- zend_string *opened_path = NULL;
-
- if (Z_TYPE_P(filename) != IS_STRING) {
- ZVAL_STR(&tmp, zval_get_string(filename));
- filename = &tmp;
- }
- file_handle.filename = Z_STRVAL_P(filename);
- file_handle.free_filename = 0;
- file_handle.type = ZEND_HANDLE_FILENAME;
- file_handle.opened_path = NULL;
- file_handle.handle.fp = NULL;
-
- retval = zend_compile_file(&file_handle, type);
- if (retval && file_handle.handle.stream.handle) {
- if (!file_handle.opened_path) {
- file_handle.opened_path = opened_path = zend_string_copy(Z_STR_P(filename));
- }
-
- zend_hash_add_empty_element(&EG(included_files), file_handle.opened_path);
-
- if (opened_path) {
- zend_string_release_ex(opened_path, 0);
- }
- }
- zend_destroy_file_handle(&file_handle);
-
- if (UNEXPECTED(filename == &tmp)) {
- zval_ptr_dtor(&tmp);
- }
- return retval;
-}
-
-ZEND_API int zend_prepare_string_for_scanning(zval *str, char *filename)
-{
- char *buf;
- size_t size, old_len;
- zend_string *new_compiled_filename;
-
- /* enforce ZEND_MMAP_AHEAD trailing NULLs for flex... */
- old_len = Z_STRLEN_P(str);
- Z_STR_P(str) = zend_string_extend(Z_STR_P(str), old_len + ZEND_MMAP_AHEAD, 0);
- Z_TYPE_INFO_P(str) = IS_STRING_EX;
- memset(Z_STRVAL_P(str) + old_len, 0, ZEND_MMAP_AHEAD + 1);
-
- SCNG(yy_in) = NULL;
- SCNG(yy_start) = NULL;
-
- buf = Z_STRVAL_P(str);
- size = old_len;
-
- if (CG(multibyte)) {
- SCNG(script_org) = (unsigned char*)buf;
- SCNG(script_org_size) = size;
- SCNG(script_filtered) = NULL;
-
- zend_multibyte_set_filter(zend_multibyte_get_internal_encoding());
-
- if (SCNG(input_filter)) {
- if ((size_t)-1 == SCNG(input_filter)(&SCNG(script_filtered), &SCNG(script_filtered_size), SCNG(script_org), SCNG(script_org_size))) {
- zend_error_noreturn(E_COMPILE_ERROR, "Could not convert the script from the detected "
- "encoding \"%s\" to a compatible encoding", zend_multibyte_get_encoding_name(LANG_SCNG(script_encoding)));
- }
- buf = (char*)SCNG(script_filtered);
- size = SCNG(script_filtered_size);
- }
- }
-
- yy_scan_buffer(buf, (unsigned int)size);
-
- new_compiled_filename = zend_string_init(filename, strlen(filename), 0);
- zend_set_compiled_filename(new_compiled_filename);
- zend_string_release_ex(new_compiled_filename, 0);
- CG(zend_lineno) = 1;
- CG(increment_lineno) = 0;
- RESET_DOC_COMMENT();
- return SUCCESS;
-}
-
-
-ZEND_API size_t zend_get_scanned_file_offset(void)
-{
- size_t offset = SCNG(yy_cursor) - SCNG(yy_start);
- if (SCNG(input_filter)) {
- size_t original_offset = offset, length = 0;
- do {
- unsigned char *p = NULL;
- if ((size_t)-1 == SCNG(input_filter)(&p, &length, SCNG(script_org), offset)) {
- return (size_t)-1;
- }
- efree(p);
- if (length > original_offset) {
- offset--;
- } else if (length < original_offset) {
- offset++;
- }
- } while (original_offset != length);
- }
- return offset;
-}
-
-zend_op_array *compile_string(zval *source_string, char *filename)
-{
- zend_lex_state original_lex_state;
- zend_op_array *op_array = NULL;
- zval tmp;
-
- if (UNEXPECTED(Z_TYPE_P(source_string) != IS_STRING)) {
- ZVAL_STR(&tmp, zval_get_string_func(source_string));
- } else {
- ZVAL_COPY(&tmp, source_string);
- }
-
- if (Z_STRLEN(tmp)==0) {
- zval_ptr_dtor(&tmp);
- return NULL;
- }
-
- zend_save_lexical_state(&original_lex_state);
- 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_ptr_dtor(&tmp);
-
- return op_array;
-}
-
-
-BEGIN_EXTERN_C()
-int highlight_file(char *filename, zend_syntax_highlighter_ini *syntax_highlighter_ini)
-{
- zend_lex_state original_lex_state;
- zend_file_handle file_handle;
-
- file_handle.type = ZEND_HANDLE_FILENAME;
- file_handle.filename = filename;
- file_handle.free_filename = 0;
- file_handle.opened_path = NULL;
- zend_save_lexical_state(&original_lex_state);
- if (open_file_for_scanning(&file_handle)==FAILURE) {
- zend_message_dispatcher(ZMSG_FAILED_HIGHLIGHT_FOPEN, filename);
- zend_restore_lexical_state(&original_lex_state);
- return FAILURE;
- }
- zend_highlight(syntax_highlighter_ini);
- if (SCNG(script_filtered)) {
- efree(SCNG(script_filtered));
- SCNG(script_filtered) = NULL;
- }
- zend_destroy_file_handle(&file_handle);
- zend_restore_lexical_state(&original_lex_state);
- return SUCCESS;
-}
-
-int highlight_string(zval *str, zend_syntax_highlighter_ini *syntax_highlighter_ini, char *str_name)
-{
- zend_lex_state original_lex_state;
- zval tmp;
-
- 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);
- zend_highlight(syntax_highlighter_ini);
- if (SCNG(script_filtered)) {
- efree(SCNG(script_filtered));
- SCNG(script_filtered) = NULL;
- }
- zend_restore_lexical_state(&original_lex_state);
- if (UNEXPECTED(str == &tmp)) {
- zval_ptr_dtor(&tmp);
- }
- return SUCCESS;
-}
-
-ZEND_API void zend_multibyte_yyinput_again(zend_encoding_filter old_input_filter, const zend_encoding *old_encoding)
-{
- size_t length;
- unsigned char *new_yy_start;
-
- /* convert and set */
- if (!SCNG(input_filter)) {
- if (SCNG(script_filtered)) {
- efree(SCNG(script_filtered));
- SCNG(script_filtered) = NULL;
- }
- SCNG(script_filtered_size) = 0;
- length = SCNG(script_org_size);
- new_yy_start = SCNG(script_org);
- } else {
- if ((size_t)-1 == SCNG(input_filter)(&new_yy_start, &length, SCNG(script_org), SCNG(script_org_size))) {
- zend_error_noreturn(E_COMPILE_ERROR, "Could not convert the script from the detected "
- "encoding \"%s\" to a compatible encoding", zend_multibyte_get_encoding_name(LANG_SCNG(script_encoding)));
- }
- if (SCNG(script_filtered)) {
- efree(SCNG(script_filtered));
- }
- SCNG(script_filtered) = new_yy_start;
- SCNG(script_filtered_size) = length;
- }
-
- SCNG(yy_cursor) = new_yy_start + (SCNG(yy_cursor) - SCNG(yy_start));
- SCNG(yy_marker) = new_yy_start + (SCNG(yy_marker) - SCNG(yy_start));
- SCNG(yy_text) = new_yy_start + (SCNG(yy_text) - SCNG(yy_start));
- SCNG(yy_limit) = new_yy_start + length;
-
- SCNG(yy_start) = new_yy_start;
-}
-
-
-// TODO: avoid reallocation ???
-# define zend_copy_value(zendlval, yytext, yyleng) \
- if (SCNG(output_filter)) { \
- size_t sz = 0; \
- char *s = NULL; \
- 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); \
- }
-
-static int zend_scan_escape_string(zval *zendlval, char *str, int len, char quote_type)
-{
- 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 = 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++;
- if (s >= end) {
- *t++ = '\\';
- break;
- }
-
- switch(*s) {
- case 'n':
- *t++ = '\n';
- break;
- case 'r':
- *t++ = '\r';
- break;
- case 't':
- *t++ = '\t';
- break;
- case 'f':
- *t++ = '\f';
- break;
- case 'v':
- *t++ = '\v';
- break;
- case 'e':
-#ifdef ZEND_WIN32
- *t++ = VK_ESCAPE;
-#else
- *t++ = '\e';
-#endif
- break;
- case '"':
- case '`':
- if (*s != quote_type) {
- *t++ = '\\';
- *t++ = *s;
- break;
- }
- case '\\':
- case '$':
- *t++ = *s;
- break;
- case 'x':
- case 'X':
- if (ZEND_IS_HEX(*(s+1))) {
- char hex_buf[3] = { 0, 0, 0 };
-
- hex_buf[0] = *(++s);
- if (ZEND_IS_HEX(*(s+1))) {
- hex_buf[1] = *(++s);
- }
- *t++ = (char) ZEND_STRTOL(hex_buf, NULL, 16);
- } else {
- *t++ = '\\';
- *t++ = *s;
- }
- break;
- /* UTF-8 codepoint escape, format: /\\u\{\x+\}/ */
- case 'u':
- {
- /* cache where we started so we can parse after validating */
- char *start = s + 1;
- size_t len = 0;
- zend_bool valid = 1;
- unsigned long codepoint;
-
- if (*start != '{') {
- /* we silently let this pass to avoid breaking code
- * with JSON in string literals (e.g. "\"\u202e\""
- */
- *t++ = '\\';
- *t++ = 'u';
- break;
- } else {
- /* on the other hand, invalid \u{blah} errors */
- s++;
- len++;
- s++;
- while (*s != '}') {
- if (!ZEND_IS_HEX(*s)) {
- valid = 0;
- break;
- } else {
- len++;
- }
- s++;
- }
- if (*s == '}') {
- valid = 1;
- len++;
- }
- }
-
- /* \u{} is invalid */
- if (len <= 2) {
- valid = 0;
- }
-
- if (!valid) {
- zend_throw_exception(zend_ce_parse_error,
- "Invalid UTF-8 codepoint escape sequence", 0);
- zval_ptr_dtor(zendlval);
- ZVAL_UNDEF(zendlval);
- return FAILURE;
- }
-
- errno = 0;
- codepoint = strtoul(start + 1, NULL, 16);
-
- /* per RFC 3629, UTF-8 can only represent 21 bits */
- if (codepoint > 0x10FFFF || errno) {
- zend_throw_exception(zend_ce_parse_error,
- "Invalid UTF-8 codepoint escape sequence: Codepoint too large", 0);
- zval_ptr_dtor(zendlval);
- ZVAL_UNDEF(zendlval);
- return FAILURE;
- }
-
- /* based on https://en.wikipedia.org/wiki/UTF-8#Sample_code */
- if (codepoint < 0x80) {
- *t++ = codepoint;
- } else if (codepoint <= 0x7FF) {
- *t++ = (codepoint >> 6) + 0xC0;
- *t++ = (codepoint & 0x3F) + 0x80;
- } else if (codepoint <= 0xFFFF) {
- *t++ = (codepoint >> 12) + 0xE0;
- *t++ = ((codepoint >> 6) & 0x3F) + 0x80;
- *t++ = (codepoint & 0x3F) + 0x80;
- } else if (codepoint <= 0x10FFFF) {
- *t++ = (codepoint >> 18) + 0xF0;
- *t++ = ((codepoint >> 12) & 0x3F) + 0x80;
- *t++ = ((codepoint >> 6) & 0x3F) + 0x80;
- *t++ = (codepoint & 0x3F) + 0x80;
- }
- }
- break;
- default:
- /* check for an octal */
- if (ZEND_IS_OCT(*s)) {
- char octal_buf[4] = { 0, 0, 0, 0 };
-
- octal_buf[0] = *s;
- if (ZEND_IS_OCT(*(s+1))) {
- octal_buf[1] = *(++s);
- if (ZEND_IS_OCT(*(s+1))) {
- octal_buf[2] = *(++s);
- }
- }
- if (octal_buf[2] &&
- (octal_buf[0] > '3')) {
- /* 3 octit values must not overflow 0xFF (\377) */
- zend_error(E_COMPILE_WARNING, "Octal escape sequence overflow \\%s is greater than \\377", octal_buf);
- }
-
- *t++ = (char) ZEND_STRTOL(octal_buf, NULL, 8);
- } else {
- *t++ = '\\';
- *t++ = *s;
- }
- break;
- }
- } 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;
- unsigned char *str;
- // TODO: avoid realocation ???
- s = Z_STRVAL_P(zendlval);
- SCNG(output_filter)(&str, &sz, (unsigned char *)s, (size_t)Z_STRLEN_P(zendlval));
- zval_ptr_dtor(zendlval);
- ZVAL_STRINGL(zendlval, (char *) str, sz);
- efree(str);
- }
- return SUCCESS;
-}
-
-#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;
- return str;
- } 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)
-{
- 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;
- }
-
- /* <= 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;
- }
- }
-
- 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 1251 "Zend/zend_language_scanner.c"
-{
- YYCTYPE yych;
- unsigned int yyaccept = 0;
- if (YYGETCONDITION() < 5) {
- if (YYGETCONDITION() < 2) {
- if (YYGETCONDITION() < 1) {
- goto yyc_ST_IN_SCRIPTING;
- } else {
- goto yyc_ST_LOOKING_FOR_PROPERTY;
- }
- } else {
- if (YYGETCONDITION() < 3) {
- goto yyc_ST_BACKQUOTE;
- } else {
- if (YYGETCONDITION() < 4) {
- goto yyc_ST_DOUBLE_QUOTES;
- } else {
- goto yyc_ST_HEREDOC;
- }
- }
- }
- } else {
- if (YYGETCONDITION() < 7) {
- if (YYGETCONDITION() < 6) {
- goto yyc_ST_LOOKING_FOR_VARNAME;
- } else {
- goto yyc_ST_VAR_OFFSET;
- }
- } else {
- if (YYGETCONDITION() < 8) {
- goto yyc_INITIAL;
- } else {
- if (YYGETCONDITION() < 9) {
- goto yyc_ST_END_HEREDOC;
- } else {
- goto yyc_ST_NOWDOC;
- }
- }
- }
- }
-/* *********************************** */
-yyc_ST_IN_SCRIPTING:
- {
- static const unsigned char yybm[] = {
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 36, 4, 0, 0, 4, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 36, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 216, 216, 152, 152, 152, 152, 152, 152,
- 152, 152, 0, 0, 0, 0, 0, 0,
- 0, 144, 144, 144, 144, 144, 144, 16,
- 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 0, 0, 0, 0, 16,
- 0, 144, 144, 144, 144, 144, 144, 16,
- 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 0, 0, 0, 0, 0,
- 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16,
- };
- YYDEBUG(1, *YYCURSOR);
- YYFILL(16);
- yych = *YYCURSOR;
- if (yybm[0+yych] & 4) {
- goto yy5;
- }
- switch (yych) {
- case 0x00:
- case 0x01:
- case 0x02:
- case 0x03:
- case 0x04:
- case 0x05:
- case 0x06:
- case 0x07:
- case 0x08:
- case '\t':
- case '\n':
- case '\v':
- case '\f':
- case '\r':
- case 0x0E:
- case 0x0F:
- case 0x10:
- case 0x11:
- case 0x12:
- case 0x13:
- case 0x14:
- case 0x15:
- case 0x16:
- case 0x17:
- case 0x18:
- case 0x19:
- case 0x1A:
- case 0x1B:
- case 0x1C:
- case 0x1D:
- case 0x1E:
- case 0x1F:
- case 0x7F: goto yy3;
- case ' ':
- case '!': goto yy8;
- case '"': goto yy10;
- case '#': goto yy12;
- case '$': goto yy14;
- case '%': goto yy15;
- case '&': goto yy16;
- case '\'': goto yy17;
- case '(': goto yy19;
- case ')':
- case ',':
- case ';':
- case '@':
- case '[':
- case ']':
- case '~': goto yy20;
- case '*': goto yy21;
- case '+': goto yy22;
- case '-': goto yy23;
- case '.': goto yy24;
- case '/': goto yy25;
- case '0': goto yy26;
- case '1':
- case '2':
- case '3':
- case '4':
- case '5':
- case '6':
- case '7':
- case '8':
- case '9': goto yy28;
- case ':': goto yy30;
- case '<': goto yy31;
- case '=': goto yy32;
- case '>': goto yy33;
- case '?': goto yy34;
- case 'A':
- case 'a': goto yy35;
- case 'B':
- case 'b': goto yy37;
- case 'C':
- case 'c': goto yy38;
- case 'D':
- case 'd': goto yy39;
- case 'E':
- case 'e': goto yy40;
- case 'F':
- case 'f': goto yy41;
- case 'G':
- case 'g': goto yy42;
- case 'I':
- case 'i': goto yy45;
- case 'L':
- case 'l': goto yy46;
- case 'N':
- case 'n': goto yy47;
- case 'O':
- case 'o': goto yy48;
- case 'P':
- case 'p': goto yy49;
- case 'R':
- case 'r': goto yy50;
- case 'S':
- case 's': goto yy51;
- case 'T':
- case 't': goto yy52;
- case 'U':
- case 'u': goto yy53;
- case 'V':
- case 'v': goto yy54;
- case 'W':
- case 'w': goto yy55;
- case 'X':
- case 'x': goto yy56;
- case 'Y':
- case 'y': goto yy57;
- case '\\': goto yy58;
- case '^': goto yy60;
- case '_': goto yy61;
- case '`': goto yy62;
- case '{': goto yy64;
- case '|': goto yy66;
- case '}': goto yy67;
- default: goto yy43;
- }
-yy3:
- YYDEBUG(3, *YYCURSOR);
- ++YYCURSOR;
- YYDEBUG(4, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 2769 "Zend/zend_language_scanner.l"
- {
- if (YYCURSOR > YYLIMIT) {
- RETURN_TOKEN(END);
- }
-
- if (!SCNG(heredoc_scan_ahead)) {
- zend_error(E_COMPILE_WARNING, "Unexpected character in input: '%c' (ASCII=%d) state=%d", yytext[0], yytext[0], YYSTATE);
- }
- goto restart;
-}
-#line 1470 "Zend/zend_language_scanner.c"
-yy5:
- YYDEBUG(5, *YYCURSOR);
- ++YYCURSOR;
- YYFILL(1);
- yych = *YYCURSOR;
- YYDEBUG(6, *YYCURSOR);
- if (yybm[0+yych] & 4) {
- goto yy5;
- }
- YYDEBUG(7, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1430 "Zend/zend_language_scanner.l"
- {
- goto return_whitespace;
-}
-#line 1486 "Zend/zend_language_scanner.c"
-yy8:
- YYDEBUG(8, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == '=') goto yy69;
-yy9:
- YYDEBUG(9, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1713 "Zend/zend_language_scanner.l"
- {
- RETURN_TOKEN(yytext[0]);
-}
-#line 1498 "Zend/zend_language_scanner.c"
-yy10:
- YYDEBUG(10, *YYCURSOR);
- ++YYCURSOR;
- YYDEBUG(11, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 2225 "Zend/zend_language_scanner.l"
- {
- int bprefix = (yytext[0] != '"') ? 1 : 0;
-
- while (YYCURSOR < YYLIMIT) {
- switch (*YYCURSOR++) {
- case '"':
- yyleng = YYCURSOR - SCNG(yy_text);
- 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;
- }
- continue;
- case '{':
- if (*YYCURSOR == '$') {
- break;
- }
- continue;
- case '\\':
- if (YYCURSOR < YYLIMIT) {
- YYCURSOR++;
- }
- /* fall through */
- default:
- continue;
- }
-
- YYCURSOR--;
- break;
- }
-
- /* Remember how much was scanned to save rescanning */
- SET_DOUBLE_QUOTES_SCANNED_LENGTH(YYCURSOR - SCNG(yy_text) - yyleng);
-
- YYCURSOR = SCNG(yy_text) + yyleng;
-
- BEGIN(ST_DOUBLE_QUOTES);
- RETURN_TOKEN('"');
-}
-#line 1549 "Zend/zend_language_scanner.c"
-yy12:
- YYDEBUG(12, *YYCURSOR);
- ++YYCURSOR;
- YYDEBUG(13, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 2052 "Zend/zend_language_scanner.l"
- {
- while (YYCURSOR < YYLIMIT) {
- switch (*YYCURSOR++) {
- case '\r':
- if (*YYCURSOR == '\n') {
- YYCURSOR++;
- }
- /* fall through */
- case '\n':
- CG(zend_lineno)++;
- break;
- case '?':
- if (*YYCURSOR == '>') {
- YYCURSOR--;
- break;
- }
- /* fall through */
- default:
- continue;
- }
-
- break;
- }
-
- yyleng = YYCURSOR - SCNG(yy_text);
-
- if (PARSER_MODE()) {
- SKIP_TOKEN(T_COMMENT);
- }
- RETURN_TOKEN(T_COMMENT);
-}
-#line 1587 "Zend/zend_language_scanner.c"
-yy14:
- YYDEBUG(14, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych <= '_') {
- if (yych <= '@') goto yy9;
- if (yych <= 'Z') goto yy71;
- if (yych <= '^') goto yy9;
- goto yy71;
- } else {
- if (yych <= '`') goto yy9;
- if (yych <= 'z') goto yy71;
- if (yych <= 0x7F) goto yy9;
- goto yy71;
- }
-yy15:
- YYDEBUG(15, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == '=') goto yy74;
- goto yy9;
-yy16:
- YYDEBUG(16, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == '&') goto yy76;
- if (yych == '=') goto yy78;
- goto yy9;
-yy17:
- YYDEBUG(17, *YYCURSOR);
- ++YYCURSOR;
- YYDEBUG(18, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 2135 "Zend/zend_language_scanner.l"
- {
- register char *s, *t;
- char *end;
- int bprefix = (yytext[0] != '\'') ? 1 : 0;
-
- while (1) {
- if (YYCURSOR < YYLIMIT) {
- if (*YYCURSOR == '\'') {
- YYCURSOR++;
- yyleng = YYCURSOR - SCNG(yy_text);
-
- break;
- } else if (*YYCURSOR++ == '\\' && YYCURSOR < YYLIMIT) {
- YYCURSOR++;
- }
- } else {
- yyleng = YYLIMIT - SCNG(yy_text);
-
- /* Unclosed single quotes; treat similar to double quotes, but without a separate token
- * 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_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 = 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++;
- 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;
- s = Z_STRVAL_P(zendlval);
- // TODO: avoid reallocation ???
- SCNG(output_filter)((unsigned char **)&str, &sz, (unsigned char *)s, (size_t)Z_STRLEN_P(zendlval));
- ZVAL_STRINGL(zendlval, str, sz);
- }
- RETURN_TOKEN_WITH_VAL(T_CONSTANT_ENCAPSED_STRING);
-}
-#line 1707 "Zend/zend_language_scanner.c"
-yy19:
- YYDEBUG(19, *YYCURSOR);
- yyaccept = 0;
- yych = *(YYMARKER = ++YYCURSOR);
- if (yych <= 'S') {
- if (yych <= 'D') {
- if (yych <= ' ') {
- if (yych == '\t') goto yy81;
- if (yych <= 0x1F) goto yy9;
- goto yy81;
- } else {
- if (yych <= '@') goto yy9;
- if (yych == 'C') goto yy9;
- goto yy81;
- }
- } else {
- if (yych <= 'I') {
- if (yych == 'F') goto yy81;
- if (yych <= 'H') goto yy9;
- goto yy81;
- } else {
- if (yych == 'O') goto yy81;
- if (yych <= 'Q') goto yy9;
- goto yy81;
- }
- }
- } else {
- if (yych <= 'f') {
- if (yych <= 'b') {
- if (yych == 'U') goto yy81;
- if (yych <= '`') goto yy9;
- goto yy81;
- } else {
- if (yych == 'd') goto yy81;
- if (yych <= 'e') goto yy9;
- goto yy81;
- }
- } else {
- if (yych <= 'o') {
- if (yych == 'i') goto yy81;
- if (yych <= 'n') goto yy9;
- goto yy81;
- } else {
- if (yych <= 's') {
- if (yych <= 'q') goto yy9;
- goto yy81;
- } else {
- if (yych == 'u') goto yy81;
- goto yy9;
- }
- }
- }
- }
-yy20:
- YYDEBUG(20, *YYCURSOR);
- ++YYCURSOR;
- goto yy9;
-yy21:
- YYDEBUG(21, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == '*') goto yy92;
- if (yych == '=') goto yy94;
- goto yy9;
-yy22:
- YYDEBUG(22, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == '+') goto yy96;
- if (yych == '=') goto yy98;
- goto yy9;
-yy23:
- YYDEBUG(23, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych <= '<') {
- if (yych == '-') goto yy100;
- goto yy9;
- } else {
- if (yych <= '=') goto yy102;
- if (yych <= '>') goto yy104;
- goto yy9;
- }
-yy24:
- YYDEBUG(24, *YYCURSOR);
- yyaccept = 0;
- yych = *(YYMARKER = ++YYCURSOR);
- if (yych <= '/') {
- if (yych == '.') goto yy106;
- goto yy9;
- } else {
- if (yych <= '9') goto yy107;
- if (yych == '=') goto yy110;
- goto yy9;
- }
-yy25:
- YYDEBUG(25, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych <= '.') {
- if (yych == '*') goto yy112;
- goto yy9;
- } else {
- if (yych <= '/') goto yy12;
- if (yych == '=') goto yy114;
- goto yy9;
- }
-yy26:
- YYDEBUG(26, *YYCURSOR);
- yyaccept = 1;
- yych = *(YYMARKER = ++YYCURSOR);
- if (yych <= 'X') {
- if (yych == 'B') goto yy116;
- if (yych <= 'W') goto yy29;
- goto yy118;
- } else {
- if (yych <= 'b') {
- if (yych <= 'a') goto yy29;
- goto yy116;
- } else {
- if (yych == 'x') goto yy118;
- goto yy29;
- }
- }
-yy27:
- YYDEBUG(27, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1782 "Zend/zend_language_scanner.l"
- {
- char *end;
- if (yyleng < MAX_LENGTH_OF_LONG - 1) { /* Won't overflow */
- errno = 0;
- /* base must be passed explicitly for correct parse error on Windows */
- ZVAL_LONG(zendlval, ZEND_STRTOL(yytext, &end, yytext[0] == '0' ? 8 : 10));
- /* This isn't an assert, we need to ensure 019 isn't valid octal
- * Because the lexing itself doesn't do that for us
- */
- if (end != yytext + yyleng) {
- zend_throw_exception(zend_ce_parse_error, "Invalid numeric literal", 0);
- ZVAL_UNDEF(zendlval);
- if (PARSER_MODE()) {
- RETURN_TOKEN(T_ERROR);
- }
- RETURN_TOKEN_WITH_VAL(T_LNUMBER);
- }
- } else {
- errno = 0;
- ZVAL_LONG(zendlval, ZEND_STRTOL(yytext, &end, 0));
- if (errno == ERANGE) { /* Overflow */
- errno = 0;
- if (yytext[0] == '0') { /* octal overflow */
- ZVAL_DOUBLE(zendlval, zend_oct_strtod(yytext, (const char **)&end));
- } else {
- ZVAL_DOUBLE(zendlval, zend_strtod(yytext, (const char **)&end));
- }
- /* 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);
- if (PARSER_MODE()) {
- RETURN_TOKEN(T_ERROR);
- }
- }
- 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);
- if (PARSER_MODE()) {
- RETURN_TOKEN(T_ERROR);
- }
- RETURN_TOKEN_WITH_VAL(T_DNUMBER);
- }
- }
- ZEND_ASSERT(!errno);
- RETURN_TOKEN_WITH_VAL(T_LNUMBER);
-}
-#line 1883 "Zend/zend_language_scanner.c"
-yy28:
- YYDEBUG(28, *YYCURSOR);
- yyaccept = 1;
- YYMARKER = ++YYCURSOR;
- YYFILL(3);
- yych = *YYCURSOR;
-yy29:
- YYDEBUG(29, *YYCURSOR);
- if (yybm[0+yych] & 8) {
- goto yy28;
- }
- if (yych <= 'D') {
- if (yych == '.') goto yy107;
- goto yy27;
- } else {
- if (yych <= 'E') goto yy117;
- if (yych == 'e') goto yy117;
- goto yy27;
- }
-yy30:
- YYDEBUG(30, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == ':') goto yy119;
- goto yy9;
-yy31:
- YYDEBUG(31, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych <= ';') goto yy9;
- if (yych <= '<') goto yy121;
- if (yych <= '=') goto yy123;
- if (yych <= '>') goto yy125;
- goto yy9;
-yy32:
- YYDEBUG(32, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych <= '<') goto yy9;
- if (yych <= '=') goto yy126;
- if (yych <= '>') goto yy128;
- goto yy9;
-yy33:
- YYDEBUG(33, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych <= '<') goto yy9;
- if (yych <= '=') goto yy130;
- if (yych <= '>') goto yy132;
- goto yy9;
-yy34:
- YYDEBUG(34, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych <= '=') goto yy9;
- if (yych <= '>') goto yy134;
- if (yych <= '?') goto yy136;
- goto yy9;
-yy35:
- YYDEBUG(35, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych <= 'S') {
- if (yych <= 'M') {
- if (yych == 'B') goto yy138;
- goto yy44;
- } else {
- if (yych <= 'N') goto yy139;
- if (yych <= 'Q') goto yy44;
- if (yych <= 'R') goto yy140;
- goto yy141;
- }
- } else {
- if (yych <= 'n') {
- if (yych == 'b') goto yy138;
- if (yych <= 'm') goto yy44;
- goto yy139;
- } else {
- if (yych <= 'q') goto yy44;
- if (yych <= 'r') goto yy140;
- if (yych <= 's') goto yy141;
- goto yy44;
- }
- }
-yy36:
- YYDEBUG(36, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 2047 "Zend/zend_language_scanner.l"
- {
- RETURN_TOKEN_WITH_STR(T_STRING, 0);
-}
-#line 1969 "Zend/zend_language_scanner.c"
-yy37:
- YYDEBUG(37, *YYCURSOR);
- yyaccept = 2;
- yych = *(YYMARKER = ++YYCURSOR);
- if (yych <= ';') {
- if (yych <= '"') {
- if (yych <= '!') goto yy44;
- goto yy10;
- } else {
- if (yych == '\'') goto yy17;
- goto yy44;
- }
- } else {
- if (yych <= 'R') {
- if (yych <= '<') goto yy143;
- if (yych <= 'Q') goto yy44;
- goto yy144;
- } else {
- if (yych == 'r') goto yy144;
- goto yy44;
- }
- }
-yy38:
- YYDEBUG(38, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych <= 'O') {
- if (yych <= 'K') {
- if (yych == 'A') goto yy145;
- goto yy44;
- } else {
- if (yych <= 'L') goto yy146;
- if (yych <= 'N') goto yy44;
- goto yy147;
- }
- } else {
- if (yych <= 'k') {
- if (yych == 'a') goto yy145;
- goto yy44;
- } else {
- if (yych <= 'l') goto yy146;
- if (yych == 'o') goto yy147;
- goto yy44;
- }
- }
-yy39:
- YYDEBUG(39, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych <= 'O') {
- if (yych <= 'H') {
- if (yych == 'E') goto yy148;
- goto yy44;
- } else {
- if (yych <= 'I') goto yy149;
- if (yych <= 'N') goto yy44;
- goto yy150;
- }
- } else {
- if (yych <= 'h') {
- if (yych == 'e') goto yy148;
- goto yy44;
- } else {
- if (yych <= 'i') goto yy149;
- if (yych == 'o') goto yy150;
- goto yy44;
- }
- }
-yy40:
- YYDEBUG(40, *YYCURSOR);
- yych = *++YYCURSOR;
- switch (yych) {
- case 'C':
- case 'c': goto yy152;
- case 'L':
- case 'l': goto yy153;
- case 'M':
- case 'm': goto yy154;
- case 'N':
- case 'n': goto yy155;
- case 'V':
- case 'v': goto yy156;
- case 'X':
- case 'x': goto yy157;
- default: goto yy44;
- }
-yy41:
- YYDEBUG(41, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych <= 'U') {
- if (yych <= 'N') {
- if (yych == 'I') goto yy158;
- goto yy44;
- } else {
- if (yych <= 'O') goto yy159;
- if (yych <= 'T') goto yy44;
- goto yy160;
- }
- } else {
- if (yych <= 'n') {
- if (yych == 'i') goto yy158;
- goto yy44;
- } else {
- if (yych <= 'o') goto yy159;
- if (yych == 'u') goto yy160;
- goto yy44;
- }
- }
-yy42:
- YYDEBUG(42, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych <= 'O') {
- if (yych == 'L') goto yy161;
- if (yych <= 'N') goto yy44;
- goto yy162;
- } else {
- if (yych <= 'l') {
- if (yych <= 'k') goto yy44;
- goto yy161;
- } else {
- if (yych == 'o') goto yy162;
- goto yy44;
- }
- }
-yy43:
- YYDEBUG(43, *YYCURSOR);
- ++YYCURSOR;
- YYFILL(1);
- yych = *YYCURSOR;
-yy44:
- YYDEBUG(44, *YYCURSOR);
- if (yybm[0+yych] & 16) {
- goto yy43;
- }
- goto yy36;
-yy45:
- YYDEBUG(45, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych <= 'S') {
- if (yych <= 'L') {
- if (yych == 'F') goto yy163;
- goto yy44;
- } else {
- if (yych <= 'M') goto yy165;
- if (yych <= 'N') goto yy166;
- if (yych <= 'R') goto yy44;
- goto yy167;
- }
- } else {
- if (yych <= 'm') {
- if (yych == 'f') goto yy163;
- if (yych <= 'l') goto yy44;
- goto yy165;
- } else {
- if (yych <= 'n') goto yy166;
- if (yych == 's') goto yy167;
- goto yy44;
- }
- }
-yy46:
- YYDEBUG(46, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'I') goto yy168;
- if (yych == 'i') goto yy168;
- goto yy44;
-yy47:
- YYDEBUG(47, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych <= 'E') {
- if (yych == 'A') goto yy169;
- if (yych <= 'D') goto yy44;
- goto yy170;
- } else {
- if (yych <= 'a') {
- if (yych <= '`') goto yy44;
- goto yy169;
- } else {
- if (yych == 'e') goto yy170;
- goto yy44;
- }
- }
-yy48:
- YYDEBUG(48, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'R') goto yy171;
- if (yych == 'r') goto yy171;
- goto yy44;
-yy49:
- YYDEBUG(49, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych <= 'U') {
- if (yych == 'R') goto yy173;
- if (yych <= 'T') goto yy44;
- goto yy174;
- } else {
- if (yych <= 'r') {
- if (yych <= 'q') goto yy44;
- goto yy173;
- } else {
- if (yych == 'u') goto yy174;
- goto yy44;
- }
- }
-yy50:
- YYDEBUG(50, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'E') goto yy175;
- if (yych == 'e') goto yy175;
- goto yy44;
-yy51:
- YYDEBUG(51, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych <= 'W') {
- if (yych == 'T') goto yy176;
- if (yych <= 'V') goto yy44;
- goto yy177;
- } else {
- if (yych <= 't') {
- if (yych <= 's') goto yy44;
- goto yy176;
- } else {
- if (yych == 'w') goto yy177;
- goto yy44;
- }
- }
-yy52:
- YYDEBUG(52, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych <= 'R') {
- if (yych == 'H') goto yy178;
- if (yych <= 'Q') goto yy44;
- goto yy179;
- } else {
- if (yych <= 'h') {
- if (yych <= 'g') goto yy44;
- goto yy178;
- } else {
- if (yych == 'r') goto yy179;
- goto yy44;
- }
- }
-yy53:
- YYDEBUG(53, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych <= 'S') {
- if (yych == 'N') goto yy180;
- if (yych <= 'R') goto yy44;
- goto yy181;
- } else {
- if (yych <= 'n') {
- if (yych <= 'm') goto yy44;
- goto yy180;
- } else {
- if (yych == 's') goto yy181;
- goto yy44;
- }
- }
-yy54:
- YYDEBUG(54, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'A') goto yy182;
- if (yych == 'a') goto yy182;
- goto yy44;
-yy55:
- YYDEBUG(55, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'H') goto yy183;
- if (yych == 'h') goto yy183;
- goto yy44;
-yy56:
- YYDEBUG(56, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'O') goto yy184;
- if (yych == 'o') goto yy184;
- goto yy44;
-yy57:
- YYDEBUG(57, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'I') goto yy185;
- if (yych == 'i') goto yy185;
- goto yy44;
-yy58:
- YYDEBUG(58, *YYCURSOR);
- ++YYCURSOR;
- YYDEBUG(59, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1453 "Zend/zend_language_scanner.l"
- {
- RETURN_TOKEN(T_NS_SEPARATOR);
-}
-#line 2258 "Zend/zend_language_scanner.c"
-yy60:
- YYDEBUG(60, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == '=') goto yy186;
- goto yy9;
-yy61:
- YYDEBUG(61, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == '_') goto yy188;
- goto yy44;
-yy62:
- YYDEBUG(62, *YYCURSOR);
- ++YYCURSOR;
- YYDEBUG(63, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 2416 "Zend/zend_language_scanner.l"
- {
- BEGIN(ST_BACKQUOTE);
- RETURN_TOKEN('`');
-}
-#line 2279 "Zend/zend_language_scanner.c"
-yy64:
- YYDEBUG(64, *YYCURSOR);
- ++YYCURSOR;
- YYDEBUG(65, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1718 "Zend/zend_language_scanner.l"
- {
- yy_push_state(ST_IN_SCRIPTING);
- RETURN_TOKEN('{');
-}
-#line 2290 "Zend/zend_language_scanner.c"
-yy66:
- YYDEBUG(66, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == '=') goto yy189;
- if (yych == '|') goto yy191;
- goto yy9;
-yy67:
- YYDEBUG(67, *YYCURSOR);
- ++YYCURSOR;
- YYDEBUG(68, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1730 "Zend/zend_language_scanner.l"
- {
- RESET_DOC_COMMENT();
- if (!zend_stack_is_empty(&SCNG(state_stack))) {
- yy_pop_state();
- }
- RETURN_TOKEN('}');
-}
-#line 2310 "Zend/zend_language_scanner.c"
-yy69:
- YYDEBUG(69, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == '=') goto yy193;
-yy70:
- YYDEBUG(70, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1617 "Zend/zend_language_scanner.l"
- {
- RETURN_TOKEN(T_IS_NOT_EQUAL);
-}
-#line 2322 "Zend/zend_language_scanner.c"
-yy71:
- YYDEBUG(71, *YYCURSOR);
- ++YYCURSOR;
- YYFILL(1);
- yych = *YYCURSOR;
- YYDEBUG(72, *YYCURSOR);
- if (yych <= '^') {
- if (yych <= '9') {
- if (yych >= '0') goto yy71;
- } else {
- if (yych <= '@') goto yy73;
- if (yych <= 'Z') goto yy71;
- }
- } else {
- if (yych <= '`') {
- if (yych <= '_') goto yy71;
- } else {
- if (yych <= 'z') goto yy71;
- if (yych >= 0x80) goto yy71;
- }
- }
-yy73:
- YYDEBUG(73, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 2025 "Zend/zend_language_scanner.l"
- {
- RETURN_TOKEN_WITH_STR(T_VARIABLE, 1);
-}
-#line 2351 "Zend/zend_language_scanner.c"
-yy74:
- YYDEBUG(74, *YYCURSOR);
- ++YYCURSOR;
- YYDEBUG(75, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1661 "Zend/zend_language_scanner.l"
- {
- RETURN_TOKEN(T_MOD_EQUAL);
-}
-#line 2361 "Zend/zend_language_scanner.c"
-yy76:
- YYDEBUG(76, *YYCURSOR);
- ++YYCURSOR;
- YYDEBUG(77, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1689 "Zend/zend_language_scanner.l"
- {
- RETURN_TOKEN(T_BOOLEAN_AND);
-}
-#line 2371 "Zend/zend_language_scanner.c"
-yy78:
- YYDEBUG(78, *YYCURSOR);
- ++YYCURSOR;
- YYDEBUG(79, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1673 "Zend/zend_language_scanner.l"
- {
- RETURN_TOKEN(T_AND_EQUAL);
-}
-#line 2381 "Zend/zend_language_scanner.c"
-yy80:
- YYDEBUG(80, *YYCURSOR);
- ++YYCURSOR;
- YYFILL(7);
- yych = *YYCURSOR;
-yy81:
- YYDEBUG(81, *YYCURSOR);
- if (yybm[0+yych] & 32) {
- goto yy80;
- }
- switch (yych) {
- case 'A':
- case 'a': goto yy83;
- case 'B':
- case 'b': goto yy84;
- case 'D':
- case 'd': goto yy85;
- case 'F':
- case 'f': goto yy86;
- case 'I':
- case 'i': goto yy87;
- case 'O':
- case 'o': goto yy88;
- case 'R':
- case 'r': goto yy89;
- case 'S':
- case 's': goto yy90;
- case 'U':
- case 'u': goto yy91;
- default: goto yy82;
- }
-yy82:
- YYDEBUG(82, *YYCURSOR);
- YYCURSOR = YYMARKER;
- if (yyaccept <= 3) {
- if (yyaccept <= 1) {
- if (yyaccept == 0) {
- goto yy9;
- } else {
- goto yy27;
- }
- } else {
- if (yyaccept == 2) {
- goto yy36;
- } else {
- goto yy109;
- }
- }
- } else {
- if (yyaccept <= 5) {
- if (yyaccept == 4) {
- goto yy113;
- } else {
- goto yy122;
- }
- } else {
- goto yy457;
- }
- }
-yy83:
- YYDEBUG(83, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'R') goto yy195;
- if (yych == 'r') goto yy195;
- goto yy82;
-yy84:
- YYDEBUG(84, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych <= 'O') {
- if (yych == 'I') goto yy196;
- if (yych <= 'N') goto yy82;
- goto yy197;
- } else {
- if (yych <= 'i') {
- if (yych <= 'h') goto yy82;
- goto yy196;
- } else {
- if (yych == 'o') goto yy197;
- goto yy82;
- }
- }
-yy85:
- YYDEBUG(85, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'O') goto yy198;
- if (yych == 'o') goto yy198;
- goto yy82;
-yy86:
- YYDEBUG(86, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'L') goto yy199;
- if (yych == 'l') goto yy199;
- goto yy82;
-yy87:
- YYDEBUG(87, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'N') goto yy200;
- if (yych == 'n') goto yy200;
- goto yy82;
-yy88:
- YYDEBUG(88, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'B') goto yy201;
- if (yych == 'b') goto yy201;
- goto yy82;
-yy89:
- YYDEBUG(89, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'E') goto yy202;
- if (yych == 'e') goto yy202;
- goto yy82;
-yy90:
- YYDEBUG(90, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'T') goto yy203;
- if (yych == 't') goto yy203;
- goto yy82;
-yy91:
- YYDEBUG(91, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'N') goto yy204;
- if (yych == 'n') goto yy204;
- goto yy82;
-yy92:
- YYDEBUG(92, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == '=') goto yy205;
- YYDEBUG(93, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1645 "Zend/zend_language_scanner.l"
- {
- RETURN_TOKEN(T_POW);
-}
-#line 2515 "Zend/zend_language_scanner.c"
-yy94:
- YYDEBUG(94, *YYCURSOR);
- ++YYCURSOR;
- YYDEBUG(95, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1641 "Zend/zend_language_scanner.l"
- {
- RETURN_TOKEN(T_MUL_EQUAL);
-}
-#line 2525 "Zend/zend_language_scanner.c"
-yy96:
- YYDEBUG(96, *YYCURSOR);
- ++YYCURSOR;
- YYDEBUG(97, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1597 "Zend/zend_language_scanner.l"
- {
- RETURN_TOKEN(T_INC);
-}
-#line 2535 "Zend/zend_language_scanner.c"
-yy98:
- YYDEBUG(98, *YYCURSOR);
- ++YYCURSOR;
- YYDEBUG(99, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1633 "Zend/zend_language_scanner.l"
- {
- RETURN_TOKEN(T_PLUS_EQUAL);
-}
-#line 2545 "Zend/zend_language_scanner.c"
-yy100:
- YYDEBUG(100, *YYCURSOR);
- ++YYCURSOR;
- YYDEBUG(101, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1601 "Zend/zend_language_scanner.l"
- {
- RETURN_TOKEN(T_DEC);
-}
-#line 2555 "Zend/zend_language_scanner.c"
-yy102:
- YYDEBUG(102, *YYCURSOR);
- ++YYCURSOR;
- YYDEBUG(103, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1637 "Zend/zend_language_scanner.l"
- {
- RETURN_TOKEN(T_MINUS_EQUAL);
-}
-#line 2565 "Zend/zend_language_scanner.c"
-yy104:
- YYDEBUG(104, *YYCURSOR);
- ++YYCURSOR;
- YYDEBUG(105, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1425 "Zend/zend_language_scanner.l"
- {
- yy_push_state(ST_LOOKING_FOR_PROPERTY);
- RETURN_TOKEN(T_OBJECT_OPERATOR);
-}
-#line 2576 "Zend/zend_language_scanner.c"
-yy106:
- YYDEBUG(106, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == '.') goto yy207;
- goto yy82;
-yy107:
- YYDEBUG(107, *YYCURSOR);
- yyaccept = 3;
- YYMARKER = ++YYCURSOR;
- YYFILL(3);
- yych = *YYCURSOR;
- YYDEBUG(108, *YYCURSOR);
- if (yych <= 'D') {
- if (yych <= '/') goto yy109;
- if (yych <= '9') goto yy107;
- } else {
- if (yych <= 'E') goto yy117;
- if (yych == 'e') goto yy117;
- }
-yy109:
- YYDEBUG(109, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1887 "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_WITH_VAL(T_DNUMBER);
-}
-#line 2608 "Zend/zend_language_scanner.c"
-yy110:
- YYDEBUG(110, *YYCURSOR);
- ++YYCURSOR;
- YYDEBUG(111, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1657 "Zend/zend_language_scanner.l"
- {
- RETURN_TOKEN(T_CONCAT_EQUAL);
-}
-#line 2618 "Zend/zend_language_scanner.c"
-yy112:
- YYDEBUG(112, *YYCURSOR);
- yyaccept = 4;
- yych = *(YYMARKER = ++YYCURSOR);
- if (yych == '*') goto yy209;
-yy113:
- YYDEBUG(113, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 2084 "Zend/zend_language_scanner.l"
- {
- int doc_com;
-
- if (yyleng > 2) {
- doc_com = 1;
- RESET_DOC_COMMENT();
- } else {
- doc_com = 0;
- }
-
- while (YYCURSOR < YYLIMIT) {
- if (*YYCURSOR++ == '*' && *YYCURSOR == '/') {
- break;
- }
- }
-
- if (YYCURSOR < YYLIMIT) {
- YYCURSOR++;
- } else if (!SCNG(heredoc_scan_ahead)) {
- zend_error(E_COMPILE_WARNING, "Unterminated comment starting line %d", CG(zend_lineno));
- }
-
- yyleng = YYCURSOR - SCNG(yy_text);
- HANDLE_NEWLINES(yytext, yyleng);
-
- 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 2666 "Zend/zend_language_scanner.c"
-yy114:
- YYDEBUG(114, *YYCURSOR);
- ++YYCURSOR;
- YYDEBUG(115, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1653 "Zend/zend_language_scanner.l"
- {
- RETURN_TOKEN(T_DIV_EQUAL);
-}
-#line 2676 "Zend/zend_language_scanner.c"
-yy116:
- YYDEBUG(116, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yybm[0+yych] & 64) {
- goto yy210;
- }
- goto yy82;
-yy117:
- YYDEBUG(117, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych <= ',') {
- if (yych == '+') goto yy213;
- goto yy82;
- } else {
- if (yych <= '-') goto yy213;
- if (yych <= '/') goto yy82;
- if (yych <= '9') goto yy214;
- goto yy82;
- }
-yy118:
- YYDEBUG(118, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yybm[0+yych] & 128) {
- goto yy216;
- }
- goto yy82;
-yy119:
- YYDEBUG(119, *YYCURSOR);
- ++YYCURSOR;
- YYDEBUG(120, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1449 "Zend/zend_language_scanner.l"
- {
- RETURN_TOKEN(T_PAAMAYIM_NEKUDOTAYIM);
-}
-#line 2712 "Zend/zend_language_scanner.c"
-yy121:
- YYDEBUG(121, *YYCURSOR);
- yyaccept = 5;
- yych = *(YYMARKER = ++YYCURSOR);
- if (yych <= ';') goto yy122;
- if (yych <= '<') goto yy219;
- if (yych <= '=') goto yy221;
-yy122:
- YYDEBUG(122, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1705 "Zend/zend_language_scanner.l"
- {
- RETURN_TOKEN(T_SL);
-}
-#line 2727 "Zend/zend_language_scanner.c"
-yy123:
- YYDEBUG(123, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == '>') goto yy223;
- YYDEBUG(124, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1625 "Zend/zend_language_scanner.l"
- {
- RETURN_TOKEN(T_IS_SMALLER_OR_EQUAL);
-}
-#line 2738 "Zend/zend_language_scanner.c"
-yy125:
- YYDEBUG(125, *YYCURSOR);
- ++YYCURSOR;
- goto yy70;
-yy126:
- YYDEBUG(126, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == '=') goto yy225;
- YYDEBUG(127, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1613 "Zend/zend_language_scanner.l"
- {
- RETURN_TOKEN(T_IS_EQUAL);
-}
-#line 2753 "Zend/zend_language_scanner.c"
-yy128:
- YYDEBUG(128, *YYCURSOR);
- ++YYCURSOR;
- YYDEBUG(129, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1581 "Zend/zend_language_scanner.l"
- {
- RETURN_TOKEN(T_DOUBLE_ARROW);
-}
-#line 2763 "Zend/zend_language_scanner.c"
-yy130:
- YYDEBUG(130, *YYCURSOR);
- ++YYCURSOR;
- YYDEBUG(131, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1629 "Zend/zend_language_scanner.l"
- {
- RETURN_TOKEN(T_IS_GREATER_OR_EQUAL);
-}
-#line 2773 "Zend/zend_language_scanner.c"
-yy132:
- YYDEBUG(132, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == '=') goto yy227;
- YYDEBUG(133, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1709 "Zend/zend_language_scanner.l"
- {
- RETURN_TOKEN(T_SR);
-}
-#line 2784 "Zend/zend_language_scanner.c"
-yy134:
- YYDEBUG(134, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == '\n') goto yy229;
- if (yych == '\r') goto yy230;
-yy135:
- YYDEBUG(135, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 2123 "Zend/zend_language_scanner.l"
- {
- BEGIN(INITIAL);
- if (yytext[yyleng-1] != '>') {
- CG(increment_lineno) = 1;
- }
- if (PARSER_MODE()) {
- RETURN_TOKEN(';'); /* implicit ';' at php-end tag */
- }
- RETURN_TOKEN(T_CLOSE_TAG);
-}
-#line 2804 "Zend/zend_language_scanner.c"
-yy136:
- YYDEBUG(136, *YYCURSOR);
- ++YYCURSOR;
- YYDEBUG(137, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1461 "Zend/zend_language_scanner.l"
- {
- RETURN_TOKEN(T_COALESCE);
-}
-#line 2814 "Zend/zend_language_scanner.c"
-yy138:
- YYDEBUG(138, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'S') goto yy231;
- if (yych == 's') goto yy231;
- goto yy44;
-yy139:
- YYDEBUG(139, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'D') goto yy232;
- if (yych == 'd') goto yy232;
- goto yy44;
-yy140:
- YYDEBUG(140, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'R') goto yy234;
- if (yych == 'r') goto yy234;
- goto yy44;
-yy141:
- YYDEBUG(141, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yybm[0+yych] & 16) {
- goto yy43;
- }
- YYDEBUG(142, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1365 "Zend/zend_language_scanner.l"
- {
- RETURN_TOKEN(T_AS);
-}
-#line 2845 "Zend/zend_language_scanner.c"
-yy143:
- YYDEBUG(143, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == '<') goto yy235;
- goto yy82;
-yy144:
- YYDEBUG(144, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'E') goto yy236;
- if (yych == 'e') goto yy236;
- goto yy44;
-yy145:
- YYDEBUG(145, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych <= 'T') {
- if (yych <= 'L') {
- if (yych <= 'K') goto yy44;
- goto yy237;
- } else {
- if (yych <= 'R') goto yy44;
- if (yych <= 'S') goto yy238;
- goto yy239;
- }
- } else {
- if (yych <= 'r') {
- if (yych == 'l') goto yy237;
- goto yy44;
- } else {
- if (yych <= 's') goto yy238;
- if (yych <= 't') goto yy239;
- goto yy44;
- }
- }
-yy146:
- YYDEBUG(146, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych <= 'O') {
- if (yych == 'A') goto yy240;
- if (yych <= 'N') goto yy44;
- goto yy241;
- } else {
- if (yych <= 'a') {
- if (yych <= '`') goto yy44;
- goto yy240;
- } else {
- if (yych == 'o') goto yy241;
- goto yy44;
- }
- }
-yy147:
- YYDEBUG(147, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'N') goto yy242;
- if (yych == 'n') goto yy242;
- goto yy44;
-yy148:
- YYDEBUG(148, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych <= 'F') {
- if (yych == 'C') goto yy243;
- if (yych <= 'E') goto yy44;
- goto yy244;
- } else {
- if (yych <= 'c') {
- if (yych <= 'b') goto yy44;
- goto yy243;
- } else {
- if (yych == 'f') goto yy244;
- goto yy44;
- }
- }
-yy149:
- YYDEBUG(149, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'E') goto yy245;
- if (yych == 'e') goto yy245;
- goto yy44;
-yy150:
- YYDEBUG(150, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yybm[0+yych] & 16) {
- goto yy43;
- }
- YYDEBUG(151, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1333 "Zend/zend_language_scanner.l"
- {
- RETURN_TOKEN(T_DO);
-}
-#line 2935 "Zend/zend_language_scanner.c"
-yy152:
- YYDEBUG(152, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'H') goto yy247;
- if (yych == 'h') goto yy247;
- goto yy44;
-yy153:
- YYDEBUG(153, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'S') goto yy248;
- if (yych == 's') goto yy248;
- goto yy44;
-yy154:
- YYDEBUG(154, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'P') goto yy249;
- if (yych == 'p') goto yy249;
- goto yy44;
-yy155:
- YYDEBUG(155, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'D') goto yy250;
- if (yych == 'd') goto yy250;
- goto yy44;
-yy156:
- YYDEBUG(156, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'A') goto yy251;
- if (yych == 'a') goto yy251;
- goto yy44;
-yy157:
- YYDEBUG(157, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych <= 'T') {
- if (yych == 'I') goto yy252;
- if (yych <= 'S') goto yy44;
- goto yy253;
- } else {
- if (yych <= 'i') {
- if (yych <= 'h') goto yy44;
- goto yy252;
- } else {
- if (yych == 't') goto yy253;
- goto yy44;
- }
- }
-yy158:
- YYDEBUG(158, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'N') goto yy254;
- if (yych == 'n') goto yy254;
- goto yy44;
-yy159:
- YYDEBUG(159, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'R') goto yy255;
- if (yych == 'r') goto yy255;
- goto yy44;
-yy160:
- YYDEBUG(160, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'N') goto yy257;
- if (yych == 'n') goto yy257;
- goto yy44;
-yy161:
- YYDEBUG(161, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'O') goto yy258;
- if (yych == 'o') goto yy258;
- goto yy44;
-yy162:
- YYDEBUG(162, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'T') goto yy259;
- if (yych == 't') goto yy259;
- goto yy44;
-yy163:
- YYDEBUG(163, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yybm[0+yych] & 16) {
- goto yy43;
- }
- YYDEBUG(164, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1309 "Zend/zend_language_scanner.l"
- {
- RETURN_TOKEN(T_IF);
-}
-#line 3024 "Zend/zend_language_scanner.c"
-yy165:
- YYDEBUG(165, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'P') goto yy260;
- if (yych == 'p') goto yy260;
- goto yy44;
-yy166:
- YYDEBUG(166, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych <= 'T') {
- if (yych <= 'C') {
- if (yych <= 'B') goto yy44;
- goto yy261;
- } else {
- if (yych <= 'R') goto yy44;
- if (yych <= 'S') goto yy262;
- goto yy263;
- }
- } else {
- if (yych <= 'r') {
- if (yych == 'c') goto yy261;
- goto yy44;
- } else {
- if (yych <= 's') goto yy262;
- if (yych <= 't') goto yy263;
- goto yy44;
- }
- }
-yy167:
- YYDEBUG(167, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'S') goto yy264;
- if (yych == 's') goto yy264;
- goto yy44;
-yy168:
- YYDEBUG(168, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'S') goto yy265;
- if (yych == 's') goto yy265;
- goto yy44;
-yy169:
- YYDEBUG(169, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'M') goto yy266;
- if (yych == 'm') goto yy266;
- goto yy44;
-yy170:
- YYDEBUG(170, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'W') goto yy267;
- if (yych == 'w') goto yy267;
- goto yy44;
-yy171:
- YYDEBUG(171, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yybm[0+yych] & 16) {
- goto yy43;
- }
- YYDEBUG(172, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1693 "Zend/zend_language_scanner.l"
- {
- RETURN_TOKEN(T_LOGICAL_OR);
-}
-#line 3089 "Zend/zend_language_scanner.c"
-yy173:
- YYDEBUG(173, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych <= 'O') {
- if (yych == 'I') goto yy269;
- if (yych <= 'N') goto yy44;
- goto yy270;
- } else {
- if (yych <= 'i') {
- if (yych <= 'h') goto yy44;
- goto yy269;
- } else {
- if (yych == 'o') goto yy270;
- goto yy44;
- }
- }
-yy174:
- YYDEBUG(174, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'B') goto yy271;
- if (yych == 'b') goto yy271;
- goto yy44;
-yy175:
- YYDEBUG(175, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych <= 'T') {
- if (yych == 'Q') goto yy272;
- if (yych <= 'S') goto yy44;
- goto yy273;
- } else {
- if (yych <= 'q') {
- if (yych <= 'p') goto yy44;
- goto yy272;
- } else {
- if (yych == 't') goto yy273;
- goto yy44;
- }
- }
-yy176:
- YYDEBUG(176, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'A') goto yy274;
- if (yych == 'a') goto yy274;
- goto yy44;
-yy177:
- YYDEBUG(177, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'I') goto yy275;
- if (yych == 'i') goto yy275;
- goto yy44;
-yy178:
- YYDEBUG(178, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'R') goto yy276;
- if (yych == 'r') goto yy276;
- goto yy44;
-yy179:
- YYDEBUG(179, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych <= 'Y') {
- if (yych == 'A') goto yy277;
- if (yych <= 'X') goto yy44;
- goto yy278;
- } else {
- if (yych <= 'a') {
- if (yych <= '`') goto yy44;
- goto yy277;
- } else {
- if (yych == 'y') goto yy278;
- goto yy44;
- }
- }
-yy180:
- YYDEBUG(180, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'S') goto yy280;
- if (yych == 's') goto yy280;
- goto yy44;
-yy181:
- YYDEBUG(181, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'E') goto yy281;
- if (yych == 'e') goto yy281;
- goto yy44;
-yy182:
- YYDEBUG(182, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'R') goto yy283;
- if (yych == 'r') goto yy283;
- goto yy44;
-yy183:
- YYDEBUG(183, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'I') goto yy285;
- if (yych == 'i') goto yy285;
- goto yy44;
-yy184:
- YYDEBUG(184, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'R') goto yy286;
- if (yych == 'r') goto yy286;
- goto yy44;
-yy185:
- YYDEBUG(185, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'E') goto yy288;
- if (yych == 'e') goto yy288;
- goto yy44;
-yy186:
- YYDEBUG(186, *YYCURSOR);
- ++YYCURSOR;
- YYDEBUG(187, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1681 "Zend/zend_language_scanner.l"
- {
- RETURN_TOKEN(T_XOR_EQUAL);
-}
-#line 3207 "Zend/zend_language_scanner.c"
-yy188:
- YYDEBUG(188, *YYCURSOR);
- yych = *++YYCURSOR;
- switch (yych) {
- case 'C':
- case 'c': goto yy289;
- case 'D':
- case 'd': goto yy290;
- case 'F':
- case 'f': goto yy291;
- case 'H':
- case 'h': goto yy292;
- case 'L':
- case 'l': goto yy293;
- case 'M':
- case 'm': goto yy294;
- case 'N':
- case 'n': goto yy295;
- case 'T':
- case 't': goto yy296;
- default: goto yy44;
- }
-yy189:
- YYDEBUG(189, *YYCURSOR);
- ++YYCURSOR;
- YYDEBUG(190, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1677 "Zend/zend_language_scanner.l"
- {
- RETURN_TOKEN(T_OR_EQUAL);
-}
-#line 3239 "Zend/zend_language_scanner.c"
-yy191:
- YYDEBUG(191, *YYCURSOR);
- ++YYCURSOR;
- YYDEBUG(192, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1685 "Zend/zend_language_scanner.l"
- {
- RETURN_TOKEN(T_BOOLEAN_OR);
-}
-#line 3249 "Zend/zend_language_scanner.c"
-yy193:
- YYDEBUG(193, *YYCURSOR);
- ++YYCURSOR;
- YYDEBUG(194, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1609 "Zend/zend_language_scanner.l"
- {
- RETURN_TOKEN(T_IS_NOT_IDENTICAL);
-}
-#line 3259 "Zend/zend_language_scanner.c"
-yy195:
- YYDEBUG(195, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'R') goto yy297;
- if (yych == 'r') goto yy297;
- goto yy82;
-yy196:
- YYDEBUG(196, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'N') goto yy298;
- if (yych == 'n') goto yy298;
- goto yy82;
-yy197:
- YYDEBUG(197, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'O') goto yy299;
- if (yych == 'o') goto yy299;
- goto yy82;
-yy198:
- YYDEBUG(198, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'U') goto yy300;
- if (yych == 'u') goto yy300;
- goto yy82;
-yy199:
- YYDEBUG(199, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'O') goto yy301;
- if (yych == 'o') goto yy301;
- goto yy82;
-yy200:
- YYDEBUG(200, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'T') goto yy302;
- if (yych == 't') goto yy302;
- goto yy82;
-yy201:
- YYDEBUG(201, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'J') goto yy303;
- if (yych == 'j') goto yy303;
- goto yy82;
-yy202:
- YYDEBUG(202, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'A') goto yy304;
- if (yych == 'a') goto yy304;
- goto yy82;
-yy203:
- YYDEBUG(203, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'R') goto yy305;
- if (yych == 'r') goto yy305;
- goto yy82;
-yy204:
- YYDEBUG(204, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'S') goto yy306;
- if (yych == 's') goto yy306;
- goto yy82;
-yy205:
- YYDEBUG(205, *YYCURSOR);
- ++YYCURSOR;
- YYDEBUG(206, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1649 "Zend/zend_language_scanner.l"
- {
- RETURN_TOKEN(T_POW_EQUAL);
-}
-#line 3329 "Zend/zend_language_scanner.c"
-yy207:
- YYDEBUG(207, *YYCURSOR);
- ++YYCURSOR;
- YYDEBUG(208, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1457 "Zend/zend_language_scanner.l"
- {
- RETURN_TOKEN(T_ELLIPSIS);
-}
-#line 3339 "Zend/zend_language_scanner.c"
-yy209:
- YYDEBUG(209, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych <= '\f') {
- if (yych <= 0x08) goto yy82;
- if (yych <= '\n') goto yy307;
- goto yy82;
- } else {
- if (yych <= '\r') goto yy307;
- if (yych == ' ') goto yy307;
- goto yy82;
- }
-yy210:
- YYDEBUG(210, *YYCURSOR);
- ++YYCURSOR;
- YYFILL(1);
- yych = *YYCURSOR;
- YYDEBUG(211, *YYCURSOR);
- if (yybm[0+yych] & 64) {
- goto yy210;
- }
- YYDEBUG(212, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1754 "Zend/zend_language_scanner.l"
- {
- char *bin = yytext + 2; /* Skip "0b" */
- int len = yyleng - 2;
- char *end;
-
- /* Skip any leading 0s */
- while (*bin == '0') {
- ++bin;
- --len;
- }
-
- if (len < SIZEOF_ZEND_LONG * 8) {
- if (len == 0) {
- ZVAL_LONG(zendlval, 0);
- } else {
- errno = 0;
- ZVAL_LONG(zendlval, ZEND_STRTOL(bin, &end, 2));
- ZEND_ASSERT(!errno && end == yytext + yyleng);
- }
- 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_WITH_VAL(T_DNUMBER);
- }
-}
-#line 3391 "Zend/zend_language_scanner.c"
-yy213:
- YYDEBUG(213, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych <= '/') goto yy82;
- if (yych >= ':') goto yy82;
-yy214:
- YYDEBUG(214, *YYCURSOR);
- ++YYCURSOR;
- YYFILL(1);
- yych = *YYCURSOR;
- YYDEBUG(215, *YYCURSOR);
- if (yych <= '/') goto yy109;
- if (yych <= '9') goto yy214;
- goto yy109;
-yy216:
- YYDEBUG(216, *YYCURSOR);
- ++YYCURSOR;
- YYFILL(1);
- yych = *YYCURSOR;
- YYDEBUG(217, *YYCURSOR);
- if (yybm[0+yych] & 128) {
- goto yy216;
- }
- YYDEBUG(218, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1834 "Zend/zend_language_scanner.l"
- {
- char *hex = yytext + 2; /* Skip "0x" */
- int len = yyleng - 2;
- char *end;
-
- /* Skip any leading 0s */
- while (*hex == '0') {
- hex++;
- len--;
- }
-
- if (len < SIZEOF_ZEND_LONG * 2 || (len == SIZEOF_ZEND_LONG * 2 && *hex <= '7')) {
- if (len == 0) {
- ZVAL_LONG(zendlval, 0);
- } else {
- errno = 0;
- ZVAL_LONG(zendlval, ZEND_STRTOL(hex, &end, 16));
- ZEND_ASSERT(!errno && end == hex + len);
- }
- 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_WITH_VAL(T_DNUMBER);
- }
-}
-#line 3445 "Zend/zend_language_scanner.c"
-yy219:
- YYDEBUG(219, *YYCURSOR);
- ++YYCURSOR;
- YYFILL(2);
- yych = *YYCURSOR;
- YYDEBUG(220, *YYCURSOR);
- if (yych <= '\'') {
- if (yych <= ' ') {
- if (yych == '\t') goto yy219;
- if (yych <= 0x1F) goto yy82;
- goto yy219;
- } else {
- if (yych == '"') goto yy309;
- if (yych <= '&') goto yy82;
- goto yy310;
- }
- } else {
- if (yych <= '_') {
- if (yych <= '@') goto yy82;
- if (yych <= 'Z') goto yy311;
- if (yych <= '^') goto yy82;
- goto yy311;
- } else {
- if (yych <= '`') goto yy82;
- if (yych <= 'z') goto yy311;
- if (yych <= 0x7F) goto yy82;
- goto yy311;
- }
- }
-yy221:
- YYDEBUG(221, *YYCURSOR);
- ++YYCURSOR;
- YYDEBUG(222, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1665 "Zend/zend_language_scanner.l"
- {
- RETURN_TOKEN(T_SL_EQUAL);
-}
-#line 3484 "Zend/zend_language_scanner.c"
-yy223:
- YYDEBUG(223, *YYCURSOR);
- ++YYCURSOR;
- YYDEBUG(224, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1621 "Zend/zend_language_scanner.l"
- {
- RETURN_TOKEN(T_SPACESHIP);
-}
-#line 3494 "Zend/zend_language_scanner.c"
-yy225:
- YYDEBUG(225, *YYCURSOR);
- ++YYCURSOR;
- YYDEBUG(226, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1605 "Zend/zend_language_scanner.l"
- {
- RETURN_TOKEN(T_IS_IDENTICAL);
-}
-#line 3504 "Zend/zend_language_scanner.c"
-yy227:
- YYDEBUG(227, *YYCURSOR);
- ++YYCURSOR;
- YYDEBUG(228, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1669 "Zend/zend_language_scanner.l"
- {
- RETURN_TOKEN(T_SR_EQUAL);
-}
-#line 3514 "Zend/zend_language_scanner.c"
-yy229:
- YYDEBUG(229, *YYCURSOR);
- ++YYCURSOR;
- goto yy135;
-yy230:
- YYDEBUG(230, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == '\n') goto yy229;
- goto yy135;
-yy231:
- YYDEBUG(231, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'T') goto yy313;
- if (yych == 't') goto yy313;
- goto yy44;
-yy232:
- YYDEBUG(232, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yybm[0+yych] & 16) {
- goto yy43;
- }
- YYDEBUG(233, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1697 "Zend/zend_language_scanner.l"
- {
- RETURN_TOKEN(T_LOGICAL_AND);
-}
-#line 3542 "Zend/zend_language_scanner.c"
-yy234:
- YYDEBUG(234, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'A') goto yy314;
- if (yych == 'a') goto yy314;
- goto yy44;
-yy235:
- YYDEBUG(235, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == '<') goto yy219;
- goto yy82;
-yy236:
- YYDEBUG(236, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'A') goto yy315;
- if (yych == 'a') goto yy315;
- goto yy44;
-yy237:
- YYDEBUG(237, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'L') goto yy316;
- if (yych == 'l') goto yy316;
- goto yy44;
-yy238:
- YYDEBUG(238, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'E') goto yy317;
- if (yych == 'e') goto yy317;
- goto yy44;
-yy239:
- YYDEBUG(239, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'C') goto yy319;
- if (yych == 'c') goto yy319;
- goto yy44;
-yy240:
- YYDEBUG(240, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'S') goto yy320;
- if (yych == 's') goto yy320;
- goto yy44;
-yy241:
- YYDEBUG(241, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'N') goto yy321;
- if (yych == 'n') goto yy321;
- goto yy44;
-yy242:
- YYDEBUG(242, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych <= 'T') {
- if (yych <= 'R') goto yy44;
- if (yych <= 'S') goto yy322;
- goto yy323;
- } else {
- if (yych <= 'r') goto yy44;
- if (yych <= 's') goto yy322;
- if (yych <= 't') goto yy323;
- goto yy44;
- }
-yy243:
- YYDEBUG(243, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'L') goto yy324;
- if (yych == 'l') goto yy324;
- goto yy44;
-yy244:
- YYDEBUG(244, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'A') goto yy325;
- if (yych == 'a') goto yy325;
- goto yy44;
-yy245:
- YYDEBUG(245, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yybm[0+yych] & 16) {
- goto yy43;
- }
- YYDEBUG(246, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1267 "Zend/zend_language_scanner.l"
- {
- RETURN_TOKEN(T_EXIT);
-}
-#line 3627 "Zend/zend_language_scanner.c"
-yy247:
- YYDEBUG(247, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'O') goto yy326;
- if (yych == 'o') goto yy326;
- goto yy44;
-yy248:
- YYDEBUG(248, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'E') goto yy328;
- if (yych == 'e') goto yy328;
- goto yy44;
-yy249:
- YYDEBUG(249, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'T') goto yy330;
- if (yych == 't') goto yy330;
- goto yy44;
-yy250:
- YYDEBUG(250, *YYCURSOR);
- yych = *++YYCURSOR;
- switch (yych) {
- case 'D':
- case 'd': goto yy331;
- case 'F':
- case 'f': goto yy332;
- case 'I':
- case 'i': goto yy333;
- case 'S':
- case 's': goto yy334;
- case 'W':
- case 'w': goto yy335;
- default: goto yy44;
- }
-yy251:
- YYDEBUG(251, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'L') goto yy336;
- if (yych == 'l') goto yy336;
- goto yy44;
-yy252:
- YYDEBUG(252, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'T') goto yy338;
- if (yych == 't') goto yy338;
- goto yy44;
-yy253:
- YYDEBUG(253, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'E') goto yy340;
- if (yych == 'e') goto yy340;
- goto yy44;
-yy254:
- YYDEBUG(254, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'A') goto yy341;
- if (yych == 'a') goto yy341;
- goto yy44;
-yy255:
- YYDEBUG(255, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych <= '^') {
- if (yych <= '@') {
- if (yych <= '/') goto yy256;
- if (yych <= '9') goto yy43;
- } else {
- if (yych == 'E') goto yy342;
- if (yych <= 'Z') goto yy43;
- }
- } else {
- if (yych <= 'd') {
- if (yych != '`') goto yy43;
- } else {
- if (yych <= 'e') goto yy342;
- if (yych <= 'z') goto yy43;
- if (yych >= 0x80) goto yy43;
- }
- }
-yy256:
- YYDEBUG(256, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1337 "Zend/zend_language_scanner.l"
- {
- RETURN_TOKEN(T_FOR);
-}
-#line 3713 "Zend/zend_language_scanner.c"
-yy257:
- YYDEBUG(257, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'C') goto yy343;
- if (yych == 'c') goto yy343;
- goto yy44;
-yy258:
- YYDEBUG(258, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'B') goto yy344;
- if (yych == 'b') goto yy344;
- goto yy44;
-yy259:
- YYDEBUG(259, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'O') goto yy345;
- if (yych == 'o') goto yy345;
- goto yy44;
-yy260:
- YYDEBUG(260, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'L') goto yy347;
- if (yych == 'l') goto yy347;
- goto yy44;
-yy261:
- YYDEBUG(261, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'L') goto yy348;
- if (yych == 'l') goto yy348;
- goto yy44;
-yy262:
- YYDEBUG(262, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'T') goto yy349;
- if (yych == 't') goto yy349;
- goto yy44;
-yy263:
- YYDEBUG(263, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'E') goto yy350;
- if (yych == 'e') goto yy350;
- goto yy44;
-yy264:
- YYDEBUG(264, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'E') goto yy351;
- if (yych == 'e') goto yy351;
- goto yy44;
-yy265:
- YYDEBUG(265, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'T') goto yy352;
- if (yych == 't') goto yy352;
- goto yy44;
-yy266:
- YYDEBUG(266, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'E') goto yy354;
- if (yych == 'e') goto yy354;
- goto yy44;
-yy267:
- YYDEBUG(267, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yybm[0+yych] & 16) {
- goto yy43;
- }
- YYDEBUG(268, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1465 "Zend/zend_language_scanner.l"
- {
- RETURN_TOKEN(T_NEW);
-}
-#line 3786 "Zend/zend_language_scanner.c"
-yy269:
- YYDEBUG(269, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych <= 'V') {
- if (yych == 'N') goto yy355;
- if (yych <= 'U') goto yy44;
- goto yy356;
- } else {
- if (yych <= 'n') {
- if (yych <= 'm') goto yy44;
- goto yy355;
- } else {
- if (yych == 'v') goto yy356;
- goto yy44;
- }
- }
-yy270:
- YYDEBUG(270, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'T') goto yy357;
- if (yych == 't') goto yy357;
- goto yy44;
-yy271:
- YYDEBUG(271, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'L') goto yy358;
- if (yych == 'l') goto yy358;
- goto yy44;
-yy272:
- YYDEBUG(272, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'U') goto yy359;
- if (yych == 'u') goto yy359;
- goto yy44;
-yy273:
- YYDEBUG(273, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'U') goto yy360;
- if (yych == 'u') goto yy360;
- goto yy44;
-yy274:
- YYDEBUG(274, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'T') goto yy361;
- if (yych == 't') goto yy361;
- goto yy44;
-yy275:
- YYDEBUG(275, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'T') goto yy362;
- if (yych == 't') goto yy362;
- goto yy44;
-yy276:
- YYDEBUG(276, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'O') goto yy363;
- if (yych == 'o') goto yy363;
- goto yy44;
-yy277:
- YYDEBUG(277, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'I') goto yy364;
- if (yych == 'i') goto yy364;
- goto yy44;
-yy278:
- YYDEBUG(278, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yybm[0+yych] & 16) {
- goto yy43;
- }
- YYDEBUG(279, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1293 "Zend/zend_language_scanner.l"
- {
- RETURN_TOKEN(T_TRY);
-}
-#line 3863 "Zend/zend_language_scanner.c"
-yy280:
- YYDEBUG(280, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'E') goto yy365;
- if (yych == 'e') goto yy365;
- goto yy44;
-yy281:
- YYDEBUG(281, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yybm[0+yych] & 16) {
- goto yy43;
- }
- YYDEBUG(282, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1529 "Zend/zend_language_scanner.l"
- {
- RETURN_TOKEN(T_USE);
-}
-#line 3882 "Zend/zend_language_scanner.c"
-yy283:
- YYDEBUG(283, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yybm[0+yych] & 16) {
- goto yy43;
- }
- YYDEBUG(284, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1473 "Zend/zend_language_scanner.l"
- {
- RETURN_TOKEN(T_VAR);
-}
-#line 3895 "Zend/zend_language_scanner.c"
-yy285:
- YYDEBUG(285, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'L') goto yy366;
- if (yych == 'l') goto yy366;
- goto yy44;
-yy286:
- YYDEBUG(286, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yybm[0+yych] & 16) {
- goto yy43;
- }
- YYDEBUG(287, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1701 "Zend/zend_language_scanner.l"
- {
- RETURN_TOKEN(T_LOGICAL_XOR);
-}
-#line 3914 "Zend/zend_language_scanner.c"
-yy288:
- YYDEBUG(288, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'L') goto yy367;
- if (yych == 'l') goto yy367;
- goto yy44;
-yy289:
- YYDEBUG(289, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'L') goto yy368;
- if (yych == 'l') goto yy368;
- goto yy44;
-yy290:
- YYDEBUG(290, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'I') goto yy369;
- if (yych == 'i') goto yy369;
- goto yy44;
-yy291:
- YYDEBUG(291, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych <= 'U') {
- if (yych == 'I') goto yy370;
- if (yych <= 'T') goto yy44;
- goto yy371;
- } else {
- if (yych <= 'i') {
- if (yych <= 'h') goto yy44;
- goto yy370;
- } else {
- if (yych == 'u') goto yy371;
- goto yy44;
- }
- }
-yy292:
- YYDEBUG(292, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'A') goto yy372;
- if (yych == 'a') goto yy372;
- goto yy44;
-yy293:
- YYDEBUG(293, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'I') goto yy373;
- if (yych == 'i') goto yy373;
- goto yy44;
-yy294:
- YYDEBUG(294, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'E') goto yy374;
- if (yych == 'e') goto yy374;
- goto yy44;
-yy295:
- YYDEBUG(295, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'A') goto yy375;
- if (yych == 'a') goto yy375;
- goto yy44;
-yy296:
- YYDEBUG(296, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'R') goto yy376;
- if (yych == 'r') goto yy376;
- goto yy44;
-yy297:
- YYDEBUG(297, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'A') goto yy377;
- if (yych == 'a') goto yy377;
- goto yy82;
-yy298:
- YYDEBUG(298, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'A') goto yy378;
- if (yych == 'a') goto yy378;
- goto yy82;
-yy299:
- YYDEBUG(299, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'L') goto yy379;
- if (yych == 'l') goto yy379;
- goto yy82;
-yy300:
- YYDEBUG(300, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'B') goto yy380;
- if (yych == 'b') goto yy380;
- goto yy82;
-yy301:
- YYDEBUG(301, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'A') goto yy381;
- if (yych == 'a') goto yy381;
- goto yy82;
-yy302:
- YYDEBUG(302, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'E') goto yy386;
- if (yych == 'e') goto yy386;
- goto yy383;
-yy303:
- YYDEBUG(303, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'E') goto yy387;
- if (yych == 'e') goto yy387;
- goto yy82;
-yy304:
- YYDEBUG(304, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'L') goto yy388;
- if (yych == 'l') goto yy388;
- goto yy82;
-yy305:
- YYDEBUG(305, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'I') goto yy390;
- if (yych == 'i') goto yy390;
- goto yy82;
-yy306:
- YYDEBUG(306, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'E') goto yy391;
- if (yych == 'e') goto yy391;
- goto yy82;
-yy307:
- YYDEBUG(307, *YYCURSOR);
- ++YYCURSOR;
- YYFILL(1);
- yych = *YYCURSOR;
- YYDEBUG(308, *YYCURSOR);
- if (yych <= '\f') {
- if (yych <= 0x08) goto yy113;
- if (yych <= '\n') goto yy307;
- goto yy113;
- } else {
- if (yych <= '\r') goto yy307;
- if (yych == ' ') goto yy307;
- goto yy113;
- }
-yy309:
- YYDEBUG(309, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == '"') goto yy82;
- if (yych <= '/') goto yy393;
- if (yych <= '9') goto yy82;
- goto yy393;
-yy310:
- YYDEBUG(310, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == '\'') goto yy82;
- if (yych <= '/') goto yy395;
- if (yych <= '9') goto yy82;
- goto yy395;
-yy311:
- YYDEBUG(311, *YYCURSOR);
- ++YYCURSOR;
- YYFILL(2);
- yych = *YYCURSOR;
- YYDEBUG(312, *YYCURSOR);
- if (yych <= '@') {
- if (yych <= '\f') {
- if (yych == '\n') goto yy396;
- goto yy82;
- } else {
- if (yych <= '\r') goto yy398;
- if (yych <= '/') goto yy82;
- if (yych <= '9') goto yy311;
- goto yy82;
- }
- } else {
- if (yych <= '_') {
- if (yych <= 'Z') goto yy311;
- if (yych <= '^') goto yy82;
- goto yy311;
- } else {
- if (yych <= '`') goto yy82;
- if (yych <= 'z') goto yy311;
- if (yych <= 0x7F) goto yy82;
- goto yy311;
- }
- }
-yy313:
- YYDEBUG(313, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'R') goto yy399;
- if (yych == 'r') goto yy399;
- goto yy44;
-yy314:
- YYDEBUG(314, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'Y') goto yy400;
- if (yych == 'y') goto yy400;
- goto yy44;
-yy315:
- YYDEBUG(315, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'K') goto yy402;
- if (yych == 'k') goto yy402;
- goto yy44;
-yy316:
- YYDEBUG(316, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'A') goto yy404;
- if (yych == 'a') goto yy404;
- goto yy44;
-yy317:
- YYDEBUG(317, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yybm[0+yych] & 16) {
- goto yy43;
- }
- YYDEBUG(318, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1377 "Zend/zend_language_scanner.l"
- {
- RETURN_TOKEN(T_CASE);
-}
-#line 4132 "Zend/zend_language_scanner.c"
-yy319:
- YYDEBUG(319, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'H') goto yy405;
- if (yych == 'h') goto yy405;
- goto yy44;
-yy320:
- YYDEBUG(320, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'S') goto yy407;
- if (yych == 's') goto yy407;
- goto yy44;
-yy321:
- YYDEBUG(321, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'E') goto yy409;
- if (yych == 'e') goto yy409;
- goto yy44;
-yy322:
- YYDEBUG(322, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'T') goto yy411;
- if (yych == 't') goto yy411;
- goto yy44;
-yy323:
- YYDEBUG(323, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'I') goto yy413;
- if (yych == 'i') goto yy413;
- goto yy44;
-yy324:
- YYDEBUG(324, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'A') goto yy414;
- if (yych == 'a') goto yy414;
- goto yy44;
-yy325:
- YYDEBUG(325, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'U') goto yy415;
- if (yych == 'u') goto yy415;
- goto yy44;
-yy326:
- YYDEBUG(326, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yybm[0+yych] & 16) {
- goto yy43;
- }
- YYDEBUG(327, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1397 "Zend/zend_language_scanner.l"
- {
- RETURN_TOKEN(T_ECHO);
-}
-#line 4187 "Zend/zend_language_scanner.c"
-yy328:
- YYDEBUG(328, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych <= '^') {
- if (yych <= '@') {
- if (yych <= '/') goto yy329;
- if (yych <= '9') goto yy43;
- } else {
- if (yych == 'I') goto yy416;
- if (yych <= 'Z') goto yy43;
- }
- } else {
- if (yych <= 'h') {
- if (yych != '`') goto yy43;
- } else {
- if (yych <= 'i') goto yy416;
- if (yych <= 'z') goto yy43;
- if (yych >= 0x80) goto yy43;
- }
- }
-yy329:
- YYDEBUG(329, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1321 "Zend/zend_language_scanner.l"
- {
- RETURN_TOKEN(T_ELSE);
-}
-#line 4215 "Zend/zend_language_scanner.c"
-yy330:
- YYDEBUG(330, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'Y') goto yy417;
- if (yych == 'y') goto yy417;
- goto yy44;
-yy331:
- YYDEBUG(331, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'E') goto yy419;
- if (yych == 'e') goto yy419;
- goto yy44;
-yy332:
- YYDEBUG(332, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'O') goto yy420;
- if (yych == 'o') goto yy420;
- goto yy44;
-yy333:
- YYDEBUG(333, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'F') goto yy421;
- if (yych == 'f') goto yy421;
- goto yy44;
-yy334:
- YYDEBUG(334, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'W') goto yy423;
- if (yych == 'w') goto yy423;
- goto yy44;
-yy335:
- YYDEBUG(335, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'H') goto yy424;
- if (yych == 'h') goto yy424;
- goto yy44;
-yy336:
- YYDEBUG(336, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yybm[0+yych] & 16) {
- goto yy43;
- }
- YYDEBUG(337, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1505 "Zend/zend_language_scanner.l"
- {
- RETURN_TOKEN(T_EVAL);
-}
-#line 4264 "Zend/zend_language_scanner.c"
-yy338:
- YYDEBUG(338, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yybm[0+yych] & 16) {
- goto yy43;
- }
- YYDEBUG(339, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1263 "Zend/zend_language_scanner.l"
- {
- RETURN_TOKEN(T_EXIT);
-}
-#line 4277 "Zend/zend_language_scanner.c"
-yy340:
- YYDEBUG(340, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'N') goto yy425;
- if (yych == 'n') goto yy425;
- goto yy44;
-yy341:
- YYDEBUG(341, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'L') goto yy426;
- if (yych == 'l') goto yy426;
- goto yy44;
-yy342:
- YYDEBUG(342, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'A') goto yy428;
- if (yych == 'a') goto yy428;
- goto yy44;
-yy343:
- YYDEBUG(343, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'T') goto yy429;
- if (yych == 't') goto yy429;
- goto yy44;
-yy344:
- YYDEBUG(344, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'A') goto yy430;
- if (yych == 'a') goto yy430;
- goto yy44;
-yy345:
- YYDEBUG(345, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yybm[0+yych] & 16) {
- goto yy43;
- }
- YYDEBUG(346, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1393 "Zend/zend_language_scanner.l"
- {
- RETURN_TOKEN(T_GOTO);
-}
-#line 4320 "Zend/zend_language_scanner.c"
-yy347:
- YYDEBUG(347, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'E') goto yy431;
- if (yych == 'e') goto yy431;
- goto yy44;
-yy348:
- YYDEBUG(348, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'U') goto yy432;
- if (yych == 'u') goto yy432;
- goto yy44;
-yy349:
- YYDEBUG(349, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych <= 'E') {
- if (yych == 'A') goto yy433;
- if (yych <= 'D') goto yy44;
- goto yy434;
- } else {
- if (yych <= 'a') {
- if (yych <= '`') goto yy44;
- goto yy433;
- } else {
- if (yych == 'e') goto yy434;
- goto yy44;
- }
- }
-yy350:
- YYDEBUG(350, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'R') goto yy435;
- if (yych == 'r') goto yy435;
- goto yy44;
-yy351:
- YYDEBUG(351, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'T') goto yy436;
- if (yych == 't') goto yy436;
- goto yy44;
-yy352:
- YYDEBUG(352, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yybm[0+yych] & 16) {
- goto yy43;
- }
- YYDEBUG(353, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1585 "Zend/zend_language_scanner.l"
- {
- RETURN_TOKEN(T_LIST);
-}
-#line 4373 "Zend/zend_language_scanner.c"
-yy354:
- YYDEBUG(354, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'S') goto yy438;
- if (yych == 's') goto yy438;
- goto yy44;
-yy355:
- YYDEBUG(355, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'T') goto yy439;
- if (yych == 't') goto yy439;
- goto yy44;
-yy356:
- YYDEBUG(356, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'A') goto yy441;
- if (yych == 'a') goto yy441;
- goto yy44;
-yy357:
- YYDEBUG(357, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'E') goto yy442;
- if (yych == 'e') goto yy442;
- goto yy44;
-yy358:
- YYDEBUG(358, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'I') goto yy443;
- if (yych == 'i') goto yy443;
- goto yy44;
-yy359:
- YYDEBUG(359, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'I') goto yy444;
- if (yych == 'i') goto yy444;
- goto yy44;
-yy360:
- YYDEBUG(360, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'R') goto yy445;
- if (yych == 'r') goto yy445;
- goto yy44;
-yy361:
- YYDEBUG(361, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'I') goto yy446;
- if (yych == 'i') goto yy446;
- goto yy44;
-yy362:
- YYDEBUG(362, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'C') goto yy447;
- if (yych == 'c') goto yy447;
- goto yy44;
-yy363:
- YYDEBUG(363, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'W') goto yy448;
- if (yych == 'w') goto yy448;
- goto yy44;
-yy364:
- YYDEBUG(364, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'T') goto yy450;
- if (yych == 't') goto yy450;
- goto yy44;
-yy365:
- YYDEBUG(365, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'T') goto yy452;
- if (yych == 't') goto yy452;
- goto yy44;
-yy366:
- YYDEBUG(366, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'E') goto yy454;
- if (yych == 'e') goto yy454;
- goto yy44;
-yy367:
- YYDEBUG(367, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'D') goto yy456;
- if (yych == 'd') goto yy456;
- goto yy44;
-yy368:
- YYDEBUG(368, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'A') goto yy458;
- if (yych == 'a') goto yy458;
- goto yy44;
-yy369:
- YYDEBUG(369, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'R') goto yy459;
- if (yych == 'r') goto yy459;
- goto yy44;
-yy370:
- YYDEBUG(370, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'L') goto yy460;
- if (yych == 'l') goto yy460;
- goto yy44;
-yy371:
- YYDEBUG(371, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'N') goto yy461;
- if (yych == 'n') goto yy461;
- goto yy44;
-yy372:
- YYDEBUG(372, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'L') goto yy462;
- if (yych == 'l') goto yy462;
- goto yy44;
-yy373:
- YYDEBUG(373, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'N') goto yy463;
- if (yych == 'n') goto yy463;
- goto yy44;
-yy374:
- YYDEBUG(374, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'T') goto yy464;
- if (yych == 't') goto yy464;
- goto yy44;
-yy375:
- YYDEBUG(375, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'M') goto yy465;
- if (yych == 'm') goto yy465;
- goto yy44;
-yy376:
- YYDEBUG(376, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'A') goto yy466;
- if (yych == 'a') goto yy466;
- goto yy44;
-yy377:
- YYDEBUG(377, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'Y') goto yy467;
- if (yych == 'y') goto yy467;
- goto yy82;
-yy378:
- YYDEBUG(378, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'R') goto yy469;
- if (yych == 'r') goto yy469;
- goto yy82;
-yy379:
- YYDEBUG(379, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'E') goto yy474;
- if (yych == 'e') goto yy474;
- goto yy471;
-yy380:
- YYDEBUG(380, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'L') goto yy475;
- if (yych == 'l') goto yy475;
- goto yy82;
-yy381:
- YYDEBUG(381, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'T') goto yy388;
- if (yych == 't') goto yy388;
- goto yy82;
-yy382:
- YYDEBUG(382, *YYCURSOR);
- ++YYCURSOR;
- YYFILL(1);
- yych = *YYCURSOR;
-yy383:
- YYDEBUG(383, *YYCURSOR);
- if (yych <= 0x1F) {
- if (yych == '\t') goto yy382;
- goto yy82;
- } else {
- if (yych <= ' ') goto yy382;
- if (yych != ')') goto yy82;
- }
- YYDEBUG(384, *YYCURSOR);
- ++YYCURSOR;
- YYDEBUG(385, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1477 "Zend/zend_language_scanner.l"
- {
- RETURN_TOKEN(T_INT_CAST);
-}
-#line 4564 "Zend/zend_language_scanner.c"
-yy386:
- YYDEBUG(386, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'G') goto yy476;
- if (yych == 'g') goto yy476;
- goto yy82;
-yy387:
- YYDEBUG(387, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'C') goto yy477;
- if (yych == 'c') goto yy477;
- goto yy82;
-yy388:
- YYDEBUG(388, *YYCURSOR);
- ++YYCURSOR;
- YYFILL(1);
- yych = *YYCURSOR;
- YYDEBUG(389, *YYCURSOR);
- if (yych <= 0x1F) {
- if (yych == '\t') goto yy388;
- goto yy82;
- } else {
- if (yych <= ' ') goto yy388;
- if (yych == ')') goto yy478;
- goto yy82;
- }
-yy390:
- YYDEBUG(390, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'N') goto yy480;
- if (yych == 'n') goto yy480;
- goto yy82;
-yy391:
- YYDEBUG(391, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'T') goto yy481;
- if (yych == 't') goto yy481;
- goto yy82;
-yy392:
- YYDEBUG(392, *YYCURSOR);
- ++YYCURSOR;
- YYFILL(3);
- yych = *YYCURSOR;
-yy393:
- YYDEBUG(393, *YYCURSOR);
- if (yych <= 'Z') {
- if (yych <= '/') {
- if (yych == '"') goto yy483;
- goto yy82;
- } else {
- if (yych <= '9') goto yy392;
- if (yych <= '@') goto yy82;
- goto yy392;
- }
- } else {
- if (yych <= '`') {
- if (yych == '_') goto yy392;
- goto yy82;
- } else {
- if (yych <= 'z') goto yy392;
- if (yych <= 0x7F) goto yy82;
- goto yy392;
- }
- }
-yy394:
- YYDEBUG(394, *YYCURSOR);
- ++YYCURSOR;
- YYFILL(3);
- yych = *YYCURSOR;
-yy395:
- YYDEBUG(395, *YYCURSOR);
- if (yych <= 'Z') {
- if (yych <= '/') {
- if (yych == '\'') goto yy483;
- goto yy82;
- } else {
- if (yych <= '9') goto yy394;
- if (yych <= '@') goto yy82;
- goto yy394;
- }
- } else {
- if (yych <= '`') {
- if (yych == '_') goto yy394;
- goto yy82;
- } else {
- if (yych <= 'z') goto yy394;
- if (yych <= 0x7F) goto yy82;
- goto yy394;
- }
- }
-yy396:
- YYDEBUG(396, *YYCURSOR);
- ++YYCURSOR;
-yy397:
- YYDEBUG(397, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 2271 "Zend/zend_language_scanner.l"
- {
- char *s;
- 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);
- s = yytext+bprefix+3;
- while ((*s == ' ') || (*s == '\t')) {
- s++;
- heredoc_label->length--;
- }
-
- if (*s == '\'') {
- s++;
- heredoc_label->length -= 2;
- is_heredoc = 0;
-
- BEGIN(ST_NOWDOC);
- } else {
- if (*s == '"') {
- s++;
- heredoc_label->length -= 2;
- }
-
- BEGIN(ST_HEREDOC);
- }
-
- 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)) {
- 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 (PARSER_MODE()) {
- RETURN_TOKEN(T_ERROR);
- }
- }
-
- YYCURSOR = saved_cursor;
- heredoc_label->indentation = indentation;
-
- BEGIN(ST_END_HEREDOC);
- RETURN_TOKEN(T_START_HEREDOC);
- }
- }
-
- YYCURSOR = saved_cursor;
-
- if (is_heredoc && !SCNG(heredoc_scan_ahead)) {
- zend_lex_state current_state;
- zend_string *saved_doc_comment = CG(doc_comment);
- int heredoc_nesting_level = 1;
- int first_token = 0;
- int error = 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;
- CG(doc_comment) = 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));
- error = 1;
- }
-
- 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;
- CG(doc_comment) = saved_doc_comment;
-
- if (PARSER_MODE() && error) {
- RETURN_TOKEN(T_ERROR);
- }
- }
-
- RETURN_TOKEN(T_START_HEREDOC);
-}
-#line 4805 "Zend/zend_language_scanner.c"
-yy398:
- YYDEBUG(398, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == '\n') goto yy396;
- goto yy397;
-yy399:
- YYDEBUG(399, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'A') goto yy484;
- if (yych == 'a') goto yy484;
- goto yy44;
-yy400:
- YYDEBUG(400, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yybm[0+yych] & 16) {
- goto yy43;
- }
- YYDEBUG(401, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1589 "Zend/zend_language_scanner.l"
- {
- RETURN_TOKEN(T_ARRAY);
-}
-#line 4829 "Zend/zend_language_scanner.c"
-yy402:
- YYDEBUG(402, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yybm[0+yych] & 16) {
- goto yy43;
- }
- YYDEBUG(403, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1385 "Zend/zend_language_scanner.l"
- {
- RETURN_TOKEN(T_BREAK);
-}
-#line 4842 "Zend/zend_language_scanner.c"
-yy404:
- YYDEBUG(404, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'B') goto yy485;
- if (yych == 'b') goto yy485;
- goto yy44;
-yy405:
- YYDEBUG(405, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yybm[0+yych] & 16) {
- goto yy43;
- }
- YYDEBUG(406, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1297 "Zend/zend_language_scanner.l"
- {
- RETURN_TOKEN(T_CATCH);
-}
-#line 4861 "Zend/zend_language_scanner.c"
-yy407:
- YYDEBUG(407, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yybm[0+yych] & 16) {
- goto yy43;
- }
- YYDEBUG(408, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1405 "Zend/zend_language_scanner.l"
- {
- RETURN_TOKEN(T_CLASS);
-}
-#line 4874 "Zend/zend_language_scanner.c"
-yy409:
- YYDEBUG(409, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yybm[0+yych] & 16) {
- goto yy43;
- }
- YYDEBUG(410, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1469 "Zend/zend_language_scanner.l"
- {
- RETURN_TOKEN(T_CLONE);
-}
-#line 4887 "Zend/zend_language_scanner.c"
-yy411:
- YYDEBUG(411, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yybm[0+yych] & 16) {
- goto yy43;
- }
- YYDEBUG(412, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1275 "Zend/zend_language_scanner.l"
- {
- RETURN_TOKEN(T_CONST);
-}
-#line 4900 "Zend/zend_language_scanner.c"
-yy413:
- YYDEBUG(413, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'N') goto yy486;
- if (yych == 'n') goto yy486;
- goto yy44;
-yy414:
- YYDEBUG(414, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'R') goto yy487;
- if (yych == 'r') goto yy487;
- goto yy44;
-yy415:
- YYDEBUG(415, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'L') goto yy488;
- if (yych == 'l') goto yy488;
- goto yy44;
-yy416:
- YYDEBUG(416, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'F') goto yy489;
- if (yych == 'f') goto yy489;
- goto yy44;
-yy417:
- YYDEBUG(417, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yybm[0+yych] & 16) {
- goto yy43;
- }
- YYDEBUG(418, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1545 "Zend/zend_language_scanner.l"
- {
- RETURN_TOKEN(T_EMPTY);
-}
-#line 4937 "Zend/zend_language_scanner.c"
-yy419:
- YYDEBUG(419, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'C') goto yy491;
- if (yych == 'c') goto yy491;
- goto yy44;
-yy420:
- YYDEBUG(420, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'R') goto yy492;
- if (yych == 'r') goto yy492;
- goto yy44;
-yy421:
- YYDEBUG(421, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yybm[0+yych] & 16) {
- goto yy43;
- }
- YYDEBUG(422, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1317 "Zend/zend_language_scanner.l"
- {
- RETURN_TOKEN(T_ENDIF);
-}
-#line 4962 "Zend/zend_language_scanner.c"
-yy423:
- YYDEBUG(423, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'I') goto yy494;
- if (yych == 'i') goto yy494;
- goto yy44;
-yy424:
- YYDEBUG(424, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'I') goto yy495;
- if (yych == 'i') goto yy495;
- goto yy44;
-yy425:
- YYDEBUG(425, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'D') goto yy496;
- if (yych == 'd') goto yy496;
- goto yy44;
-yy426:
- YYDEBUG(426, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych <= '^') {
- if (yych <= '@') {
- if (yych <= '/') goto yy427;
- if (yych <= '9') goto yy43;
- } else {
- if (yych == 'L') goto yy497;
- if (yych <= 'Z') goto yy43;
- }
- } else {
- if (yych <= 'k') {
- if (yych != '`') goto yy43;
- } else {
- if (yych <= 'l') goto yy497;
- if (yych <= 'z') goto yy43;
- if (yych >= 0x80) goto yy43;
- }
- }
-yy427:
- YYDEBUG(427, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1561 "Zend/zend_language_scanner.l"
- {
- RETURN_TOKEN(T_FINAL);
-}
-#line 5008 "Zend/zend_language_scanner.c"
-yy428:
- YYDEBUG(428, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'C') goto yy498;
- if (yych == 'c') goto yy498;
- goto yy44;
-yy429:
- YYDEBUG(429, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'I') goto yy499;
- if (yych == 'i') goto yy499;
- goto yy44;
-yy430:
- YYDEBUG(430, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'L') goto yy500;
- if (yych == 'l') goto yy500;
- goto yy44;
-yy431:
- YYDEBUG(431, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'M') goto yy502;
- if (yych == 'm') goto yy502;
- goto yy44;
-yy432:
- YYDEBUG(432, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'D') goto yy503;
- if (yych == 'd') goto yy503;
- goto yy44;
-yy433:
- YYDEBUG(433, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'N') goto yy504;
- if (yych == 'n') goto yy504;
- goto yy44;
-yy434:
- YYDEBUG(434, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'A') goto yy505;
- if (yych == 'a') goto yy505;
- goto yy44;
-yy435:
- YYDEBUG(435, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'F') goto yy506;
- if (yych == 'f') goto yy506;
- goto yy44;
-yy436:
- YYDEBUG(436, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yybm[0+yych] & 16) {
- goto yy43;
- }
- YYDEBUG(437, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1541 "Zend/zend_language_scanner.l"
- {
- RETURN_TOKEN(T_ISSET);
-}
-#line 5069 "Zend/zend_language_scanner.c"
-yy438:
- YYDEBUG(438, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'P') goto yy507;
- if (yych == 'p') goto yy507;
- goto yy44;
-yy439:
- YYDEBUG(439, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yybm[0+yych] & 16) {
- goto yy43;
- }
- YYDEBUG(440, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1401 "Zend/zend_language_scanner.l"
- {
- RETURN_TOKEN(T_PRINT);
-}
-#line 5088 "Zend/zend_language_scanner.c"
-yy441:
- YYDEBUG(441, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'T') goto yy508;
- if (yych == 't') goto yy508;
- goto yy44;
-yy442:
- YYDEBUG(442, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'C') goto yy509;
- if (yych == 'c') goto yy509;
- goto yy44;
-yy443:
- YYDEBUG(443, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'C') goto yy510;
- if (yych == 'c') goto yy510;
- goto yy44;
-yy444:
- YYDEBUG(444, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'R') goto yy512;
- if (yych == 'r') goto yy512;
- goto yy44;
-yy445:
- YYDEBUG(445, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'N') goto yy513;
- if (yych == 'n') goto yy513;
- goto yy44;
-yy446:
- YYDEBUG(446, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'C') goto yy515;
- if (yych == 'c') goto yy515;
- goto yy44;
-yy447:
- YYDEBUG(447, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'H') goto yy517;
- if (yych == 'h') goto yy517;
- goto yy44;
-yy448:
- YYDEBUG(448, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yybm[0+yych] & 16) {
- goto yy43;
- }
- YYDEBUG(449, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1305 "Zend/zend_language_scanner.l"
- {
- RETURN_TOKEN(T_THROW);
-}
-#line 5143 "Zend/zend_language_scanner.c"
-yy450:
- YYDEBUG(450, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yybm[0+yych] & 16) {
- goto yy43;
- }
- YYDEBUG(451, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1413 "Zend/zend_language_scanner.l"
- {
- RETURN_TOKEN(T_TRAIT);
-}
-#line 5156 "Zend/zend_language_scanner.c"
-yy452:
- YYDEBUG(452, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yybm[0+yych] & 16) {
- goto yy43;
- }
- YYDEBUG(453, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1577 "Zend/zend_language_scanner.l"
- {
- RETURN_TOKEN(T_UNSET);
-}
-#line 5169 "Zend/zend_language_scanner.c"
-yy454:
- YYDEBUG(454, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yybm[0+yych] & 16) {
- goto yy43;
- }
- YYDEBUG(455, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1325 "Zend/zend_language_scanner.l"
- {
- RETURN_TOKEN(T_WHILE);
-}
-#line 5182 "Zend/zend_language_scanner.c"
-yy456:
- YYDEBUG(456, *YYCURSOR);
- yyaccept = 6;
- yych = *(YYMARKER = ++YYCURSOR);
- if (yybm[0+yych] & 16) {
- goto yy43;
- }
- if (yych <= '\f') {
- if (yych <= 0x08) goto yy457;
- if (yych <= '\n') goto yy519;
- } else {
- if (yych <= '\r') goto yy519;
- if (yych == ' ') goto yy519;
- }
-yy457:
- YYDEBUG(457, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1289 "Zend/zend_language_scanner.l"
- {
- RETURN_TOKEN(T_YIELD);
-}
-#line 5204 "Zend/zend_language_scanner.c"
-yy458:
- YYDEBUG(458, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'S') goto yy521;
- if (yych == 's') goto yy521;
- goto yy44;
-yy459:
- YYDEBUG(459, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == '_') goto yy522;
- goto yy44;
-yy460:
- YYDEBUG(460, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'E') goto yy523;
- if (yych == 'e') goto yy523;
- goto yy44;
-yy461:
- YYDEBUG(461, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'C') goto yy524;
- if (yych == 'c') goto yy524;
- goto yy44;
-yy462:
- YYDEBUG(462, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'T') goto yy525;
- if (yych == 't') goto yy525;
- goto yy44;
-yy463:
- YYDEBUG(463, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'E') goto yy526;
- if (yych == 'e') goto yy526;
- goto yy44;
-yy464:
- YYDEBUG(464, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'H') goto yy527;
- if (yych == 'h') goto yy527;
- goto yy44;
-yy465:
- YYDEBUG(465, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'E') goto yy528;
- if (yych == 'e') goto yy528;
- goto yy44;
-yy466:
- YYDEBUG(466, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'I') goto yy529;
- if (yych == 'i') goto yy529;
- goto yy44;
-yy467:
- YYDEBUG(467, *YYCURSOR);
- ++YYCURSOR;
- YYFILL(1);
- yych = *YYCURSOR;
- YYDEBUG(468, *YYCURSOR);
- if (yych <= 0x1F) {
- if (yych == '\t') goto yy467;
- goto yy82;
- } else {
- if (yych <= ' ') goto yy467;
- if (yych == ')') goto yy530;
- goto yy82;
- }
-yy469:
- YYDEBUG(469, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'Y') goto yy532;
- if (yych == 'y') goto yy532;
- goto yy82;
-yy470:
- YYDEBUG(470, *YYCURSOR);
- ++YYCURSOR;
- YYFILL(1);
- yych = *YYCURSOR;
-yy471:
- YYDEBUG(471, *YYCURSOR);
- if (yych <= 0x1F) {
- if (yych == '\t') goto yy470;
- goto yy82;
- } else {
- if (yych <= ' ') goto yy470;
- if (yych != ')') goto yy82;
- }
- YYDEBUG(472, *YYCURSOR);
- ++YYCURSOR;
- YYDEBUG(473, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1497 "Zend/zend_language_scanner.l"
- {
- RETURN_TOKEN(T_BOOL_CAST);
-}
-#line 5300 "Zend/zend_language_scanner.c"
-yy474:
- YYDEBUG(474, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'A') goto yy534;
- if (yych == 'a') goto yy534;
- goto yy82;
-yy475:
- YYDEBUG(475, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'E') goto yy388;
- if (yych == 'e') goto yy388;
- goto yy82;
-yy476:
- YYDEBUG(476, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'E') goto yy535;
- if (yych == 'e') goto yy535;
- goto yy82;
-yy477:
- YYDEBUG(477, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'T') goto yy536;
- if (yych == 't') goto yy536;
- goto yy82;
-yy478:
- YYDEBUG(478, *YYCURSOR);
- ++YYCURSOR;
- YYDEBUG(479, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1481 "Zend/zend_language_scanner.l"
- {
- RETURN_TOKEN(T_DOUBLE_CAST);
-}
-#line 5334 "Zend/zend_language_scanner.c"
-yy480:
- YYDEBUG(480, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'G') goto yy532;
- if (yych == 'g') goto yy532;
- goto yy82;
-yy481:
- YYDEBUG(481, *YYCURSOR);
- ++YYCURSOR;
- YYFILL(1);
- yych = *YYCURSOR;
- YYDEBUG(482, *YYCURSOR);
- if (yych <= 0x1F) {
- if (yych == '\t') goto yy481;
- goto yy82;
- } else {
- if (yych <= ' ') goto yy481;
- if (yych == ')') goto yy538;
- goto yy82;
- }
-yy483:
- YYDEBUG(483, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == '\n') goto yy396;
- if (yych == '\r') goto yy398;
- goto yy82;
-yy484:
- YYDEBUG(484, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'C') goto yy540;
- if (yych == 'c') goto yy540;
- goto yy44;
-yy485:
- YYDEBUG(485, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'L') goto yy541;
- if (yych == 'l') goto yy541;
- goto yy44;
-yy486:
- YYDEBUG(486, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'U') goto yy542;
- if (yych == 'u') goto yy542;
- goto yy44;
-yy487:
- YYDEBUG(487, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'E') goto yy543;
- if (yych == 'e') goto yy543;
- goto yy44;
-yy488:
- YYDEBUG(488, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'T') goto yy545;
- if (yych == 't') goto yy545;
- goto yy44;
-yy489:
- YYDEBUG(489, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yybm[0+yych] & 16) {
- goto yy43;
- }
- YYDEBUG(490, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1313 "Zend/zend_language_scanner.l"
- {
- RETURN_TOKEN(T_ELSEIF);
-}
-#line 5403 "Zend/zend_language_scanner.c"
-yy491:
- YYDEBUG(491, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'L') goto yy547;
- if (yych == 'l') goto yy547;
- goto yy44;
-yy492:
- YYDEBUG(492, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych <= '^') {
- if (yych <= '@') {
- if (yych <= '/') goto yy493;
- if (yych <= '9') goto yy43;
- } else {
- if (yych == 'E') goto yy548;
- if (yych <= 'Z') goto yy43;
- }
- } else {
- if (yych <= 'd') {
- if (yych != '`') goto yy43;
- } else {
- if (yych <= 'e') goto yy548;
- if (yych <= 'z') goto yy43;
- if (yych >= 0x80) goto yy43;
- }
- }
-yy493:
- YYDEBUG(493, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1341 "Zend/zend_language_scanner.l"
- {
- RETURN_TOKEN(T_ENDFOR);
-}
-#line 5437 "Zend/zend_language_scanner.c"
-yy494:
- YYDEBUG(494, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'T') goto yy549;
- if (yych == 't') goto yy549;
- goto yy44;
-yy495:
- YYDEBUG(495, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'L') goto yy550;
- if (yych == 'l') goto yy550;
- goto yy44;
-yy496:
- YYDEBUG(496, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'S') goto yy551;
- if (yych == 's') goto yy551;
- goto yy44;
-yy497:
- YYDEBUG(497, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'Y') goto yy553;
- if (yych == 'y') goto yy553;
- goto yy44;
-yy498:
- YYDEBUG(498, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'H') goto yy555;
- if (yych == 'h') goto yy555;
- goto yy44;
-yy499:
- YYDEBUG(499, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'O') goto yy557;
- if (yych == 'o') goto yy557;
- goto yy44;
-yy500:
- YYDEBUG(500, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yybm[0+yych] & 16) {
- goto yy43;
- }
- YYDEBUG(501, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1537 "Zend/zend_language_scanner.l"
- {
- RETURN_TOKEN(T_GLOBAL);
-}
-#line 5486 "Zend/zend_language_scanner.c"
-yy502:
- YYDEBUG(502, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'E') goto yy558;
- if (yych == 'e') goto yy558;
- goto yy44;
-yy503:
- YYDEBUG(503, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'E') goto yy559;
- if (yych == 'e') goto yy559;
- goto yy44;
-yy504:
- YYDEBUG(504, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'C') goto yy561;
- if (yych == 'c') goto yy561;
- goto yy44;
-yy505:
- YYDEBUG(505, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'D') goto yy562;
- if (yych == 'd') goto yy562;
- goto yy44;
-yy506:
- YYDEBUG(506, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'A') goto yy563;
- if (yych == 'a') goto yy563;
- goto yy44;
-yy507:
- YYDEBUG(507, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'A') goto yy564;
- if (yych == 'a') goto yy564;
- goto yy44;
-yy508:
- YYDEBUG(508, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'E') goto yy565;
- if (yych == 'e') goto yy565;
- goto yy44;
-yy509:
- YYDEBUG(509, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'T') goto yy567;
- if (yych == 't') goto yy567;
- goto yy44;
-yy510:
- YYDEBUG(510, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yybm[0+yych] & 16) {
- goto yy43;
- }
- YYDEBUG(511, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1573 "Zend/zend_language_scanner.l"
- {
- RETURN_TOKEN(T_PUBLIC);
-}
-#line 5547 "Zend/zend_language_scanner.c"
-yy512:
- YYDEBUG(512, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'E') goto yy568;
- if (yych == 'e') goto yy568;
- goto yy44;
-yy513:
- YYDEBUG(513, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yybm[0+yych] & 16) {
- goto yy43;
- }
- YYDEBUG(514, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1279 "Zend/zend_language_scanner.l"
- {
- RETURN_TOKEN(T_RETURN);
-}
-#line 5566 "Zend/zend_language_scanner.c"
-yy515:
- YYDEBUG(515, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yybm[0+yych] & 16) {
- goto yy43;
- }
- YYDEBUG(516, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1553 "Zend/zend_language_scanner.l"
- {
- RETURN_TOKEN(T_STATIC);
-}
-#line 5579 "Zend/zend_language_scanner.c"
-yy517:
- YYDEBUG(517, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yybm[0+yych] & 16) {
- goto yy43;
- }
- YYDEBUG(518, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1369 "Zend/zend_language_scanner.l"
- {
- RETURN_TOKEN(T_SWITCH);
-}
-#line 5592 "Zend/zend_language_scanner.c"
-yy519:
- YYDEBUG(519, *YYCURSOR);
- ++YYCURSOR;
- YYFILL(5);
- yych = *YYCURSOR;
- YYDEBUG(520, *YYCURSOR);
- if (yych <= 0x1F) {
- if (yych <= '\n') {
- if (yych <= 0x08) goto yy82;
- goto yy519;
- } else {
- if (yych == '\r') goto yy519;
- goto yy82;
- }
- } else {
- if (yych <= 'F') {
- if (yych <= ' ') goto yy519;
- if (yych <= 'E') goto yy82;
- goto yy570;
- } else {
- if (yych == 'f') goto yy570;
- goto yy82;
- }
- }
-yy521:
- YYDEBUG(521, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'S') goto yy571;
- if (yych == 's') goto yy571;
- goto yy44;
-yy522:
- YYDEBUG(522, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == '_') goto yy572;
- goto yy44;
-yy523:
- YYDEBUG(523, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == '_') goto yy574;
- goto yy44;
-yy524:
- YYDEBUG(524, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'T') goto yy575;
- if (yych == 't') goto yy575;
- goto yy44;
-yy525:
- YYDEBUG(525, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == '_') goto yy576;
- goto yy44;
-yy526:
- YYDEBUG(526, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == '_') goto yy577;
- goto yy44;
-yy527:
- YYDEBUG(527, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'O') goto yy578;
- if (yych == 'o') goto yy578;
- goto yy44;
-yy528:
- YYDEBUG(528, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'S') goto yy579;
- if (yych == 's') goto yy579;
- goto yy44;
-yy529:
- YYDEBUG(529, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'T') goto yy580;
- if (yych == 't') goto yy580;
- goto yy44;
-yy530:
- YYDEBUG(530, *YYCURSOR);
- ++YYCURSOR;
- YYDEBUG(531, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1489 "Zend/zend_language_scanner.l"
- {
- RETURN_TOKEN(T_ARRAY_CAST);
-}
-#line 5676 "Zend/zend_language_scanner.c"
-yy532:
- YYDEBUG(532, *YYCURSOR);
- ++YYCURSOR;
- YYFILL(1);
- yych = *YYCURSOR;
- YYDEBUG(533, *YYCURSOR);
- if (yych <= 0x1F) {
- if (yych == '\t') goto yy532;
- goto yy82;
- } else {
- if (yych <= ' ') goto yy532;
- if (yych == ')') goto yy581;
- goto yy82;
- }
-yy534:
- YYDEBUG(534, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'N') goto yy470;
- if (yych == 'n') goto yy470;
- goto yy82;
-yy535:
- YYDEBUG(535, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'R') goto yy382;
- if (yych == 'r') goto yy382;
- goto yy82;
-yy536:
- YYDEBUG(536, *YYCURSOR);
- ++YYCURSOR;
- YYFILL(1);
- yych = *YYCURSOR;
- YYDEBUG(537, *YYCURSOR);
- if (yych <= 0x1F) {
- if (yych == '\t') goto yy536;
- goto yy82;
- } else {
- if (yych <= ' ') goto yy536;
- if (yych == ')') goto yy583;
- goto yy82;
- }
-yy538:
- YYDEBUG(538, *YYCURSOR);
- ++YYCURSOR;
- YYDEBUG(539, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1501 "Zend/zend_language_scanner.l"
- {
- RETURN_TOKEN(T_UNSET_CAST);
-}
-#line 5726 "Zend/zend_language_scanner.c"
-yy540:
- YYDEBUG(540, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'T') goto yy585;
- if (yych == 't') goto yy585;
- goto yy44;
-yy541:
- YYDEBUG(541, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'E') goto yy587;
- if (yych == 'e') goto yy587;
- goto yy44;
-yy542:
- YYDEBUG(542, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'E') goto yy589;
- if (yych == 'e') goto yy589;
- goto yy44;
-yy543:
- YYDEBUG(543, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yybm[0+yych] & 16) {
- goto yy43;
- }
- YYDEBUG(544, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1353 "Zend/zend_language_scanner.l"
- {
- RETURN_TOKEN(T_DECLARE);
-}
-#line 5757 "Zend/zend_language_scanner.c"
-yy545:
- YYDEBUG(545, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yybm[0+yych] & 16) {
- goto yy43;
- }
- YYDEBUG(546, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1381 "Zend/zend_language_scanner.l"
- {
- RETURN_TOKEN(T_DEFAULT);
-}
-#line 5770 "Zend/zend_language_scanner.c"
-yy547:
- YYDEBUG(547, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'A') goto yy591;
- if (yych == 'a') goto yy591;
- goto yy44;
-yy548:
- YYDEBUG(548, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'A') goto yy592;
- if (yych == 'a') goto yy592;
- goto yy44;
-yy549:
- YYDEBUG(549, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'C') goto yy593;
- if (yych == 'c') goto yy593;
- goto yy44;
-yy550:
- YYDEBUG(550, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'E') goto yy594;
- if (yych == 'e') goto yy594;
- goto yy44;
-yy551:
- YYDEBUG(551, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yybm[0+yych] & 16) {
- goto yy43;
- }
- YYDEBUG(552, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1417 "Zend/zend_language_scanner.l"
- {
- RETURN_TOKEN(T_EXTENDS);
-}
-#line 5807 "Zend/zend_language_scanner.c"
-yy553:
- YYDEBUG(553, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yybm[0+yych] & 16) {
- goto yy43;
- }
- YYDEBUG(554, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1301 "Zend/zend_language_scanner.l"
- {
- RETURN_TOKEN(T_FINALLY);
-}
-#line 5820 "Zend/zend_language_scanner.c"
-yy555:
- YYDEBUG(555, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yybm[0+yych] & 16) {
- goto yy43;
- }
- YYDEBUG(556, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1345 "Zend/zend_language_scanner.l"
- {
- RETURN_TOKEN(T_FOREACH);
-}
-#line 5833 "Zend/zend_language_scanner.c"
-yy557:
- YYDEBUG(557, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'N') goto yy596;
- if (yych == 'n') goto yy596;
- goto yy44;
-yy558:
- YYDEBUG(558, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'N') goto yy598;
- if (yych == 'n') goto yy598;
- goto yy44;
-yy559:
- YYDEBUG(559, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych <= '^') {
- if (yych <= '9') {
- if (yych >= '0') goto yy43;
- } else {
- if (yych <= '@') goto yy560;
- if (yych <= 'Z') goto yy43;
- }
- } else {
- if (yych <= '`') {
- if (yych <= '_') goto yy599;
- } else {
- if (yych <= 'z') goto yy43;
- if (yych >= 0x80) goto yy43;
- }
- }
-yy560:
- YYDEBUG(560, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1509 "Zend/zend_language_scanner.l"
- {
- RETURN_TOKEN(T_INCLUDE);
-}
-#line 5871 "Zend/zend_language_scanner.c"
-yy561:
- YYDEBUG(561, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'E') goto yy600;
- if (yych == 'e') goto yy600;
- goto yy44;
-yy562:
- YYDEBUG(562, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'O') goto yy601;
- if (yych == 'o') goto yy601;
- goto yy44;
-yy563:
- YYDEBUG(563, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'C') goto yy602;
- if (yych == 'c') goto yy602;
- goto yy44;
-yy564:
- YYDEBUG(564, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'C') goto yy603;
- if (yych == 'c') goto yy603;
- goto yy44;
-yy565:
- YYDEBUG(565, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yybm[0+yych] & 16) {
- goto yy43;
- }
- YYDEBUG(566, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1565 "Zend/zend_language_scanner.l"
- {
- RETURN_TOKEN(T_PRIVATE);
-}
-#line 5908 "Zend/zend_language_scanner.c"
-yy567:
- YYDEBUG(567, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'E') goto yy604;
- if (yych == 'e') goto yy604;
- goto yy44;
-yy568:
- YYDEBUG(568, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych <= '^') {
- if (yych <= '9') {
- if (yych >= '0') goto yy43;
- } else {
- if (yych <= '@') goto yy569;
- if (yych <= 'Z') goto yy43;
- }
- } else {
- if (yych <= '`') {
- if (yych <= '_') goto yy605;
- } else {
- if (yych <= 'z') goto yy43;
- if (yych >= 0x80) goto yy43;
- }
- }
-yy569:
- YYDEBUG(569, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1517 "Zend/zend_language_scanner.l"
- {
- RETURN_TOKEN(T_REQUIRE);
-}
-#line 5940 "Zend/zend_language_scanner.c"
-yy570:
- YYDEBUG(570, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'R') goto yy606;
- if (yych == 'r') goto yy606;
- goto yy82;
-yy571:
- YYDEBUG(571, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == '_') goto yy607;
- goto yy44;
-yy572:
- YYDEBUG(572, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yybm[0+yych] & 16) {
- goto yy43;
- }
- YYDEBUG(573, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1920 "Zend/zend_language_scanner.l"
- {
- RETURN_TOKEN(T_DIR);
-}
-#line 5964 "Zend/zend_language_scanner.c"
-yy574:
- YYDEBUG(574, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == '_') goto yy608;
- goto yy44;
-yy575:
- YYDEBUG(575, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'I') goto yy610;
- if (yych == 'i') goto yy610;
- goto yy44;
-yy576:
- YYDEBUG(576, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'C') goto yy611;
- if (yych == 'c') goto yy611;
- goto yy44;
-yy577:
- YYDEBUG(577, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == '_') goto yy612;
- goto yy44;
-yy578:
- YYDEBUG(578, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'D') goto yy614;
- if (yych == 'd') goto yy614;
- goto yy44;
-yy579:
- YYDEBUG(579, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'P') goto yy615;
- if (yych == 'p') goto yy615;
- goto yy44;
-yy580:
- YYDEBUG(580, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == '_') goto yy616;
- goto yy44;
-yy581:
- YYDEBUG(581, *YYCURSOR);
- ++YYCURSOR;
- YYDEBUG(582, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1485 "Zend/zend_language_scanner.l"
- {
- RETURN_TOKEN(T_STRING_CAST);
-}
-#line 6013 "Zend/zend_language_scanner.c"
-yy583:
- YYDEBUG(583, *YYCURSOR);
- ++YYCURSOR;
- YYDEBUG(584, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1493 "Zend/zend_language_scanner.l"
- {
- RETURN_TOKEN(T_OBJECT_CAST);
-}
-#line 6023 "Zend/zend_language_scanner.c"
-yy585:
- YYDEBUG(585, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yybm[0+yych] & 16) {
- goto yy43;
- }
- YYDEBUG(586, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1557 "Zend/zend_language_scanner.l"
- {
- RETURN_TOKEN(T_ABSTRACT);
-}
-#line 6036 "Zend/zend_language_scanner.c"
-yy587:
- YYDEBUG(587, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yybm[0+yych] & 16) {
- goto yy43;
- }
- YYDEBUG(588, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1593 "Zend/zend_language_scanner.l"
- {
- RETURN_TOKEN(T_CALLABLE);
-}
-#line 6049 "Zend/zend_language_scanner.c"
-yy589:
- YYDEBUG(589, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yybm[0+yych] & 16) {
- goto yy43;
- }
- YYDEBUG(590, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1389 "Zend/zend_language_scanner.l"
- {
- RETURN_TOKEN(T_CONTINUE);
-}
-#line 6062 "Zend/zend_language_scanner.c"
-yy591:
- YYDEBUG(591, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'R') goto yy617;
- if (yych == 'r') goto yy617;
- goto yy44;
-yy592:
- YYDEBUG(592, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'C') goto yy618;
- if (yych == 'c') goto yy618;
- goto yy44;
-yy593:
- YYDEBUG(593, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'H') goto yy619;
- if (yych == 'h') goto yy619;
- goto yy44;
-yy594:
- YYDEBUG(594, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yybm[0+yych] & 16) {
- goto yy43;
- }
- YYDEBUG(595, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1329 "Zend/zend_language_scanner.l"
- {
- RETURN_TOKEN(T_ENDWHILE);
-}
-#line 6093 "Zend/zend_language_scanner.c"
-yy596:
- YYDEBUG(596, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yybm[0+yych] & 16) {
- goto yy43;
- }
- YYDEBUG(597, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1271 "Zend/zend_language_scanner.l"
- {
- RETURN_TOKEN(T_FUNCTION);
-}
-#line 6106 "Zend/zend_language_scanner.c"
-yy598:
- YYDEBUG(598, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'T') goto yy621;
- if (yych == 't') goto yy621;
- goto yy44;
-yy599:
- YYDEBUG(599, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'O') goto yy622;
- if (yych == 'o') goto yy622;
- goto yy44;
-yy600:
- YYDEBUG(600, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'O') goto yy623;
- if (yych == 'o') goto yy623;
- goto yy44;
-yy601:
- YYDEBUG(601, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'F') goto yy624;
- if (yych == 'f') goto yy624;
- goto yy44;
-yy602:
- YYDEBUG(602, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'E') goto yy626;
- if (yych == 'e') goto yy626;
- goto yy44;
-yy603:
- YYDEBUG(603, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'E') goto yy628;
- if (yych == 'e') goto yy628;
- goto yy44;
-yy604:
- YYDEBUG(604, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'D') goto yy630;
- if (yych == 'd') goto yy630;
- goto yy44;
-yy605:
- YYDEBUG(605, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'O') goto yy632;
- if (yych == 'o') goto yy632;
- goto yy44;
-yy606:
- YYDEBUG(606, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'O') goto yy633;
- if (yych == 'o') goto yy633;
- goto yy82;
-yy607:
- YYDEBUG(607, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == '_') goto yy634;
- goto yy44;
-yy608:
- YYDEBUG(608, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yybm[0+yych] & 16) {
- goto yy43;
- }
- YYDEBUG(609, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1916 "Zend/zend_language_scanner.l"
- {
- RETURN_TOKEN(T_FILE);
-}
-#line 6178 "Zend/zend_language_scanner.c"
-yy610:
- YYDEBUG(610, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'O') goto yy636;
- if (yych == 'o') goto yy636;
- goto yy44;
-yy611:
- YYDEBUG(611, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'O') goto yy637;
- if (yych == 'o') goto yy637;
- goto yy44;
-yy612:
- YYDEBUG(612, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yybm[0+yych] & 16) {
- goto yy43;
- }
- YYDEBUG(613, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1912 "Zend/zend_language_scanner.l"
- {
- RETURN_TOKEN(T_LINE);
-}
-#line 6203 "Zend/zend_language_scanner.c"
-yy614:
- YYDEBUG(614, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == '_') goto yy638;
- goto yy44;
-yy615:
- YYDEBUG(615, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'A') goto yy639;
- if (yych == 'a') goto yy639;
- goto yy44;
-yy616:
- YYDEBUG(616, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == '_') goto yy640;
- goto yy44;
-yy617:
- YYDEBUG(617, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'E') goto yy642;
- if (yych == 'e') goto yy642;
- goto yy44;
-yy618:
- YYDEBUG(618, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'H') goto yy644;
- if (yych == 'h') goto yy644;
- goto yy44;
-yy619:
- YYDEBUG(619, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yybm[0+yych] & 16) {
- goto yy43;
- }
- YYDEBUG(620, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1373 "Zend/zend_language_scanner.l"
- {
- RETURN_TOKEN(T_ENDSWITCH);
-}
-#line 6244 "Zend/zend_language_scanner.c"
-yy621:
- YYDEBUG(621, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'S') goto yy646;
- if (yych == 's') goto yy646;
- goto yy44;
-yy622:
- YYDEBUG(622, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'N') goto yy648;
- if (yych == 'n') goto yy648;
- goto yy44;
-yy623:
- YYDEBUG(623, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'F') goto yy649;
- if (yych == 'f') goto yy649;
- goto yy44;
-yy624:
- YYDEBUG(624, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yybm[0+yych] & 16) {
- goto yy43;
- }
- YYDEBUG(625, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1533 "Zend/zend_language_scanner.l"
- {
- RETURN_TOKEN(T_INSTEADOF);
-}
-#line 6275 "Zend/zend_language_scanner.c"
-yy626:
- YYDEBUG(626, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yybm[0+yych] & 16) {
- goto yy43;
- }
- YYDEBUG(627, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1409 "Zend/zend_language_scanner.l"
- {
- RETURN_TOKEN(T_INTERFACE);
-}
-#line 6288 "Zend/zend_language_scanner.c"
-yy628:
- YYDEBUG(628, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yybm[0+yych] & 16) {
- goto yy43;
- }
- YYDEBUG(629, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1525 "Zend/zend_language_scanner.l"
- {
- RETURN_TOKEN(T_NAMESPACE);
-}
-#line 6301 "Zend/zend_language_scanner.c"
-yy630:
- YYDEBUG(630, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yybm[0+yych] & 16) {
- goto yy43;
- }
- YYDEBUG(631, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1569 "Zend/zend_language_scanner.l"
- {
- RETURN_TOKEN(T_PROTECTED);
-}
-#line 6314 "Zend/zend_language_scanner.c"
-yy632:
- YYDEBUG(632, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'N') goto yy651;
- if (yych == 'n') goto yy651;
- goto yy44;
-yy633:
- YYDEBUG(633, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'M') goto yy652;
- if (yych == 'm') goto yy652;
- goto yy82;
-yy634:
- YYDEBUG(634, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yybm[0+yych] & 16) {
- goto yy43;
- }
- YYDEBUG(635, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1896 "Zend/zend_language_scanner.l"
- {
- RETURN_TOKEN(T_CLASS_C);
-}
-#line 6339 "Zend/zend_language_scanner.c"
-yy636:
- YYDEBUG(636, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'N') goto yy653;
- if (yych == 'n') goto yy653;
- goto yy44;
-yy637:
- YYDEBUG(637, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'M') goto yy654;
- if (yych == 'm') goto yy654;
- goto yy44;
-yy638:
- YYDEBUG(638, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == '_') goto yy655;
- goto yy44;
-yy639:
- YYDEBUG(639, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'C') goto yy657;
- if (yych == 'c') goto yy657;
- goto yy44;
-yy640:
- YYDEBUG(640, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yybm[0+yych] & 16) {
- goto yy43;
- }
- YYDEBUG(641, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1900 "Zend/zend_language_scanner.l"
- {
- RETURN_TOKEN(T_TRAIT_C);
-}
-#line 6375 "Zend/zend_language_scanner.c"
-yy642:
- YYDEBUG(642, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yybm[0+yych] & 16) {
- goto yy43;
- }
- YYDEBUG(643, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1357 "Zend/zend_language_scanner.l"
- {
- RETURN_TOKEN(T_ENDDECLARE);
-}
-#line 6388 "Zend/zend_language_scanner.c"
-yy644:
- YYDEBUG(644, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yybm[0+yych] & 16) {
- goto yy43;
- }
- YYDEBUG(645, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1349 "Zend/zend_language_scanner.l"
- {
- RETURN_TOKEN(T_ENDFOREACH);
-}
-#line 6401 "Zend/zend_language_scanner.c"
-yy646:
- YYDEBUG(646, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yybm[0+yych] & 16) {
- goto yy43;
- }
- YYDEBUG(647, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1421 "Zend/zend_language_scanner.l"
- {
- RETURN_TOKEN(T_IMPLEMENTS);
-}
-#line 6414 "Zend/zend_language_scanner.c"
-yy648:
- YYDEBUG(648, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'C') goto yy658;
- if (yych == 'c') goto yy658;
- goto yy44;
-yy649:
- YYDEBUG(649, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yybm[0+yych] & 16) {
- goto yy43;
- }
- YYDEBUG(650, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1361 "Zend/zend_language_scanner.l"
- {
- RETURN_TOKEN(T_INSTANCEOF);
-}
-#line 6433 "Zend/zend_language_scanner.c"
-yy651:
- YYDEBUG(651, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'C') goto yy659;
- if (yych == 'c') goto yy659;
- goto yy44;
-yy652:
- YYDEBUG(652, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych <= '^') {
- if (yych <= '9') {
- if (yych <= '/') goto yy660;
- goto yy82;
- } else {
- if (yych <= '@') goto yy660;
- if (yych <= 'Z') goto yy82;
- goto yy660;
- }
- } else {
- if (yych <= '`') {
- if (yych <= '_') goto yy82;
- goto yy660;
- } else {
- if (yych <= 'z') goto yy82;
- if (yych <= 0x7F) goto yy660;
- goto yy82;
- }
- }
-yy653:
- YYDEBUG(653, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == '_') goto yy662;
- goto yy44;
-yy654:
- YYDEBUG(654, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'P') goto yy663;
- if (yych == 'p') goto yy663;
- goto yy44;
-yy655:
- YYDEBUG(655, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yybm[0+yych] & 16) {
- goto yy43;
- }
- YYDEBUG(656, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1908 "Zend/zend_language_scanner.l"
- {
- RETURN_TOKEN(T_METHOD_C);
-}
-#line 6485 "Zend/zend_language_scanner.c"
-yy657:
- YYDEBUG(657, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'E') goto yy664;
- if (yych == 'e') goto yy664;
- goto yy44;
-yy658:
- YYDEBUG(658, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'E') goto yy665;
- if (yych == 'e') goto yy665;
- goto yy44;
-yy659:
- YYDEBUG(659, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'E') goto yy667;
- if (yych == 'e') goto yy667;
- goto yy44;
-yy660:
- YYDEBUG(660, *YYCURSOR);
- ++YYCURSOR;
- YYDEBUG(661, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1283 "Zend/zend_language_scanner.l"
- {
- yyless(yyleng - 1);
- HANDLE_NEWLINES(yytext, yyleng);
- RETURN_TOKEN(T_YIELD_FROM);
-}
-#line 6515 "Zend/zend_language_scanner.c"
-yy662:
- YYDEBUG(662, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == '_') goto yy669;
- goto yy44;
-yy663:
- YYDEBUG(663, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'I') goto yy671;
- if (yych == 'i') goto yy671;
- goto yy44;
-yy664:
- YYDEBUG(664, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == '_') goto yy672;
- goto yy44;
-yy665:
- YYDEBUG(665, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yybm[0+yych] & 16) {
- goto yy43;
- }
- YYDEBUG(666, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1513 "Zend/zend_language_scanner.l"
- {
- RETURN_TOKEN(T_INCLUDE_ONCE);
-}
-#line 6544 "Zend/zend_language_scanner.c"
-yy667:
- YYDEBUG(667, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yybm[0+yych] & 16) {
- goto yy43;
- }
- YYDEBUG(668, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1521 "Zend/zend_language_scanner.l"
- {
- RETURN_TOKEN(T_REQUIRE_ONCE);
-}
-#line 6557 "Zend/zend_language_scanner.c"
-yy669:
- YYDEBUG(669, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yybm[0+yych] & 16) {
- goto yy43;
- }
- YYDEBUG(670, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1904 "Zend/zend_language_scanner.l"
- {
- RETURN_TOKEN(T_FUNC_C);
-}
-#line 6570 "Zend/zend_language_scanner.c"
-yy671:
- YYDEBUG(671, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'L') goto yy673;
- if (yych == 'l') goto yy673;
- goto yy44;
-yy672:
- YYDEBUG(672, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == '_') goto yy674;
- goto yy44;
-yy673:
- YYDEBUG(673, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'E') goto yy676;
- if (yych == 'e') goto yy676;
- goto yy44;
-yy674:
- YYDEBUG(674, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yybm[0+yych] & 16) {
- goto yy43;
- }
- YYDEBUG(675, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1924 "Zend/zend_language_scanner.l"
- {
- RETURN_TOKEN(T_NS_C);
-}
-#line 6600 "Zend/zend_language_scanner.c"
-yy676:
- YYDEBUG(676, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'R') goto yy677;
- if (yych != 'r') goto yy44;
-yy677:
- YYDEBUG(677, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yybm[0+yych] & 16) {
- goto yy43;
- }
- YYDEBUG(678, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1549 "Zend/zend_language_scanner.l"
- {
- RETURN_TOKEN(T_HALT_COMPILER);
-}
-#line 6618 "Zend/zend_language_scanner.c"
- }
-/* *********************************** */
-yyc_ST_LOOKING_FOR_PROPERTY:
- {
- static const unsigned char yybm[] = {
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 64, 64, 0, 0, 64, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 64, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 0, 0, 0, 0, 0, 0,
- 0, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 0, 0, 0, 0, 128,
- 0, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 0, 0, 0, 0, 0,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 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(679, *YYCURSOR);
- YYFILL(2);
- yych = *YYCURSOR;
- if (yybm[0+yych] & 64) {
- goto yy683;
- }
- if (yych <= '^') {
- if (yych <= '-') {
- if (yych >= '-') goto yy686;
- } else {
- if (yych <= '@') goto yy681;
- if (yych <= 'Z') goto yy687;
- }
- } else {
- if (yych <= '`') {
- if (yych <= '_') goto yy687;
- } else {
- if (yych <= 'z') goto yy687;
- if (yych >= 0x80) goto yy687;
- }
- }
-yy681:
- YYDEBUG(681, *YYCURSOR);
- ++YYCURSOR;
-yy682:
- YYDEBUG(682, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1443 "Zend/zend_language_scanner.l"
- {
- yyless(0);
- yy_pop_state();
- goto restart;
-}
-#line 6690 "Zend/zend_language_scanner.c"
-yy683:
- YYDEBUG(683, *YYCURSOR);
- ++YYCURSOR;
- YYFILL(1);
- yych = *YYCURSOR;
- YYDEBUG(684, *YYCURSOR);
- if (yybm[0+yych] & 64) {
- goto yy683;
- }
- YYDEBUG(685, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1430 "Zend/zend_language_scanner.l"
- {
- goto return_whitespace;
-}
-#line 6706 "Zend/zend_language_scanner.c"
-yy686:
- YYDEBUG(686, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == '>') goto yy690;
- goto yy682;
-yy687:
- YYDEBUG(687, *YYCURSOR);
- ++YYCURSOR;
- YYFILL(1);
- yych = *YYCURSOR;
- YYDEBUG(688, *YYCURSOR);
- if (yybm[0+yych] & 128) {
- goto yy687;
- }
- YYDEBUG(689, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1438 "Zend/zend_language_scanner.l"
- {
- yy_pop_state();
- RETURN_TOKEN_WITH_STR(T_STRING, 0);
-}
-#line 6728 "Zend/zend_language_scanner.c"
-yy690:
- YYDEBUG(690, *YYCURSOR);
- ++YYCURSOR;
- YYDEBUG(691, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1434 "Zend/zend_language_scanner.l"
- {
- RETURN_TOKEN(T_OBJECT_OPERATOR);
-}
-#line 6738 "Zend/zend_language_scanner.c"
- }
-/* *********************************** */
-yyc_ST_BACKQUOTE:
- {
- static const unsigned char yybm[] = {
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 0, 0, 0, 0, 0, 0,
- 0, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 0, 0, 0, 0, 128,
- 0, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 0, 0, 0, 0, 0,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 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(692, *YYCURSOR);
- YYFILL(2);
- yych = *YYCURSOR;
- if (yych <= '_') {
- if (yych == '$') goto yy696;
- } else {
- if (yych <= '`') goto yy697;
- if (yych == '{') goto yy699;
- }
- YYDEBUG(694, *YYCURSOR);
- ++YYCURSOR;
-yy695:
- YYDEBUG(695, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 2508 "Zend/zend_language_scanner.l"
- {
- if (YYCURSOR > YYLIMIT) {
- RETURN_TOKEN(END);
- }
- if (yytext[0] == '\\' && YYCURSOR < YYLIMIT) {
- YYCURSOR++;
- }
-
- while (YYCURSOR < YYLIMIT) {
- switch (*YYCURSOR++) {
- case '`':
- break;
- case '$':
- if (IS_LABEL_START(*YYCURSOR) || *YYCURSOR == '{') {
- break;
- }
- continue;
- case '{':
- if (*YYCURSOR == '$') {
- break;
- }
- continue;
- case '\\':
- if (YYCURSOR < YYLIMIT) {
- YYCURSOR++;
- }
- /* fall through */
- default:
- continue;
- }
-
- YYCURSOR--;
- break;
- }
-
- yyleng = YYCURSOR - SCNG(yy_text);
-
- 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 6836 "Zend/zend_language_scanner.c"
-yy696:
- YYDEBUG(696, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych <= '_') {
- if (yych <= '@') goto yy695;
- if (yych <= 'Z') goto yy700;
- if (yych <= '^') goto yy695;
- goto yy700;
- } else {
- if (yych <= 'z') {
- if (yych <= '`') goto yy695;
- goto yy700;
- } else {
- if (yych <= '{') goto yy703;
- if (yych <= 0x7F) goto yy695;
- goto yy700;
- }
- }
-yy697:
- YYDEBUG(697, *YYCURSOR);
- ++YYCURSOR;
- YYDEBUG(698, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 2448 "Zend/zend_language_scanner.l"
- {
- BEGIN(ST_IN_SCRIPTING);
- RETURN_TOKEN('`');
-}
-#line 6865 "Zend/zend_language_scanner.c"
-yy699:
- YYDEBUG(699, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == '$') goto yy705;
- goto yy695;
-yy700:
- YYDEBUG(700, *YYCURSOR);
- YYMARKER = ++YYCURSOR;
- YYFILL(3);
- yych = *YYCURSOR;
- YYDEBUG(701, *YYCURSOR);
- if (yybm[0+yych] & 128) {
- goto yy700;
- }
- if (yych == '-') goto yy707;
- if (yych <= '@') goto yy702;
- if (yych <= '[') goto yy709;
-yy702:
- YYDEBUG(702, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 2025 "Zend/zend_language_scanner.l"
- {
- RETURN_TOKEN_WITH_STR(T_VARIABLE, 1);
-}
-#line 6890 "Zend/zend_language_scanner.c"
-yy703:
- YYDEBUG(703, *YYCURSOR);
- ++YYCURSOR;
- YYDEBUG(704, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1724 "Zend/zend_language_scanner.l"
- {
- yy_push_state(ST_LOOKING_FOR_VARNAME);
- RETURN_TOKEN(T_DOLLAR_OPEN_CURLY_BRACES);
-}
-#line 6901 "Zend/zend_language_scanner.c"
-yy705:
- YYDEBUG(705, *YYCURSOR);
- ++YYCURSOR;
- YYDEBUG(706, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 2436 "Zend/zend_language_scanner.l"
- {
- yy_push_state(ST_IN_SCRIPTING);
- yyless(1);
- RETURN_TOKEN(T_CURLY_OPEN);
-}
-#line 6913 "Zend/zend_language_scanner.c"
-yy707:
- YYDEBUG(707, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == '>') goto yy711;
-yy708:
- YYDEBUG(708, *YYCURSOR);
- YYCURSOR = YYMARKER;
- goto yy702;
-yy709:
- YYDEBUG(709, *YYCURSOR);
- ++YYCURSOR;
- YYDEBUG(710, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 2019 "Zend/zend_language_scanner.l"
- {
- yyless(yyleng - 1);
- yy_push_state(ST_VAR_OFFSET);
- RETURN_TOKEN_WITH_STR(T_VARIABLE, 1);
-}
-#line 6933 "Zend/zend_language_scanner.c"
-yy711:
- YYDEBUG(711, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych <= '_') {
- if (yych <= '@') goto yy708;
- if (yych <= 'Z') goto yy712;
- if (yych <= '^') goto yy708;
- } else {
- if (yych <= '`') goto yy708;
- if (yych <= 'z') goto yy712;
- if (yych <= 0x7F) goto yy708;
- }
-yy712:
- YYDEBUG(712, *YYCURSOR);
- ++YYCURSOR;
- YYDEBUG(713, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 2011 "Zend/zend_language_scanner.l"
- {
- yyless(yyleng - 3);
- yy_push_state(ST_LOOKING_FOR_PROPERTY);
- RETURN_TOKEN_WITH_STR(T_VARIABLE, 1);
-}
-#line 6957 "Zend/zend_language_scanner.c"
- }
-/* *********************************** */
-yyc_ST_DOUBLE_QUOTES:
- {
- static const unsigned char yybm[] = {
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 0, 0, 0, 0, 0, 0,
- 0, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 0, 0, 0, 0, 128,
- 0, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 0, 0, 0, 0, 0,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 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(714, *YYCURSOR);
- YYFILL(2);
- yych = *YYCURSOR;
- if (yych <= '#') {
- if (yych == '"') goto yy718;
- } else {
- if (yych <= '$') goto yy720;
- if (yych == '{') goto yy721;
- }
- YYDEBUG(716, *YYCURSOR);
- ++YYCURSOR;
-yy717:
- YYDEBUG(717, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 2454 "Zend/zend_language_scanner.l"
- {
- if (GET_DOUBLE_QUOTES_SCANNED_LENGTH()) {
- YYCURSOR += GET_DOUBLE_QUOTES_SCANNED_LENGTH() - 1;
- SET_DOUBLE_QUOTES_SCANNED_LENGTH(0);
-
- goto double_quotes_scan_done;
- }
-
- if (YYCURSOR > YYLIMIT) {
- RETURN_TOKEN(END);
- }
- if (yytext[0] == '\\' && YYCURSOR < YYLIMIT) {
- YYCURSOR++;
- }
-
- while (YYCURSOR < YYLIMIT) {
- switch (*YYCURSOR++) {
- case '"':
- break;
- case '$':
- if (IS_LABEL_START(*YYCURSOR) || *YYCURSOR == '{') {
- break;
- }
- continue;
- case '{':
- if (*YYCURSOR == '$') {
- break;
- }
- continue;
- case '\\':
- if (YYCURSOR < YYLIMIT) {
- YYCURSOR++;
- }
- /* fall through */
- default:
- continue;
- }
-
- YYCURSOR--;
- break;
- }
-
-double_quotes_scan_done:
- yyleng = YYCURSOR - SCNG(yy_text);
-
- 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 7063 "Zend/zend_language_scanner.c"
-yy718:
- YYDEBUG(718, *YYCURSOR);
- ++YYCURSOR;
- YYDEBUG(719, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 2443 "Zend/zend_language_scanner.l"
- {
- BEGIN(ST_IN_SCRIPTING);
- RETURN_TOKEN('"');
-}
-#line 7074 "Zend/zend_language_scanner.c"
-yy720:
- YYDEBUG(720, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych <= '_') {
- if (yych <= '@') goto yy717;
- if (yych <= 'Z') goto yy722;
- if (yych <= '^') goto yy717;
- goto yy722;
- } else {
- if (yych <= 'z') {
- if (yych <= '`') goto yy717;
- goto yy722;
- } else {
- if (yych <= '{') goto yy725;
- if (yych <= 0x7F) goto yy717;
- goto yy722;
- }
- }
-yy721:
- YYDEBUG(721, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == '$') goto yy727;
- goto yy717;
-yy722:
- YYDEBUG(722, *YYCURSOR);
- YYMARKER = ++YYCURSOR;
- YYFILL(3);
- yych = *YYCURSOR;
- YYDEBUG(723, *YYCURSOR);
- if (yybm[0+yych] & 128) {
- goto yy722;
- }
- if (yych == '-') goto yy729;
- if (yych <= '@') goto yy724;
- if (yych <= '[') goto yy731;
-yy724:
- YYDEBUG(724, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 2025 "Zend/zend_language_scanner.l"
- {
- RETURN_TOKEN_WITH_STR(T_VARIABLE, 1);
-}
-#line 7117 "Zend/zend_language_scanner.c"
-yy725:
- YYDEBUG(725, *YYCURSOR);
- ++YYCURSOR;
- YYDEBUG(726, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1724 "Zend/zend_language_scanner.l"
- {
- yy_push_state(ST_LOOKING_FOR_VARNAME);
- RETURN_TOKEN(T_DOLLAR_OPEN_CURLY_BRACES);
-}
-#line 7128 "Zend/zend_language_scanner.c"
-yy727:
- YYDEBUG(727, *YYCURSOR);
- ++YYCURSOR;
- YYDEBUG(728, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 2436 "Zend/zend_language_scanner.l"
- {
- yy_push_state(ST_IN_SCRIPTING);
- yyless(1);
- RETURN_TOKEN(T_CURLY_OPEN);
-}
-#line 7140 "Zend/zend_language_scanner.c"
-yy729:
- YYDEBUG(729, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == '>') goto yy733;
-yy730:
- YYDEBUG(730, *YYCURSOR);
- YYCURSOR = YYMARKER;
- goto yy724;
-yy731:
- YYDEBUG(731, *YYCURSOR);
- ++YYCURSOR;
- YYDEBUG(732, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 2019 "Zend/zend_language_scanner.l"
- {
- yyless(yyleng - 1);
- yy_push_state(ST_VAR_OFFSET);
- RETURN_TOKEN_WITH_STR(T_VARIABLE, 1);
-}
-#line 7160 "Zend/zend_language_scanner.c"
-yy733:
- YYDEBUG(733, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych <= '_') {
- if (yych <= '@') goto yy730;
- if (yych <= 'Z') goto yy734;
- if (yych <= '^') goto yy730;
- } else {
- if (yych <= '`') goto yy730;
- if (yych <= 'z') goto yy734;
- if (yych <= 0x7F) goto yy730;
- }
-yy734:
- YYDEBUG(734, *YYCURSOR);
- ++YYCURSOR;
- YYDEBUG(735, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 2011 "Zend/zend_language_scanner.l"
- {
- yyless(yyleng - 3);
- yy_push_state(ST_LOOKING_FOR_PROPERTY);
- RETURN_TOKEN_WITH_STR(T_VARIABLE, 1);
-}
-#line 7184 "Zend/zend_language_scanner.c"
- }
-/* *********************************** */
-yyc_ST_HEREDOC:
- {
- static const unsigned char yybm[] = {
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 0, 0, 0, 0, 0, 0,
- 0, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 0, 0, 0, 0, 128,
- 0, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 0, 0, 0, 0, 0,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 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(736, *YYCURSOR);
- YYFILL(2);
- yych = *YYCURSOR;
- if (yych == '$') goto yy740;
- if (yych == '{') goto yy741;
- YYDEBUG(738, *YYCURSOR);
- ++YYCURSOR;
-yy739:
- YYDEBUG(739, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 2554 "Zend/zend_language_scanner.l"
- {
- 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);
- }
-
- YYCURSOR--;
-
- while (YYCURSOR < YYLIMIT) {
- switch (*YYCURSOR++) {
- case '\r':
- if (*YYCURSOR == '\n') {
- YYCURSOR++;
- }
- /* 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)) {
- if (IS_LABEL_SUCCESSOR(YYCURSOR[heredoc_label->length])) {
- continue;
- }
-
- 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 (PARSER_MODE()) {
- RETURN_TOKEN(T_ERROR);
- }
- }
-
- /* 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 */
-
- 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 '$':
- if (IS_LABEL_START(*YYCURSOR) || *YYCURSOR == '{') {
- break;
- }
- continue;
- case '{':
- if (*YYCURSOR == '$') {
- break;
- }
- continue;
- case '\\':
- if (YYCURSOR < YYLIMIT && *YYCURSOR != '\n' && *YYCURSOR != '\r') {
- YYCURSOR++;
- }
- /* fall through */
- default:
- continue;
- }
-
- YYCURSOR--;
- break;
- }
-
-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_string_efree(copy);
- } else {
- HANDLE_NEWLINES(yytext, yyleng - newline);
- }
-
- RETURN_TOKEN_WITH_VAL(T_ENCAPSED_AND_WHITESPACE);
-}
-#line 7356 "Zend/zend_language_scanner.c"
-yy740:
- YYDEBUG(740, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych <= '_') {
- if (yych <= '@') goto yy739;
- if (yych <= 'Z') goto yy742;
- if (yych <= '^') goto yy739;
- goto yy742;
- } else {
- if (yych <= 'z') {
- if (yych <= '`') goto yy739;
- goto yy742;
- } else {
- if (yych <= '{') goto yy745;
- if (yych <= 0x7F) goto yy739;
- goto yy742;
- }
- }
-yy741:
- YYDEBUG(741, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == '$') goto yy747;
- goto yy739;
-yy742:
- YYDEBUG(742, *YYCURSOR);
- YYMARKER = ++YYCURSOR;
- YYFILL(3);
- yych = *YYCURSOR;
- YYDEBUG(743, *YYCURSOR);
- if (yybm[0+yych] & 128) {
- goto yy742;
- }
- if (yych == '-') goto yy749;
- if (yych <= '@') goto yy744;
- if (yych <= '[') goto yy751;
-yy744:
- YYDEBUG(744, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 2025 "Zend/zend_language_scanner.l"
- {
- RETURN_TOKEN_WITH_STR(T_VARIABLE, 1);
-}
-#line 7399 "Zend/zend_language_scanner.c"
-yy745:
- YYDEBUG(745, *YYCURSOR);
- ++YYCURSOR;
- YYDEBUG(746, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1724 "Zend/zend_language_scanner.l"
- {
- yy_push_state(ST_LOOKING_FOR_VARNAME);
- RETURN_TOKEN(T_DOLLAR_OPEN_CURLY_BRACES);
-}
-#line 7410 "Zend/zend_language_scanner.c"
-yy747:
- YYDEBUG(747, *YYCURSOR);
- ++YYCURSOR;
- YYDEBUG(748, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 2436 "Zend/zend_language_scanner.l"
- {
- yy_push_state(ST_IN_SCRIPTING);
- yyless(1);
- RETURN_TOKEN(T_CURLY_OPEN);
-}
-#line 7422 "Zend/zend_language_scanner.c"
-yy749:
- YYDEBUG(749, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == '>') goto yy753;
-yy750:
- YYDEBUG(750, *YYCURSOR);
- YYCURSOR = YYMARKER;
- goto yy744;
-yy751:
- YYDEBUG(751, *YYCURSOR);
- ++YYCURSOR;
- YYDEBUG(752, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 2019 "Zend/zend_language_scanner.l"
- {
- yyless(yyleng - 1);
- yy_push_state(ST_VAR_OFFSET);
- RETURN_TOKEN_WITH_STR(T_VARIABLE, 1);
-}
-#line 7442 "Zend/zend_language_scanner.c"
-yy753:
- YYDEBUG(753, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych <= '_') {
- if (yych <= '@') goto yy750;
- if (yych <= 'Z') goto yy754;
- if (yych <= '^') goto yy750;
- } else {
- if (yych <= '`') goto yy750;
- if (yych <= 'z') goto yy754;
- if (yych <= 0x7F) goto yy750;
- }
-yy754:
- YYDEBUG(754, *YYCURSOR);
- ++YYCURSOR;
- YYDEBUG(755, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 2011 "Zend/zend_language_scanner.l"
- {
- yyless(yyleng - 3);
- yy_push_state(ST_LOOKING_FOR_PROPERTY);
- RETURN_TOKEN_WITH_STR(T_VARIABLE, 1);
-}
-#line 7466 "Zend/zend_language_scanner.c"
- }
-/* *********************************** */
-yyc_ST_LOOKING_FOR_VARNAME:
- {
- static const unsigned char yybm[] = {
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 0, 0, 0, 0, 0, 0,
- 0, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 0, 0, 0, 0, 128,
- 0, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 0, 0, 0, 0, 0,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 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(756, *YYCURSOR);
- YYFILL(2);
- yych = *YYCURSOR;
- if (yych <= '_') {
- if (yych <= '@') goto yy758;
- if (yych <= 'Z') goto yy760;
- if (yych >= '_') goto yy760;
- } else {
- if (yych <= '`') goto yy758;
- if (yych <= 'z') goto yy760;
- if (yych >= 0x80) goto yy760;
- }
-yy758:
- YYDEBUG(758, *YYCURSOR);
- ++YYCURSOR;
-yy759:
- YYDEBUG(759, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1747 "Zend/zend_language_scanner.l"
- {
- yyless(0);
- yy_pop_state();
- yy_push_state(ST_IN_SCRIPTING);
- goto restart;
-}
-#line 7530 "Zend/zend_language_scanner.c"
-yy760:
- YYDEBUG(760, *YYCURSOR);
- yych = *(YYMARKER = ++YYCURSOR);
- if (yych <= '_') {
- if (yych <= '@') {
- if (yych <= '/') goto yy759;
- if (yych <= '9') goto yy762;
- goto yy759;
- } else {
- if (yych <= '[') goto yy762;
- if (yych <= '^') goto yy759;
- goto yy762;
- }
- } else {
- if (yych <= '|') {
- if (yych <= '`') goto yy759;
- if (yych <= 'z') goto yy762;
- goto yy759;
- } else {
- if (yych <= '}') goto yy762;
- if (yych <= 0x7F) goto yy759;
- goto yy762;
- }
- }
-yy761:
- YYDEBUG(761, *YYCURSOR);
- ++YYCURSOR;
- YYFILL(1);
- yych = *YYCURSOR;
-yy762:
- YYDEBUG(762, *YYCURSOR);
- if (yybm[0+yych] & 128) {
- goto yy761;
- }
- if (yych <= '@') goto yy763;
- if (yych <= '[') goto yy764;
- if (yych == '}') goto yy764;
-yy763:
- YYDEBUG(763, *YYCURSOR);
- YYCURSOR = YYMARKER;
- goto yy759;
-yy764:
- YYDEBUG(764, *YYCURSOR);
- ++YYCURSOR;
- YYDEBUG(765, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1739 "Zend/zend_language_scanner.l"
- {
- yyless(yyleng - 1);
- yy_pop_state();
- yy_push_state(ST_IN_SCRIPTING);
- RETURN_TOKEN_WITH_STR(T_STRING_VARNAME, 0);
-}
-#line 7584 "Zend/zend_language_scanner.c"
- }
-/* *********************************** */
-yyc_ST_VAR_OFFSET:
- {
- static const unsigned char yybm[] = {
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 240, 240, 176, 176, 176, 176, 176, 176,
- 176, 176, 0, 0, 0, 0, 0, 0,
- 0, 160, 160, 160, 160, 160, 160, 32,
- 32, 32, 32, 32, 32, 32, 32, 32,
- 32, 32, 32, 32, 32, 32, 32, 32,
- 32, 32, 32, 0, 0, 0, 0, 32,
- 0, 160, 160, 160, 160, 160, 160, 32,
- 32, 32, 32, 32, 32, 32, 32, 32,
- 32, 32, 32, 32, 32, 32, 32, 32,
- 32, 32, 32, 0, 0, 0, 0, 0,
- 32, 32, 32, 32, 32, 32, 32, 32,
- 32, 32, 32, 32, 32, 32, 32, 32,
- 32, 32, 32, 32, 32, 32, 32, 32,
- 32, 32, 32, 32, 32, 32, 32, 32,
- 32, 32, 32, 32, 32, 32, 32, 32,
- 32, 32, 32, 32, 32, 32, 32, 32,
- 32, 32, 32, 32, 32, 32, 32, 32,
- 32, 32, 32, 32, 32, 32, 32, 32,
- 32, 32, 32, 32, 32, 32, 32, 32,
- 32, 32, 32, 32, 32, 32, 32, 32,
- 32, 32, 32, 32, 32, 32, 32, 32,
- 32, 32, 32, 32, 32, 32, 32, 32,
- 32, 32, 32, 32, 32, 32, 32, 32,
- 32, 32, 32, 32, 32, 32, 32, 32,
- 32, 32, 32, 32, 32, 32, 32, 32,
- 32, 32, 32, 32, 32, 32, 32, 32,
- };
- YYDEBUG(766, *YYCURSOR);
- YYFILL(3);
- yych = *YYCURSOR;
- if (yych <= '0') {
- if (yych <= ' ') {
- if (yych <= '\f') {
- if (yych <= 0x08) goto yy768;
- if (yych <= '\n') goto yy770;
- } else {
- if (yych <= '\r') goto yy770;
- if (yych >= ' ') goto yy770;
- }
- } else {
- if (yych <= '$') {
- if (yych <= '"') goto yy772;
- if (yych <= '#') goto yy770;
- goto yy774;
- } else {
- if (yych == '\'') goto yy770;
- if (yych <= '/') goto yy772;
- goto yy775;
- }
- }
- } else {
- if (yych <= ']') {
- if (yych <= 'Z') {
- if (yych <= '9') goto yy777;
- if (yych <= '@') goto yy772;
- goto yy779;
- } else {
- if (yych <= '[') goto yy772;
- if (yych <= '\\') goto yy770;
- goto yy782;
- }
- } else {
- if (yych <= '`') {
- if (yych == '_') goto yy779;
- goto yy772;
- } else {
- if (yych <= 'z') goto yy779;
- if (yych <= '~') goto yy772;
- if (yych >= 0x80) goto yy779;
- }
- }
- }
-yy768:
- YYDEBUG(768, *YYCURSOR);
- ++YYCURSOR;
- YYDEBUG(769, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 2769 "Zend/zend_language_scanner.l"
- {
- if (YYCURSOR > YYLIMIT) {
- RETURN_TOKEN(END);
- }
-
- if (!SCNG(heredoc_scan_ahead)) {
- zend_error(E_COMPILE_WARNING, "Unexpected character in input: '%c' (ASCII=%d) state=%d", yytext[0], yytext[0], YYSTATE);
- }
- goto restart;
-}
-#line 7684 "Zend/zend_language_scanner.c"
-yy770:
- YYDEBUG(770, *YYCURSOR);
- ++YYCURSOR;
- YYDEBUG(771, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 2039 "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_WITH_VAL(T_ENCAPSED_AND_WHITESPACE);
-}
-#line 7698 "Zend/zend_language_scanner.c"
-yy772:
- YYDEBUG(772, *YYCURSOR);
- ++YYCURSOR;
-yy773:
- YYDEBUG(773, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 2034 "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 7710 "Zend/zend_language_scanner.c"
-yy774:
- YYDEBUG(774, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych <= '_') {
- if (yych <= '@') goto yy773;
- if (yych <= 'Z') goto yy784;
- if (yych <= '^') goto yy773;
- goto yy784;
- } else {
- if (yych <= '`') goto yy773;
- if (yych <= 'z') goto yy784;
- if (yych <= 0x7F) goto yy773;
- goto yy784;
- }
-yy775:
- YYDEBUG(775, *YYCURSOR);
- yych = *(YYMARKER = ++YYCURSOR);
- if (yych <= 'W') {
- if (yych <= '9') {
- if (yych >= '0') goto yy787;
- } else {
- if (yych == 'B') goto yy790;
- }
- } else {
- if (yych <= 'b') {
- if (yych <= 'X') goto yy792;
- if (yych >= 'b') goto yy790;
- } else {
- if (yych == 'x') goto yy792;
- }
- }
-yy776:
- YYDEBUG(776, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1862 "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;
- errno = 0;
- ZVAL_LONG(zendlval, ZEND_STRTOL(yytext, &end, 10));
- if (errno == ERANGE) {
- goto string;
- }
- ZEND_ASSERT(end == yytext + yyleng);
- } else {
-string:
- ZVAL_STRINGL(zendlval, yytext, yyleng);
- }
- RETURN_TOKEN_WITH_VAL(T_NUM_STRING);
-}
-#line 7761 "Zend/zend_language_scanner.c"
-yy777:
- YYDEBUG(777, *YYCURSOR);
- ++YYCURSOR;
- YYFILL(1);
- yych = *YYCURSOR;
- YYDEBUG(778, *YYCURSOR);
- if (yybm[0+yych] & 16) {
- goto yy777;
- }
- goto yy776;
-yy779:
- YYDEBUG(779, *YYCURSOR);
- ++YYCURSOR;
- YYFILL(1);
- yych = *YYCURSOR;
- YYDEBUG(780, *YYCURSOR);
- if (yybm[0+yych] & 32) {
- goto yy779;
- }
- YYDEBUG(781, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 2047 "Zend/zend_language_scanner.l"
- {
- RETURN_TOKEN_WITH_STR(T_STRING, 0);
-}
-#line 7787 "Zend/zend_language_scanner.c"
-yy782:
- YYDEBUG(782, *YYCURSOR);
- ++YYCURSOR;
- YYDEBUG(783, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 2029 "Zend/zend_language_scanner.l"
- {
- yy_pop_state();
- RETURN_TOKEN(']');
-}
-#line 7798 "Zend/zend_language_scanner.c"
-yy784:
- YYDEBUG(784, *YYCURSOR);
- ++YYCURSOR;
- YYFILL(1);
- yych = *YYCURSOR;
- YYDEBUG(785, *YYCURSOR);
- if (yych <= '^') {
- if (yych <= '9') {
- if (yych >= '0') goto yy784;
- } else {
- if (yych <= '@') goto yy786;
- if (yych <= 'Z') goto yy784;
- }
- } else {
- if (yych <= '`') {
- if (yych <= '_') goto yy784;
- } else {
- if (yych <= 'z') goto yy784;
- if (yych >= 0x80) goto yy784;
- }
- }
-yy786:
- YYDEBUG(786, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 2025 "Zend/zend_language_scanner.l"
- {
- RETURN_TOKEN_WITH_STR(T_VARIABLE, 1);
-}
-#line 7827 "Zend/zend_language_scanner.c"
-yy787:
- YYDEBUG(787, *YYCURSOR);
- ++YYCURSOR;
- YYFILL(1);
- yych = *YYCURSOR;
- YYDEBUG(788, *YYCURSOR);
- if (yych <= '/') goto yy789;
- if (yych <= '9') goto yy787;
-yy789:
- YYDEBUG(789, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1878 "Zend/zend_language_scanner.l"
- { /* Offset must be treated as a 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 7848 "Zend/zend_language_scanner.c"
-yy790:
- YYDEBUG(790, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yybm[0+yych] & 64) {
- goto yy793;
- }
-yy791:
- YYDEBUG(791, *YYCURSOR);
- YYCURSOR = YYMARKER;
- goto yy776;
-yy792:
- YYDEBUG(792, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yybm[0+yych] & 128) {
- goto yy795;
- }
- goto yy791;
-yy793:
- YYDEBUG(793, *YYCURSOR);
- ++YYCURSOR;
- YYFILL(1);
- yych = *YYCURSOR;
- YYDEBUG(794, *YYCURSOR);
- if (yybm[0+yych] & 64) {
- goto yy793;
- }
- goto yy789;
-yy795:
- YYDEBUG(795, *YYCURSOR);
- ++YYCURSOR;
- YYFILL(1);
- yych = *YYCURSOR;
- YYDEBUG(796, *YYCURSOR);
- if (yybm[0+yych] & 128) {
- goto yy795;
- }
- goto yy789;
- }
-/* *********************************** */
-yyc_INITIAL:
- YYDEBUG(797, *YYCURSOR);
- YYFILL(7);
- yych = *YYCURSOR;
- if (yych == '<') goto yy801;
- YYDEBUG(799, *YYCURSOR);
- ++YYCURSOR;
-yy800:
- YYDEBUG(800, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1960 "Zend/zend_language_scanner.l"
- {
- if (YYCURSOR > YYLIMIT) {
- RETURN_TOKEN(END);
- }
-
-inline_char_handler:
-
- while (1) {
- YYCTYPE *ptr = memchr(YYCURSOR, '<', YYLIMIT - YYCURSOR);
-
- YYCURSOR = ptr ? ptr + 1 : YYLIMIT;
-
- if (YYCURSOR >= YYLIMIT) {
- break;
- }
-
- if (*YYCURSOR == '?') {
- if (CG(short_tags) || !strncasecmp((char*)YYCURSOR + 1, "php", 3) || (*(YYCURSOR + 1) == '=')) { /* Assume [ \t\n\r] follows "php" */
-
- YYCURSOR--;
- break;
- }
- }
- }
-
- yyleng = YYCURSOR - SCNG(yy_text);
-
- if (SCNG(output_filter)) {
- size_t readsize;
- char *s = NULL;
- size_t sz = 0;
- // TODO: avoid reallocation ???
- readsize = SCNG(output_filter)((unsigned char **)&s, &sz, (unsigned char *)yytext, (size_t)yyleng);
- ZVAL_STRINGL(zendlval, s, sz);
- efree(s);
- if (readsize < yyleng) {
- yyless(readsize);
- }
- } else if (yyleng == 1) {
- ZVAL_INTERNED_STR(zendlval, ZSTR_CHAR((zend_uchar)*yytext));
- } else {
- ZVAL_STRINGL(zendlval, yytext, yyleng);
- }
- HANDLE_NEWLINES(yytext, yyleng);
- RETURN_TOKEN_WITH_VAL(T_INLINE_HTML);
-}
-#line 7945 "Zend/zend_language_scanner.c"
-yy801:
- YYDEBUG(801, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych != '?') goto yy800;
- YYDEBUG(802, *YYCURSOR);
- yych = *(YYMARKER = ++YYCURSOR);
- if (yych <= 'O') {
- if (yych == '=') goto yy804;
- } else {
- if (yych <= 'P') goto yy806;
- if (yych == 'p') goto yy806;
- }
-yy803:
- YYDEBUG(803, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1948 "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 7973 "Zend/zend_language_scanner.c"
-yy804:
- YYDEBUG(804, *YYCURSOR);
- ++YYCURSOR;
- YYDEBUG(805, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1929 "Zend/zend_language_scanner.l"
- {
- BEGIN(ST_IN_SCRIPTING);
- if (PARSER_MODE()) {
- RETURN_TOKEN(T_ECHO);
- }
- RETURN_TOKEN(T_OPEN_TAG_WITH_ECHO);
-}
-#line 7987 "Zend/zend_language_scanner.c"
-yy806:
- YYDEBUG(806, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'H') goto yy808;
- if (yych == 'h') goto yy808;
-yy807:
- YYDEBUG(807, *YYCURSOR);
- YYCURSOR = YYMARKER;
- goto yy803;
-yy808:
- YYDEBUG(808, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == 'P') goto yy809;
- if (yych != 'p') goto yy807;
-yy809:
- YYDEBUG(809, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych <= '\f') {
- if (yych <= 0x08) goto yy807;
- if (yych >= '\v') goto yy807;
- } else {
- if (yych <= '\r') goto yy812;
- if (yych != ' ') goto yy807;
- }
-yy810:
- YYDEBUG(810, *YYCURSOR);
- ++YYCURSOR;
-yy811:
- YYDEBUG(811, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 1938 "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 8027 "Zend/zend_language_scanner.c"
-yy812:
- YYDEBUG(812, *YYCURSOR);
- yych = *++YYCURSOR;
- if (yych == '\n') goto yy810;
- goto yy811;
-/* *********************************** */
-yyc_ST_END_HEREDOC:
- YYDEBUG(813, *YYCURSOR);
- YYFILL(1);
- yych = *YYCURSOR;
- YYDEBUG(815, *YYCURSOR);
- ++YYCURSOR;
- YYDEBUG(816, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 2422 "Zend/zend_language_scanner.l"
- {
- zend_heredoc_label *heredoc_label = zend_ptr_stack_pop(&SCNG(heredoc_label_stack));
-
- yyleng = heredoc_label->indentation + heredoc_label->length;
- YYCURSOR += yyleng - 1;
-
- heredoc_label_dtor(heredoc_label);
- efree(heredoc_label);
-
- BEGIN(ST_IN_SCRIPTING);
- RETURN_TOKEN(T_END_HEREDOC);
-}
-#line 8055 "Zend/zend_language_scanner.c"
-/* *********************************** */
-yyc_ST_NOWDOC:
- YYDEBUG(817, *YYCURSOR);
- YYFILL(1);
- yych = *YYCURSOR;
- YYDEBUG(819, *YYCURSOR);
- ++YYCURSOR;
- YYDEBUG(820, *YYCURSOR);
- yyleng = YYCURSOR - SCNG(yy_text);
-#line 2678 "Zend/zend_language_scanner.l"
- {
- 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);
- }
-
- YYCURSOR--;
-
- while (YYCURSOR < YYLIMIT) {
- switch (*YYCURSOR++) {
- case '\r':
- if (*YYCURSOR == '\n') {
- YYCURSOR++;
- }
- /* 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)) {
- if (IS_LABEL_SUCCESSOR(YYCURSOR[heredoc_label->length])) {
- continue;
- }
-
- 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 (PARSER_MODE()) {
- RETURN_TOKEN(T_ERROR);
- }
- }
-
- /* 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 */
-
- YYCURSOR -= indentation;
- heredoc_label->indentation = indentation;
-
- BEGIN(ST_END_HEREDOC);
-
- goto nowdoc_scan_done;
- }
- /* fall through */
- default:
- continue;
- }
- }
-
-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);
- }
- }
-
- HANDLE_NEWLINES(yytext, yyleng - newline);
- RETURN_TOKEN_WITH_VAL(T_ENCAPSED_AND_WHITESPACE);
-}
-#line 8155 "Zend/zend_language_scanner.c"
-}
-#line 2780 "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 9241ae3fc2..3640b9a5ea 100644
--- a/Zend/zend_language_scanner.h
+++ b/Zend/zend_language_scanner.h
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| Zend Engine |
+----------------------------------------------------------------------+
- | Copyright (c) 1998-2018 Zend Technologies Ltd. (http://www.zend.com) |
+ | Copyright (c) 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 |
@@ -74,13 +74,3 @@ ZEND_API void zend_lex_tstring(zval *zv);
END_EXTERN_C()
#endif
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * indent-tabs-mode: t
- * End:
- * vim600: sw=4 ts=4 fdm=marker
- * vim<600: sw=4 ts=4
- */
diff --git a/Zend/zend_language_scanner.l b/Zend/zend_language_scanner.l
index 2c35d38ea4..db493211e2 100644
--- a/Zend/zend_language_scanner.l
+++ b/Zend/zend_language_scanner.l
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| Zend Engine |
+----------------------------------------------------------------------+
- | Copyright (c) 1998-2018 Zend Technologies Ltd. (http://www.zend.com) |
+ | Copyright (c) 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 |
@@ -46,7 +46,6 @@
#include "zend_strtod.h"
#include "zend_exceptions.h"
#include "zend_virtual_cwd.h"
-#include "tsrm_config_common.h"
#define YYCTYPE unsigned char
#define YYFILL(n) { if ((YYCURSOR + n) >= (YYLIMIT + ZEND_MMAP_AHEAD)) { return 0; } }
@@ -75,9 +74,7 @@
# error ZEND_MMAP_AHEAD should be greater than or equal to YYMAXFILL
#endif
-#ifdef HAVE_STDARG_H
-# include <stdarg.h>
-#endif
+#include <stdarg.h>
#ifdef HAVE_UNISTD_H
# include <unistd.h>
@@ -87,6 +84,7 @@
#define SCNG LANG_SCNG
#ifdef ZTS
ZEND_API ts_rsrc_id language_scanner_globals_id;
+ZEND_API size_t language_scanner_globals_offset;
#else
ZEND_API zend_php_scanner_globals language_scanner_globals;
#endif
@@ -122,6 +120,21 @@ do { \
BEGIN_EXTERN_C()
+static void strip_underscores(char *str, size_t *len)
+{
+ char *src = str, *dest = str;
+ while (*src != '\0') {
+ if (*src != '_') {
+ *dest = *src;
+ dest++;
+ } else {
+ --(*len);
+ }
+ src++;
+ }
+ *dest = '\0';
+}
+
static size_t encoding_filter_script_to_internal(unsigned char **to, size_t *to_length, const unsigned char *from, size_t from_length)
{
const zend_encoding *internal_encoding = zend_multibyte_get_internal_encoding();
@@ -501,20 +514,16 @@ ZEND_API int zend_multibyte_set_filter(const zend_encoding *onetime_encoding)
ZEND_API int open_file_for_scanning(zend_file_handle *file_handle)
{
char *buf;
- size_t size, offset = 0;
+ size_t size;
zend_string *compiled_filename;
- /* The shebang line was read, get the current position to obtain the buffer start */
- if (CG(start_lineno) == 2 && file_handle->type == ZEND_HANDLE_FP && file_handle->handle.fp) {
- if ((offset = ftell(file_handle->handle.fp)) == (size_t)-1) {
- offset = 0;
- }
- }
-
if (zend_stream_fixup(file_handle, &buf, &size) == FAILURE) {
+ /* Still add it to open_files to make destroy_file_handle work */
+ zend_llist_add_element(&CG(open_files), file_handle);
return FAILURE;
}
+ ZEND_ASSERT(!EG(exception) && "stream_fixup() should have failed");
zend_llist_add_element(&CG(open_files), file_handle);
if (file_handle->handle.stream.handle >= (void*)file_handle && file_handle->handle.stream.handle <= (void*)(file_handle+1)) {
zend_file_handle *fh = (zend_file_handle*)zend_llist_get_last(&CG(open_files));
@@ -544,13 +553,18 @@ ZEND_API int open_file_for_scanning(zend_file_handle *file_handle)
size = SCNG(script_filtered_size);
}
}
- SCNG(yy_start) = (unsigned char *)buf - offset;
+ SCNG(yy_start) = (unsigned char *)buf;
yy_scan_buffer(buf, (unsigned int)size);
} else {
zend_error_noreturn(E_COMPILE_ERROR, "zend_stream_mmap() failed");
}
- BEGIN(INITIAL);
+ if (CG(skip_shebang)) {
+ CG(skip_shebang) = 0;
+ BEGIN(SHEBANG);
+ } else {
+ BEGIN(INITIAL);
+ }
if (file_handle->opened_path) {
compiled_filename = zend_string_copy(file_handle->opened_path);
@@ -561,14 +575,8 @@ ZEND_API int open_file_for_scanning(zend_file_handle *file_handle)
zend_set_compiled_filename(compiled_filename);
zend_string_release_ex(compiled_filename, 0);
- if (CG(start_lineno)) {
- CG(zend_lineno) = CG(start_lineno);
- CG(start_lineno) = 0;
- } else {
- CG(zend_lineno) = 1;
- }
-
RESET_DOC_COMMENT();
+ CG(zend_lineno) = 1;
CG(increment_lineno) = 0;
return SUCCESS;
}
@@ -593,6 +601,9 @@ static zend_op_array *zend_compile(int type)
init_op_array(op_array, type, INITIAL_OP_ARRAY_SIZE);
CG(active_op_array) = op_array;
+ /* Use heap to not waste arena memory */
+ op_array->fn_flags |= ZEND_ACC_HEAP_RT_CACHE;
+
if (zend_ast_process) {
zend_ast_process(CG(ast));
}
@@ -626,11 +637,13 @@ ZEND_API zend_op_array *compile_file(zend_file_handle *file_handle, int type)
zend_save_lexical_state(&original_lex_state);
if (open_file_for_scanning(file_handle)==FAILURE) {
- if (type==ZEND_REQUIRE) {
- zend_message_dispatcher(ZMSG_FAILED_REQUIRE_FOPEN, file_handle->filename);
- zend_bailout();
- } else {
- zend_message_dispatcher(ZMSG_FAILED_INCLUDE_FOPEN, file_handle->filename);
+ if (!EG(exception)) {
+ if (type==ZEND_REQUIRE) {
+ zend_message_dispatcher(ZMSG_FAILED_REQUIRE_FOPEN, file_handle->filename);
+ zend_bailout();
+ } else {
+ zend_message_dispatcher(ZMSG_FAILED_INCLUDE_FOPEN, file_handle->filename);
+ }
}
} else {
op_array = zend_compile(ZEND_USER_FUNCTION);
@@ -652,11 +665,7 @@ zend_op_array *compile_filename(int type, zval *filename)
ZVAL_STR(&tmp, zval_get_string(filename));
filename = &tmp;
}
- file_handle.filename = Z_STRVAL_P(filename);
- file_handle.free_filename = 0;
- file_handle.type = ZEND_HANDLE_FILENAME;
- file_handle.opened_path = NULL;
- file_handle.handle.fp = NULL;
+ zend_stream_init_filename(&file_handle, Z_STRVAL_P(filename));
retval = zend_compile_file(&file_handle, type);
if (retval && file_handle.handle.stream.handle) {
@@ -782,10 +791,7 @@ int highlight_file(char *filename, zend_syntax_highlighter_ini *syntax_highlight
zend_lex_state original_lex_state;
zend_file_handle file_handle;
- file_handle.type = ZEND_HANDLE_FILENAME;
- file_handle.filename = filename;
- file_handle.free_filename = 0;
- file_handle.opened_path = NULL;
+ zend_stream_init_filename(&file_handle, filename);
zend_save_lexical_state(&original_lex_state);
if (open_file_for_scanning(&file_handle)==FAILURE) {
zend_message_dispatcher(ZMSG_FAILED_HIGHLIGHT_FOPEN, filename);
@@ -1228,9 +1234,12 @@ static void copy_heredoc_label_stack(void *void_heredoc_label)
goto emit_token_with_str; \
} while (0)
-#define SKIP_TOKEN(_token) do { \
+#define RETURN_OR_SKIP_TOKEN(_token) do { \
token = _token; \
- goto skip_token; \
+ if (PARSER_MODE()) { \
+ goto skip_token; \
+ } \
+ goto emit_token; \
} while (0)
int ZEND_FASTCALL lex_scan(zval *zendlval, zend_parser_stack_elem *elem)
@@ -1245,11 +1254,11 @@ restart:
/*!re2c
re2c:yyfill:check = 0;
-LNUM [0-9]+
-DNUM ([0-9]*"."[0-9]+)|([0-9]+"."[0-9]*)
+LNUM [0-9]+(_[0-9]+)*
+DNUM ({LNUM}?"."{LNUM})|({LNUM}"."{LNUM}?)
EXPONENT_DNUM (({LNUM}|{DNUM})[eE][+-]?{LNUM})
-HNUM "0x"[0-9a-fA-F]+
-BNUM "0b"[01]+
+HNUM "0x"[0-9a-fA-F]+(_[0-9a-fA-F]+)*
+BNUM "0b"[01]+(_[01]+)*
LABEL [a-zA-Z_\x80-\xff][a-zA-Z0-9_\x80-\xff]*
WHITESPACE [ \n\r\t]+
TABS_AND_SPACES [ \t]*
@@ -1268,6 +1277,10 @@ NEWLINE ("\r"|"\n"|"\r\n")
RETURN_TOKEN(T_EXIT);
}
+<ST_IN_SCRIPTING>"fn" {
+ RETURN_TOKEN(T_FN);
+}
+
<ST_IN_SCRIPTING>"function" {
RETURN_TOKEN(T_FUNCTION);
}
@@ -1478,7 +1491,14 @@ NEWLINE ("\r"|"\n"|"\r\n")
RETURN_TOKEN(T_INT_CAST);
}
-<ST_IN_SCRIPTING>"("{TABS_AND_SPACES}("real"|"double"|"float"){TABS_AND_SPACES}")" {
+<ST_IN_SCRIPTING>"("{TABS_AND_SPACES}("double"|"float"){TABS_AND_SPACES}")" {
+ RETURN_TOKEN(T_DOUBLE_CAST);
+}
+
+<ST_IN_SCRIPTING>"("{TABS_AND_SPACES}"real"{TABS_AND_SPACES}")" {
+ if (PARSER_MODE()) {
+ zend_error(E_DEPRECATED, "The (real) cast is deprecated, use (float) instead");
+ }
RETURN_TOKEN(T_DOUBLE_CAST);
}
@@ -1682,6 +1702,10 @@ NEWLINE ("\r"|"\n"|"\r\n")
RETURN_TOKEN(T_XOR_EQUAL);
}
+<ST_IN_SCRIPTING>"??=" {
+ RETURN_TOKEN(T_COALESCE_EQUAL);
+}
+
<ST_IN_SCRIPTING>"||" {
RETURN_TOKEN(T_BOOLEAN_OR);
}
@@ -1752,94 +1776,127 @@ NEWLINE ("\r"|"\n"|"\r\n")
}
<ST_IN_SCRIPTING>{BNUM} {
- char *bin = yytext + 2; /* Skip "0b" */
- int len = yyleng - 2;
- char *end;
+ /* The +/- 2 skips "0b" */
+ size_t len = yyleng - 2;
+ char *end, *bin = yytext + 2;
+ zend_bool contains_underscores;
/* Skip any leading 0s */
- while (*bin == '0') {
+ while (len > 0 && (*bin == '0' || *bin == '_')) {
++bin;
--len;
}
+ contains_underscores = (memchr(bin, '_', len) != NULL);
+
+ if (contains_underscores) {
+ bin = estrndup(bin, len);
+ strip_underscores(bin, &len);
+ }
+
if (len < SIZEOF_ZEND_LONG * 8) {
if (len == 0) {
ZVAL_LONG(zendlval, 0);
} else {
errno = 0;
ZVAL_LONG(zendlval, ZEND_STRTOL(bin, &end, 2));
- ZEND_ASSERT(!errno && end == yytext + yyleng);
+ ZEND_ASSERT(!errno && end == bin + len);
+ }
+ if (contains_underscores) {
+ efree(bin);
}
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);
+ ZEND_ASSERT(end == bin + len);
+ if (contains_underscores) {
+ efree(bin);
+ }
RETURN_TOKEN_WITH_VAL(T_DNUMBER);
}
}
<ST_IN_SCRIPTING>{LNUM} {
- char *end;
- if (yyleng < MAX_LENGTH_OF_LONG - 1) { /* Won't overflow */
- errno = 0;
- /* base must be passed explicitly for correct parse error on Windows */
- ZVAL_LONG(zendlval, ZEND_STRTOL(yytext, &end, yytext[0] == '0' ? 8 : 10));
- /* This isn't an assert, we need to ensure 019 isn't valid octal
- * Because the lexing itself doesn't do that for us
- */
- if (end != yytext + yyleng) {
- zend_throw_exception(zend_ce_parse_error, "Invalid numeric literal", 0);
- ZVAL_UNDEF(zendlval);
- if (PARSER_MODE()) {
- RETURN_TOKEN(T_ERROR);
+ size_t len = yyleng;
+ char *end, *lnum = yytext;
+ zend_bool is_octal = lnum[0] == '0';
+ zend_bool contains_underscores = (memchr(lnum, '_', len) != NULL);
+
+ if (contains_underscores) {
+ lnum = estrndup(lnum, len);
+ strip_underscores(lnum, &len);
+ }
+
+ /* Digits 8 and 9 are illegal in octal literals. */
+ if (is_octal) {
+ size_t i;
+ for (i = 0; i < len; i++) {
+ if (lnum[i] == '8' || lnum[i] == '9') {
+ zend_throw_exception(zend_ce_parse_error, "Invalid numeric literal", 0);
+ if (PARSER_MODE()) {
+ if (contains_underscores) {
+ efree(lnum);
+ }
+ ZVAL_UNDEF(zendlval);
+ RETURN_TOKEN(T_ERROR);
+ }
+
+ /* Continue in order to determine if this is T_LNUMBER or T_DNUMBER. */
+ len = i;
+ break;
}
- RETURN_TOKEN_WITH_VAL(T_LNUMBER);
}
+ }
+
+
+ if (len < MAX_LENGTH_OF_LONG - 1) { /* Won't overflow */
+ errno = 0;
+ /* base must be passed explicitly for correct parse error on Windows */
+ ZVAL_LONG(zendlval, ZEND_STRTOL(lnum, &end, is_octal ? 8 : 10));
+ ZEND_ASSERT(end == lnum + len);
} else {
errno = 0;
- ZVAL_LONG(zendlval, ZEND_STRTOL(yytext, &end, 0));
+ ZVAL_LONG(zendlval, ZEND_STRTOL(lnum, &end, 0));
if (errno == ERANGE) { /* Overflow */
errno = 0;
- if (yytext[0] == '0') { /* octal overflow */
- ZVAL_DOUBLE(zendlval, zend_oct_strtod(yytext, (const char **)&end));
+ if (is_octal) { /* octal overflow */
+ ZVAL_DOUBLE(zendlval, zend_oct_strtod(lnum, (const char **)&end));
} else {
- ZVAL_DOUBLE(zendlval, zend_strtod(yytext, (const char **)&end));
+ ZVAL_DOUBLE(zendlval, zend_strtod(lnum, (const char **)&end));
}
- /* 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);
- if (PARSER_MODE()) {
- RETURN_TOKEN(T_ERROR);
- }
- }
- 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);
- if (PARSER_MODE()) {
- RETURN_TOKEN(T_ERROR);
+ ZEND_ASSERT(end == lnum + len);
+ if (contains_underscores) {
+ efree(lnum);
}
RETURN_TOKEN_WITH_VAL(T_DNUMBER);
}
+ ZEND_ASSERT(end == lnum + len);
}
ZEND_ASSERT(!errno);
+ if (contains_underscores) {
+ efree(lnum);
+ }
RETURN_TOKEN_WITH_VAL(T_LNUMBER);
}
<ST_IN_SCRIPTING>{HNUM} {
- char *hex = yytext + 2; /* Skip "0x" */
- int len = yyleng - 2;
- char *end;
+ /* The +/- 2 skips "0x" */
+ size_t len = yyleng - 2;
+ char *end, *hex = yytext + 2;
+ zend_bool contains_underscores;
/* Skip any leading 0s */
- while (*hex == '0') {
- hex++;
- len--;
+ while (len > 0 && (*hex == '0' || *hex == '_')) {
+ ++hex;
+ --len;
+ }
+
+ contains_underscores = (memchr(hex, '_', len) != NULL);
+
+ if (contains_underscores) {
+ hex = estrndup(hex, len);
+ strip_underscores(hex, &len);
}
if (len < SIZEOF_ZEND_LONG * 2 || (len == SIZEOF_ZEND_LONG * 2 && *hex <= '7')) {
@@ -1850,11 +1907,17 @@ NEWLINE ("\r"|"\n"|"\r\n")
ZVAL_LONG(zendlval, ZEND_STRTOL(hex, &end, 16));
ZEND_ASSERT(!errno && end == hex + len);
}
+ if (contains_underscores) {
+ efree(hex);
+ }
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);
+ if (contains_underscores) {
+ efree(hex);
+ }
RETURN_TOKEN_WITH_VAL(T_DNUMBER);
}
}
@@ -1886,10 +1949,21 @@ string:
<ST_IN_SCRIPTING>{DNUM}|{EXPONENT_DNUM} {
const char *end;
+ size_t len = yyleng;
+ char *dnum = yytext;
+ zend_bool contains_underscores = (memchr(dnum, '_', len) != NULL);
- ZVAL_DOUBLE(zendlval, zend_strtod(yytext, &end));
+ if (contains_underscores) {
+ dnum = estrndup(dnum, len);
+ strip_underscores(dnum, &len);
+ }
+
+ ZVAL_DOUBLE(zendlval, zend_strtod(dnum, &end));
/* errno isn't checked since we allow HUGE_VAL/INF overflow */
- ZEND_ASSERT(end == yytext + yyleng);
+ ZEND_ASSERT(end == dnum + len);
+ if (contains_underscores) {
+ efree(dnum);
+ }
RETURN_TOKEN_WITH_VAL(T_DNUMBER);
}
@@ -1925,6 +1999,17 @@ string:
RETURN_TOKEN(T_NS_C);
}
+<SHEBANG>"#!" .* {NEWLINE} {
+ CG(zend_lineno)++;
+ BEGIN(INITIAL);
+ goto restart;
+}
+
+<SHEBANG>{ANY_CHAR} {
+ yyless(0);
+ BEGIN(INITIAL);
+ goto restart;
+}
<INITIAL>"<?=" {
BEGIN(ST_IN_SCRIPTING);
@@ -1938,20 +2023,28 @@ 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);
+ RETURN_OR_SKIP_TOKEN(T_OPEN_TAG);
}
+<INITIAL>"<?php" {
+ /* Allow <?php followed by end of file. */
+ if (YYCURSOR == YYLIMIT) {
+ BEGIN(ST_IN_SCRIPTING);
+ RETURN_OR_SKIP_TOKEN(T_OPEN_TAG);
+ }
+ /* Degenerate case: <?phpX is interpreted as <? phpX with short tags. */
+ if (CG(short_tags)) {
+ yyless(2);
+ BEGIN(ST_IN_SCRIPTING);
+ RETURN_OR_SKIP_TOKEN(T_OPEN_TAG);
+ }
+ goto inline_char_handler;
+}
<INITIAL>"<?" {
if (CG(short_tags)) {
BEGIN(ST_IN_SCRIPTING);
- if (PARSER_MODE()) {
- SKIP_TOKEN(T_OPEN_TAG);
- }
- RETURN_TOKEN(T_OPEN_TAG);
+ RETURN_OR_SKIP_TOKEN(T_OPEN_TAG);
} else {
goto inline_char_handler;
}
@@ -1974,8 +2067,13 @@ inline_char_handler:
}
if (*YYCURSOR == '?') {
- if (CG(short_tags) || !strncasecmp((char*)YYCURSOR + 1, "php", 3) || (*(YYCURSOR + 1) == '=')) { /* Assume [ \t\n\r] follows "php" */
-
+ if (CG(short_tags) /* <? */
+ || (*(YYCURSOR + 1) == '=') /* <?= */
+ || (!strncasecmp((char*)YYCURSOR + 1, "php", 3) && /* <?php[ \t\r\n] */
+ (YYCURSOR + 4 == YYLIMIT ||
+ YYCURSOR[4] == ' ' || YYCURSOR[4] == '\t' ||
+ YYCURSOR[4] == '\n' || YYCURSOR[4] == '\r'))
+ ) {
YYCURSOR--;
break;
}
@@ -2074,11 +2172,7 @@ inline_char_handler:
}
yyleng = YYCURSOR - SCNG(yy_text);
-
- if (PARSER_MODE()) {
- SKIP_TOKEN(T_COMMENT);
- }
- RETURN_TOKEN(T_COMMENT);
+ RETURN_OR_SKIP_TOKEN(T_COMMENT);
}
<ST_IN_SCRIPTING>"/*"|"/**"{WHITESPACE} {
@@ -2108,16 +2202,10 @@ 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);
+ RETURN_OR_SKIP_TOKEN(T_DOC_COMMENT);
}
- if (PARSER_MODE()) {
- SKIP_TOKEN(T_COMMENT);
- }
- RETURN_TOKEN(T_COMMENT);
+ RETURN_OR_SKIP_TOKEN(T_COMMENT);
}
<ST_IN_SCRIPTING>"?>"{NEWLINE}? {
@@ -2213,10 +2301,16 @@ skip_escape_conversion:
if (SCNG(output_filter)) {
size_t sz = 0;
char *str = NULL;
+ zend_string *new_str;
s = Z_STRVAL_P(zendlval);
// TODO: avoid reallocation ???
SCNG(output_filter)((unsigned char **)&str, &sz, (unsigned char *)s, (size_t)Z_STRLEN_P(zendlval));
- ZVAL_STRINGL(zendlval, str, sz);
+ new_str = zend_string_init(str, sz, 0);
+ if (str != s) {
+ efree(str);
+ }
+ zend_string_release_ex(Z_STR_P(zendlval), 0);
+ ZVAL_STR(zendlval, new_str);
}
RETURN_TOKEN_WITH_VAL(T_CONSTANT_ENCAPSED_STRING);
}
@@ -2774,7 +2868,11 @@ nowdoc_scan_done:
if (!SCNG(heredoc_scan_ahead)) {
zend_error(E_COMPILE_WARNING, "Unexpected character in input: '%c' (ASCII=%d) state=%d", yytext[0], yytext[0], YYSTATE);
}
- goto restart;
+ if (PARSER_MODE()) {
+ goto restart;
+ } else {
+ RETURN_TOKEN(T_BAD_CHARACTER);
+ }
}
*/
diff --git a/Zend/zend_language_scanner_defs.h b/Zend/zend_language_scanner_defs.h
deleted file mode 100644
index b77dcd675f..0000000000
--- a/Zend/zend_language_scanner_defs.h
+++ /dev/null
@@ -1,14 +0,0 @@
-/* Generated by re2c 1.3 */
-
-enum YYCONDTYPE {
- yycST_IN_SCRIPTING,
- yycST_LOOKING_FOR_PROPERTY,
- yycST_BACKQUOTE,
- yycST_DOUBLE_QUOTES,
- yycST_HEREDOC,
- yycST_LOOKING_FOR_VARNAME,
- yycST_VAR_OFFSET,
- yycINITIAL,
- yycST_END_HEREDOC,
- yycST_NOWDOC,
-};
diff --git a/Zend/zend_list.c b/Zend/zend_list.c
index aa16c5b7ef..21d013a589 100644
--- a/Zend/zend_list.c
+++ b/Zend/zend_list.c
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| Zend Engine |
+----------------------------------------------------------------------+
- | Copyright (c) 1998-2018 Zend Technologies Ltd. (http://www.zend.com) |
+ | Copyright (c) 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 |
@@ -206,7 +206,7 @@ void plist_entry_destructor(zval *zv)
free(res);
}
-int zend_init_rsrc_list(void)
+ZEND_API int zend_init_rsrc_list(void)
{
zend_hash_init(&EG(regular_list), 8, NULL, list_entry_destructor, 0);
return SUCCESS;
@@ -220,20 +220,15 @@ int zend_init_rsrc_plist(void)
}
-static int zend_close_rsrc(zval *zv)
-{
- zend_resource *res = Z_PTR_P(zv);
-
- if (res->type >= 0) {
- zend_resource_dtor(res);
- }
- return ZEND_HASH_APPLY_KEEP;
-}
-
-
void zend_close_rsrc_list(HashTable *ht)
{
- zend_hash_reverse_apply(ht, zend_close_rsrc);
+ zend_resource *res;
+
+ ZEND_HASH_REVERSE_FOREACH_PTR(ht, res) {
+ if (res->type >= 0) {
+ zend_resource_dtor(res);
+ }
+ } ZEND_HASH_FOREACH_END();
}
@@ -245,11 +240,8 @@ void zend_destroy_rsrc_list(HashTable *ht)
static int clean_module_resource(zval *zv, void *arg)
{
int resource_id = *(int *)arg;
- if (Z_RES_TYPE_P(zv) == resource_id) {
- return 1;
- } else {
- return 0;
- }
+
+ return Z_RES_TYPE_P(zv) == resource_id;
}
@@ -357,13 +349,3 @@ ZEND_API zend_resource* zend_register_persistent_resource(const char *key, size_
zend_string_release_ex(str, 1);
return ret;
}
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * indent-tabs-mode: t
- * End:
- * vim600: sw=4 ts=4 fdm=marker
- * vim<600: sw=4 ts=4
- */
diff --git a/Zend/zend_list.h b/Zend/zend_list.h
index 820a6a925b..b9a1d5e159 100644
--- a/Zend/zend_list.h
+++ b/Zend/zend_list.h
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| Zend Engine |
+----------------------------------------------------------------------+
- | Copyright (c) 1998-2018 Zend Technologies Ltd. (http://www.zend.com) |
+ | Copyright (c) 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 |
@@ -45,7 +45,7 @@ void list_entry_destructor(zval *ptr);
void plist_entry_destructor(zval *ptr);
void zend_clean_module_rsrc_dtors(int module_number);
-int zend_init_rsrc_list(void);
+ZEND_API int zend_init_rsrc_list(void); /* Exported for phar hack */
int zend_init_rsrc_plist(void);
void zend_close_rsrc_list(HashTable *ht);
void zend_destroy_rsrc_list(HashTable *ht);
@@ -74,13 +74,3 @@ extern ZEND_API int le_index_ptr; /* list entry type for index pointers */
END_EXTERN_C()
#endif
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * indent-tabs-mode: t
- * End:
- * vim600: sw=4 ts=4 fdm=marker
- * vim<600: sw=4 ts=4
- */
diff --git a/Zend/zend_llist.c b/Zend/zend_llist.c
index ea5e2cae45..4a2c22e632 100644
--- a/Zend/zend_llist.c
+++ b/Zend/zend_llist.c
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| Zend Engine |
+----------------------------------------------------------------------+
- | Copyright (c) 1998-2018 Zend Technologies Ltd. (http://www.zend.com) |
+ | Copyright (c) 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 |
@@ -307,13 +307,3 @@ ZEND_API void *zend_llist_get_prev_ex(zend_llist *l, zend_llist_position *pos)
}
return NULL;
}
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * indent-tabs-mode: t
- * End:
- * vim600: sw=4 ts=4 fdm=marker
- * vim<600: sw=4 ts=4
- */
diff --git a/Zend/zend_llist.h b/Zend/zend_llist.h
index e98cb5c8b4..b9155ce6cb 100644
--- a/Zend/zend_llist.h
+++ b/Zend/zend_llist.h
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| Zend Engine |
+----------------------------------------------------------------------+
- | Copyright (c) 1998-2018 Zend Technologies Ltd. (http://www.zend.com) |
+ | Copyright (c) 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 |
@@ -74,13 +74,3 @@ ZEND_API void *zend_llist_get_prev_ex(zend_llist *l, zend_llist_position *pos);
END_EXTERN_C()
#endif /* ZEND_LLIST_H */
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * indent-tabs-mode: t
- * End:
- * vim600: sw=4 ts=4 fdm=marker
- * vim<600: sw=4 ts=4
- */
diff --git a/Zend/zend_long.h b/Zend/zend_long.h
index 2279a79755..3b651e69d0 100644
--- a/Zend/zend_long.h
+++ b/Zend/zend_long.h
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| Zend Engine |
+----------------------------------------------------------------------+
- | Copyright (c) 1998-2018 Zend Technologies Ltd. (http://www.zend.com) |
+ | Copyright (c) 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 |
@@ -127,13 +127,3 @@ static const char long_min_digits[] = LONG_MIN_DIGITS;
#endif
#endif /* ZEND_LONG_H */
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * indent-tabs-mode: t
- * End:
- * vim600: sw=4 ts=4 fdm=marker
- * vim<600: sw=4 ts=4
- */
diff --git a/Zend/zend_map_ptr.h b/Zend/zend_map_ptr.h
new file mode 100644
index 0000000000..5c88ce0bc4
--- /dev/null
+++ b/Zend/zend_map_ptr.h
@@ -0,0 +1,85 @@
+/*
+ +----------------------------------------------------------------------+
+ | Zend Engine |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 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> |
+ +----------------------------------------------------------------------+
+*/
+
+#ifndef ZEND_MAP_PTR_H
+#define ZEND_MAP_PTR_H
+
+#include "zend_portability.h"
+
+#define ZEND_MAP_PTR_KIND_PTR 0
+#define ZEND_MAP_PTR_KIND_PTR_OR_OFFSET 1
+
+//#if defined(ZTS) || defined(TSRM_WIN32)
+# define ZEND_MAP_PTR_KIND ZEND_MAP_PTR_KIND_PTR_OR_OFFSET
+//#else
+//# define ZEND_MAP_PTR_KIND ZEND_MAP_PTR_KIND_PTR
+//#endif
+
+#if ZEND_MAP_PTR_KIND == ZEND_MAP_PTR_KIND_PTR
+# define ZEND_MAP_PTR(ptr) \
+ ptr ## __ptr
+# define ZEND_MAP_PTR_DEF(type, name) \
+ type * ZEND_MAP_PTR(name)
+# define ZEND_MAP_PTR_GET(ptr) \
+ (*(ZEND_MAP_PTR(ptr)))
+# define ZEND_MAP_PTR_SET(ptr, val) do { \
+ (*(ZEND_MAP_PTR(ptr))) = (val); \
+ } while (0)
+# define ZEND_MAP_PTR_INIT(ptr, val) do { \
+ ZEND_MAP_PTR(ptr) = (val); \
+ } while (0)
+# define ZEND_MAP_PTR_NEW(ptr) do { \
+ ZEND_MAP_PTR(ptr) = zend_map_ptr_new(); \
+ } while (0)
+#elif ZEND_MAP_PTR_KIND == ZEND_MAP_PTR_KIND_PTR_OR_OFFSET
+# define ZEND_MAP_PTR(ptr) \
+ ptr ## __ptr
+# define ZEND_MAP_PTR_DEF(type, name) \
+ type * ZEND_MAP_PTR(name)
+# define ZEND_MAP_PTR_IS_OFFSET(ptr) \
+ (((uintptr_t)ZEND_MAP_PTR(ptr)) & 1L)
+# define ZEND_MAP_PTR_OFFSET2PTR(ptr) \
+ ((void**)((char*)CG(map_ptr_base) + (uintptr_t)ZEND_MAP_PTR(ptr) - 1))
+# define ZEND_MAP_PTR_PTR2OFFSET(ptr) \
+ ((void*)((uintptr_t)(((char*)(ptr)) - ((char*)CG(map_ptr_base))) | 1L))
+# define ZEND_MAP_PTR_GET(ptr) \
+ (ZEND_MAP_PTR_IS_OFFSET(ptr) ? \
+ *(ZEND_MAP_PTR_OFFSET2PTR(ptr)) : \
+ (void*)(*(ZEND_MAP_PTR(ptr))))
+# define ZEND_MAP_PTR_SET(ptr, val) do { \
+ if (ZEND_MAP_PTR_IS_OFFSET(ptr)) { \
+ *(ZEND_MAP_PTR_OFFSET2PTR(ptr)) = (val); \
+ } else { \
+ *(ZEND_MAP_PTR(ptr)) = (val); \
+ } \
+ } while (0)
+# define ZEND_MAP_PTR_INIT(ptr, val) do { \
+ ZEND_MAP_PTR(ptr) = (val); \
+ } while (0)
+# define ZEND_MAP_PTR_NEW(ptr) do { \
+ ZEND_MAP_PTR(ptr) = zend_map_ptr_new(); \
+ } while (0)
+#else
+# error "Unknown ZEND_MAP_PTR_KIND"
+#endif
+
+ZEND_API void zend_map_ptr_reset(void);
+ZEND_API void *zend_map_ptr_new(void);
+ZEND_API void zend_map_ptr_extend(size_t last);
+
+#endif /* ZEND_MAP_PTR_H */
diff --git a/Zend/zend_modules.h b/Zend/zend_modules.h
index f73c3058e0..908acd7d32 100644
--- a/Zend/zend_modules.h
+++ b/Zend/zend_modules.h
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| Zend Engine |
+----------------------------------------------------------------------+
- | Copyright (c) 1998-2018 Zend Technologies Ltd. (http://www.zend.com) |
+ | Copyright (c) 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 |
@@ -31,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 20180731
+#define ZEND_MODULE_API_NO 20190902
#ifdef ZTS
#define USING_ZTS 1
#else
@@ -129,13 +129,3 @@ int module_registry_unload_temp(const zend_module_entry *module);
END_EXTERN_C()
#endif
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * indent-tabs-mode: t
- * End:
- * vim600: sw=4 ts=4 fdm=marker
- * vim<600: sw=4 ts=4
- */
diff --git a/Zend/zend_multibyte.c b/Zend/zend_multibyte.c
index b6d8864f14..956ffbb74f 100644
--- a/Zend/zend_multibyte.c
+++ b/Zend/zend_multibyte.c
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| Zend Engine |
+----------------------------------------------------------------------+
- | Copyright (c) 1998-2018 Zend Technologies Ltd. (http://www.zend.com) |
+ | Copyright (c) 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 |
@@ -210,12 +210,3 @@ ZEND_API int zend_multibyte_set_script_encoding_by_string(const char *new_value,
return SUCCESS;
}
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * End:
- * vim600: sw=4 ts=4 fdm=marker
- * vim<600: sw=4 ts=4
- */
diff --git a/Zend/zend_multibyte.h b/Zend/zend_multibyte.h
index f6a131dbe6..19444eda83 100644
--- a/Zend/zend_multibyte.h
+++ b/Zend/zend_multibyte.h
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| Zend Engine |
+----------------------------------------------------------------------+
- | Copyright (c) 1998-2018 Zend Technologies Ltd. (http://www.zend.com) |
+ | Copyright (c) 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 |
@@ -77,12 +77,3 @@ ZEND_API int zend_multibyte_set_script_encoding_by_string(const char *new_value,
END_EXTERN_C()
#endif /* ZEND_MULTIBYTE_H */
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * End:
- * vim600: sw=4 ts=4 fdm=marker
- * vim<600: sw=4 ts=4
- */
diff --git a/Zend/zend_multiply.h b/Zend/zend_multiply.h
index 1ec1af06a5..a3827d25d1 100644
--- a/Zend/zend_multiply.h
+++ b/Zend/zend_multiply.h
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| Zend Engine |
+----------------------------------------------------------------------+
- | Copyright (c) 1998-2018 Zend Technologies Ltd. (http://www.zend.com) |
+ | Copyright (c) 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 |
@@ -341,13 +341,3 @@ static zend_always_inline size_t zend_safe_addmult(size_t nmemb, size_t size, si
}
#endif /* ZEND_MULTIPLY_H */
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * indent-tabs-mode: t
- * End:
- * vim600: sw=4 ts=4 fdm=marker
- * vim<600: sw=4 ts=4
- */
diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c
index 266c257f79..c058c1cf49 100644
--- a/Zend/zend_object_handlers.c
+++ b/Zend/zend_object_handlers.c
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| Zend Engine |
+----------------------------------------------------------------------+
- | Copyright (c) 1998-2018 Zend Technologies Ltd. (http://www.zend.com) |
+ | Copyright (c) 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 |
@@ -63,13 +63,14 @@ ZEND_API void rebuild_object_properties(zend_object *zobj) /* {{{ */
if (!zobj->properties) {
zend_property_info *prop_info;
zend_class_entry *ce = zobj->ce;
+ uint32_t flags = 0;
zobj->properties = zend_new_array(ce->default_properties_count);
if (ce->default_properties_count) {
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 (!(prop_info->flags & ZEND_ACC_STATIC)) {
+ flags |= prop_info->flags;
if (UNEXPECTED(Z_TYPE_P(OBJ_PROP(zobj, prop_info->offset)) == IS_UNDEF)) {
HT_FLAGS(zobj->properties) |= HASH_FLAG_HAS_EMPTY_IND;
@@ -79,22 +80,24 @@ ZEND_API void rebuild_object_properties(zend_object *zobj) /* {{{ */
OBJ_PROP(zobj, prop_info->offset));
}
} ZEND_HASH_FOREACH_END();
- while (ce->parent && ce->parent->default_properties_count) {
- ce = ce->parent;
- ZEND_HASH_FOREACH_PTR(&ce->properties_info, prop_info) {
- if (prop_info->ce == ce &&
- (prop_info->flags & ZEND_ACC_STATIC) == 0 &&
- (prop_info->flags & ZEND_ACC_PRIVATE) != 0) {
- zval zv;
-
- if (UNEXPECTED(Z_TYPE_P(OBJ_PROP(zobj, prop_info->offset)) == IS_UNDEF)) {
- HT_FLAGS(zobj->properties) |= HASH_FLAG_HAS_EMPTY_IND;
+ if (flags & ZEND_ACC_CHANGED) {
+ while (ce->parent && ce->parent->default_properties_count) {
+ ce = ce->parent;
+ ZEND_HASH_FOREACH_PTR(&ce->properties_info, prop_info) {
+ if (prop_info->ce == ce &&
+ !(prop_info->flags & ZEND_ACC_STATIC) &&
+ (prop_info->flags & ZEND_ACC_PRIVATE)) {
+ zval zv;
+
+ if (UNEXPECTED(Z_TYPE_P(OBJ_PROP(zobj, prop_info->offset)) == IS_UNDEF)) {
+ HT_FLAGS(zobj->properties) |= HASH_FLAG_HAS_EMPTY_IND;
+ }
+
+ ZVAL_INDIRECT(&zv, OBJ_PROP(zobj, prop_info->offset));
+ zend_hash_add(zobj->properties, prop_info->name, &zv);
}
-
- ZVAL_INDIRECT(&zv, OBJ_PROP(zobj, prop_info->offset));
- zend_hash_add(zobj->properties, prop_info->name, &zv);
- }
- } ZEND_HASH_FOREACH_END();
+ } ZEND_HASH_FOREACH_END();
+ }
}
}
}
@@ -147,9 +150,7 @@ ZEND_API HashTable *zend_std_get_debug_info(zval *object, int *is_temp) /* {{{ *
if (!ce->__debugInfo) {
*is_temp = 0;
- return Z_OBJ_HANDLER_P(object, get_properties)
- ? Z_OBJ_HANDLER_P(object, get_properties)(object)
- : NULL;
+ return Z_OBJ_HANDLER_P(object, get_properties)(object);
}
zend_call_method_with_0_params(object, ce, &ce->__debugInfo, ZEND_DEBUGINFO_FUNC_NAME, &retval);
@@ -324,30 +325,6 @@ static void zend_std_call_issetter(zend_object *zobj, zend_string *prop_name, zv
}
/* }}} */
-static zend_always_inline int zend_verify_property_access(zend_property_info *property_info, zend_class_entry *ce) /* {{{ */
-{
- zend_class_entry *scope;
-
- if (property_info->flags & ZEND_ACC_PUBLIC) {
- return 1;
- } else if (property_info->flags & ZEND_ACC_PRIVATE) {
- if (EG(fake_scope)) {
- scope = EG(fake_scope);
- } else {
- scope = zend_get_executed_scope();
- }
- return (ce == scope || property_info->ce == scope);
- } else if (property_info->flags & ZEND_ACC_PROTECTED) {
- if (EG(fake_scope)) {
- scope = EG(fake_scope);
- } else {
- scope = zend_get_executed_scope();
- }
- return zend_check_protected(property_info->ce, scope);
- }
- return 0;
-}
-/* }}} */
static zend_always_inline zend_bool is_derived_class(zend_class_entry *child_class, zend_class_entry *parent_class) /* {{{ */
{
@@ -363,161 +340,221 @@ static zend_always_inline zend_bool is_derived_class(zend_class_entry *child_cla
}
/* }}} */
-static zend_always_inline uintptr_t zend_get_property_offset(zend_class_entry *ce, zend_string *member, int silent, void **cache_slot) /* {{{ */
+static zend_never_inline int is_protected_compatible_scope(zend_class_entry *ce, zend_class_entry *scope) /* {{{ */
+{
+ return scope &&
+ (is_derived_class(ce, scope) || is_derived_class(scope, ce));
+}
+/* }}} */
+
+static zend_never_inline zend_property_info *zend_get_parent_private_property(zend_class_entry *scope, zend_class_entry *ce, zend_string *member) /* {{{ */
{
zval *zv;
- zend_property_info *property_info = NULL;
+ zend_property_info *prop_info;
+
+ if (scope != ce && scope && is_derived_class(ce, scope)) {
+ zv = zend_hash_find(&scope->properties_info, member);
+ if (zv != NULL) {
+ prop_info = (zend_property_info*)Z_PTR_P(zv);
+ if ((prop_info->flags & ZEND_ACC_PRIVATE)
+ && prop_info->ce == scope) {
+ return prop_info;
+ }
+ }
+ }
+ return NULL;
+}
+/* }}} */
+
+static ZEND_COLD zend_never_inline void zend_bad_property_access(zend_property_info *property_info, zend_class_entry *ce, zend_string *member) /* {{{ */
+{
+ zend_throw_error(NULL, "Cannot access %s property %s::$%s", zend_visibility_string(property_info->flags), ZSTR_VAL(ce->name), ZSTR_VAL(member));
+}
+/* }}} */
+
+static ZEND_COLD zend_never_inline void zend_bad_property_name(void) /* {{{ */
+{
+ zend_throw_error(NULL, "Cannot access property started with '\\0'");
+}
+/* }}} */
+
+static zend_always_inline uintptr_t zend_get_property_offset(zend_class_entry *ce, zend_string *member, int silent, void **cache_slot, zend_property_info **info_ptr) /* {{{ */
+{
+ zval *zv;
+ zend_property_info *property_info;
uint32_t flags;
zend_class_entry *scope;
+ uintptr_t offset;
if (cache_slot && EXPECTED(ce == CACHED_PTR_EX(cache_slot))) {
+ *info_ptr = CACHED_PTR_EX(cache_slot + 2);
return (uintptr_t)CACHED_PTR_EX(cache_slot + 1);
}
- if (UNEXPECTED(zend_hash_num_elements(&ce->properties_info) == 0)) {
- goto exit_dynamic;
+ if (UNEXPECTED(zend_hash_num_elements(&ce->properties_info) == 0)
+ || UNEXPECTED((zv = zend_hash_find(&ce->properties_info, member)) == NULL)) {
+ if (UNEXPECTED(ZSTR_VAL(member)[0] == '\0') && ZSTR_LEN(member) != 0) {
+ if (!silent) {
+ zend_bad_property_name();
+ }
+ return ZEND_WRONG_PROPERTY_OFFSET;
+ }
+dynamic:
+ if (cache_slot) {
+ CACHE_POLYMORPHIC_PTR_EX(cache_slot, ce, (void*)ZEND_DYNAMIC_PROPERTY_OFFSET);
+ CACHE_PTR_EX(cache_slot + 2, NULL);
+ }
+ return ZEND_DYNAMIC_PROPERTY_OFFSET;
}
- zv = zend_hash_find(&ce->properties_info, member);
- if (EXPECTED(zv != NULL)) {
- property_info = (zend_property_info*)Z_PTR_P(zv);
- flags = property_info->flags;
- if (UNEXPECTED((flags & ZEND_ACC_SHADOW) != 0)) {
- /* if it's a shadow - go to access it's private */
- property_info = NULL;
+ property_info = (zend_property_info*)Z_PTR_P(zv);
+ flags = property_info->flags;
+
+ if (flags & (ZEND_ACC_CHANGED|ZEND_ACC_PRIVATE|ZEND_ACC_PROTECTED)) {
+ if (UNEXPECTED(EG(fake_scope))) {
+ scope = EG(fake_scope);
} else {
- if (EXPECTED(zend_verify_property_access(property_info, ce) != 0)) {
- if (UNEXPECTED(!(flags & ZEND_ACC_CHANGED))
- || UNEXPECTED((flags & ZEND_ACC_PRIVATE))) {
- if (UNEXPECTED((flags & ZEND_ACC_STATIC) != 0)) {
- if (!silent) {
- zend_error(E_NOTICE, "Accessing static property %s::$%s as non static", ZSTR_VAL(ce->name), ZSTR_VAL(member));
- }
- return ZEND_DYNAMIC_PROPERTY_OFFSET;
+ scope = zend_get_executed_scope();
+ }
+
+ if (property_info->ce != scope) {
+ if (flags & ZEND_ACC_CHANGED) {
+ zend_property_info *p = zend_get_parent_private_property(scope, ce, member);
+
+ /* If there is a public/protected instance property on ce, don't try to use a
+ * private static property on scope. If both are static, prefer the static
+ * property on scope. This will throw a static property notice, rather than
+ * a visibility error. */
+ if (p && (!(p->flags & ZEND_ACC_STATIC) || (flags & ZEND_ACC_STATIC))) {
+ property_info = p;
+ flags = property_info->flags;
+ goto found;
+ } else if (flags & ZEND_ACC_PUBLIC) {
+ goto found;
+ }
+ }
+ if (flags & ZEND_ACC_PRIVATE) {
+ if (property_info->ce != ce) {
+ goto dynamic;
+ } else {
+wrong:
+ /* Information was available, but we were denied access. Error out. */
+ if (!silent) {
+ zend_bad_property_access(property_info, ce, member);
}
- goto exit;
+ return ZEND_WRONG_PROPERTY_OFFSET;
}
} else {
- /* Try to look in the scope instead */
- property_info = ZEND_WRONG_PROPERTY_INFO;
+ ZEND_ASSERT(flags & ZEND_ACC_PROTECTED);
+ if (UNEXPECTED(!is_protected_compatible_scope(property_info->ce, scope))) {
+ goto wrong;
+ }
}
}
}
- if (EG(fake_scope)) {
- scope = EG(fake_scope);
- } else {
- scope = zend_get_executed_scope();
- }
-
- if (scope != ce
- && scope
- && is_derived_class(ce, scope)
- && (zv = zend_hash_find(&scope->properties_info, member)) != NULL
- && ((zend_property_info*)Z_PTR_P(zv))->flags & ZEND_ACC_PRIVATE) {
- property_info = (zend_property_info*)Z_PTR_P(zv);
- if (UNEXPECTED((property_info->flags & ZEND_ACC_STATIC) != 0)) {
- return ZEND_DYNAMIC_PROPERTY_OFFSET;
- }
- } 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*)ZEND_DYNAMIC_PROPERTY_OFFSET);
- }
- return ZEND_DYNAMIC_PROPERTY_OFFSET;
- } else if (UNEXPECTED(property_info == ZEND_WRONG_PROPERTY_INFO)) {
- /* Information was available, but we were denied access. Error out. */
+found:
+ if (UNEXPECTED(flags & ZEND_ACC_STATIC)) {
if (!silent) {
- zend_throw_error(NULL, "Cannot access %s property %s::$%s", zend_visibility_string(flags), ZSTR_VAL(ce->name), ZSTR_VAL(member));
+ zend_error(E_NOTICE, "Accessing static property %s::$%s as non static", ZSTR_VAL(ce->name), ZSTR_VAL(member));
}
- return ZEND_WRONG_PROPERTY_OFFSET;
+ return ZEND_DYNAMIC_PROPERTY_OFFSET;
}
-exit:
+ offset = property_info->offset;
+ if (EXPECTED(!property_info->type)) {
+ property_info = NULL;
+ } else {
+ *info_ptr = property_info;
+ }
if (cache_slot) {
- CACHE_POLYMORPHIC_PTR_EX(cache_slot, ce, (void*)(uintptr_t)property_info->offset);
+ CACHE_POLYMORPHIC_PTR_EX(cache_slot, ce, (void*)(uintptr_t)offset);
+ CACHE_PTR_EX(cache_slot + 2, property_info);
}
- return property_info->offset;
+ return offset;
+}
+/* }}} */
+
+static ZEND_COLD void zend_wrong_offset(zend_class_entry *ce, zend_string *member) /* {{{ */
+{
+ zend_property_info *dummy;
+
+ /* Trigger the correct error */
+ zend_get_property_offset(ce, member, 0, NULL, &dummy);
}
/* }}} */
ZEND_API zend_property_info *zend_get_property_info(zend_class_entry *ce, zend_string *member, int silent) /* {{{ */
{
zval *zv;
- zend_property_info *property_info = NULL;
+ zend_property_info *property_info;
uint32_t flags;
zend_class_entry *scope;
- if (UNEXPECTED(zend_hash_num_elements(&ce->properties_info) == 0)) {
- goto exit_dynamic;
+ if (UNEXPECTED(zend_hash_num_elements(&ce->properties_info) == 0)
+ || EXPECTED((zv = zend_hash_find(&ce->properties_info, member)) == NULL)) {
+ if (UNEXPECTED(ZSTR_VAL(member)[0] == '\0') && ZSTR_LEN(member) != 0) {
+ if (!silent) {
+ zend_bad_property_name();
+ }
+ return ZEND_WRONG_PROPERTY_INFO;
+ }
+dynamic:
+ return NULL;
}
- zv = zend_hash_find(&ce->properties_info, member);
- if (EXPECTED(zv != NULL)) {
- property_info = (zend_property_info*)Z_PTR_P(zv);
- flags = property_info->flags;
- if (UNEXPECTED((flags & ZEND_ACC_SHADOW) != 0)) {
- /* if it's a shadow - go to access it's private */
- property_info = NULL;
+ property_info = (zend_property_info*)Z_PTR_P(zv);
+ flags = property_info->flags;
+
+ if (flags & (ZEND_ACC_CHANGED|ZEND_ACC_PRIVATE|ZEND_ACC_PROTECTED)) {
+ if (UNEXPECTED(EG(fake_scope))) {
+ scope = EG(fake_scope);
} else {
- if (EXPECTED(zend_verify_property_access(property_info, ce) != 0)) {
- if (UNEXPECTED(!(flags & ZEND_ACC_CHANGED))
- || UNEXPECTED((flags & ZEND_ACC_PRIVATE))) {
- if (UNEXPECTED((flags & ZEND_ACC_STATIC) != 0)) {
- if (!silent) {
- zend_error(E_NOTICE, "Accessing static property %s::$%s as non static", ZSTR_VAL(ce->name), ZSTR_VAL(member));
- }
+ scope = zend_get_executed_scope();
+ }
+ if (property_info->ce != scope) {
+ if (flags & ZEND_ACC_CHANGED) {
+ zend_property_info *p = zend_get_parent_private_property(scope, ce, member);
+
+ if (p) {
+ property_info = p;
+ flags = property_info->flags;
+ goto found;
+ } else if (flags & ZEND_ACC_PUBLIC) {
+ goto found;
+ }
+ }
+ if (flags & ZEND_ACC_PRIVATE) {
+ if (property_info->ce != ce) {
+ goto dynamic;
+ } else {
+wrong:
+ /* Information was available, but we were denied access. Error out. */
+ if (!silent) {
+ zend_bad_property_access(property_info, ce, member);
}
- goto exit;
+ return ZEND_WRONG_PROPERTY_INFO;
}
} else {
- /* Try to look in the scope instead */
- property_info = ZEND_WRONG_PROPERTY_INFO;
+ ZEND_ASSERT(flags & ZEND_ACC_PROTECTED);
+ if (UNEXPECTED(!is_protected_compatible_scope(property_info->ce, scope))) {
+ goto wrong;
+ }
}
}
}
- if (EG(fake_scope)) {
- scope = EG(fake_scope);
- } else {
- scope = zend_get_executed_scope();
- }
-
- if (scope != ce
- && scope
- && is_derived_class(ce, scope)
- && (zv = zend_hash_find(&scope->properties_info, member)) != NULL
- && ((zend_property_info*)Z_PTR_P(zv))->flags & ZEND_ACC_PRIVATE) {
- 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. */
+found:
+ if (UNEXPECTED(flags & ZEND_ACC_STATIC)) {
if (!silent) {
- zend_throw_error(NULL, "Cannot access %s property %s::$%s", zend_visibility_string(flags), ZSTR_VAL(ce->name), ZSTR_VAL(member));
+ zend_error(E_NOTICE, "Accessing static property %s::$%s as non static", ZSTR_VAL(ce->name), ZSTR_VAL(member));
}
- return ZEND_WRONG_PROPERTY_INFO;
}
-
-exit:
return property_info;
}
/* }}} */
-ZEND_API int zend_check_property_access(zend_object *zobj, zend_string *prop_info_name) /* {{{ */
+ZEND_API int zend_check_property_access(zend_object *zobj, zend_string *prop_info_name, zend_bool is_dynamic) /* {{{ */
{
zend_property_info *property_info;
const char *class_name = NULL;
@@ -526,33 +563,40 @@ ZEND_API int zend_check_property_access(zend_object *zobj, zend_string *prop_inf
size_t prop_name_len;
if (ZSTR_VAL(prop_info_name)[0] == 0) {
+ if (is_dynamic) {
+ return SUCCESS;
+ }
+
zend_unmangle_property_name_ex(prop_info_name, &class_name, &prop_name, &prop_name_len);
member = zend_string_init(prop_name, prop_name_len, 0);
- } else {
- member = zend_string_copy(prop_info_name);
- }
- property_info = zend_get_property_info(zobj->ce, member, 1);
- zend_string_release_ex(member, 0);
- if (property_info == NULL) {
- /* undefined public property */
- if (class_name && class_name[0] != '*') {
- /* we we're looking for a private prop */
+ property_info = zend_get_property_info(zobj->ce, member, 1);
+ zend_string_release_ex(member, 0);
+ if (property_info == NULL || property_info == ZEND_WRONG_PROPERTY_INFO) {
return FAILURE;
}
+
+ if (class_name[0] != '*') {
+ if (!(property_info->flags & ZEND_ACC_PRIVATE)) {
+ /* we we're looking for a private prop but found a non private one of the same name */
+ return FAILURE;
+ } else if (strcmp(ZSTR_VAL(prop_info_name)+1, ZSTR_VAL(property_info->name)+1)) {
+ /* we we're looking for a private prop but found a private one of the same name but another class */
+ return FAILURE;
+ }
+ } else {
+ ZEND_ASSERT(property_info->flags & ZEND_ACC_PROTECTED);
+ }
return SUCCESS;
- } else if (property_info == ZEND_WRONG_PROPERTY_INFO) {
- return FAILURE;
- }
- if (class_name && class_name[0] != '*') {
- if (!(property_info->flags & ZEND_ACC_PRIVATE)) {
- /* we we're looking for a private prop but found a non private one of the same name */
- return FAILURE;
- } else if (strcmp(ZSTR_VAL(prop_info_name)+1, ZSTR_VAL(property_info->name)+1)) {
- /* we we're looking for a private prop but found a private one of the same name but another class */
+ } else {
+ property_info = zend_get_property_info(zobj->ce, prop_info_name, 1);
+ if (property_info == NULL) {
+ ZEND_ASSERT(is_dynamic);
+ return SUCCESS;
+ } else if (property_info == ZEND_WRONG_PROPERTY_INFO) {
return FAILURE;
}
+ return (property_info->flags & ZEND_ACC_PUBLIC) ? SUCCESS : FAILURE;
}
- return zend_verify_property_access(property_info, zobj->ce) ? SUCCESS : FAILURE;
}
/* }}} */
@@ -618,23 +662,31 @@ ZEND_API zval *zend_std_read_property(zval *object, zval *member, int type, void
zend_string *name, *tmp_name;
zval *retval;
uintptr_t property_offset;
+ zend_property_info *prop_info = NULL;
uint32_t *guard = NULL;
zobj = Z_OBJ_P(object);
- name = zval_get_tmp_string(member, &tmp_name);
+ name = zval_try_get_tmp_string(member, &tmp_name);
+ if (UNEXPECTED(!name)) {
+ return &EG(uninitialized_zval);
+ }
#if DEBUG_OBJECT_HANDLERS
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, name, (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, &prop_info);
if (EXPECTED(IS_VALID_PROPERTY_OFFSET(property_offset))) {
retval = OBJ_PROP(zobj, property_offset);
if (EXPECTED(Z_TYPE_P(retval) != IS_UNDEF)) {
goto exit;
}
+ if (UNEXPECTED(Z_PROP_FLAG_P(retval) == IS_PROP_UNINIT)) {
+ /* Skip __get() for uninitialized typed properties */
+ goto uninit_error;
+ }
} else if (EXPECTED(IS_DYNAMIC_PROPERTY_OFFSET(property_offset))) {
if (EXPECTED(zobj->properties != NULL)) {
if (!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET(property_offset)) {
@@ -722,17 +774,31 @@ call_getter:
} else {
retval = &EG(uninitialized_zval);
}
+
+ if (UNEXPECTED(prop_info)) {
+ zend_verify_prop_assignable_by_ref(prop_info, retval, (zobj->ce->__get->common.fn_flags & ZEND_ACC_STRICT_TYPES) != 0);
+ }
+
OBJ_RELEASE(zobj);
goto exit;
- } else if (ZSTR_VAL(name)[0] == '\0' && ZSTR_LEN(name) != 0) {
- zend_throw_error(NULL, "Cannot access property started with '\\0'");
+ } else if (UNEXPECTED(IS_WRONG_PROPERTY_OFFSET(property_offset))) {
+ /* Trigger the correct error */
+ zend_get_property_offset(zobj->ce, name, 0, NULL, &prop_info);
+ ZEND_ASSERT(EG(exception));
retval = &EG(uninitialized_zval);
goto exit;
}
}
- if ((type != BP_VAR_IS)) {
- zend_error(E_NOTICE,"Undefined property: %s::$%s", ZSTR_VAL(zobj->ce->name), ZSTR_VAL(name));
+uninit_error:
+ if (type != BP_VAR_IS) {
+ if (UNEXPECTED(prop_info)) {
+ zend_throw_error(NULL, "Typed property %s::$%s must not be accessed before initialization",
+ ZSTR_VAL(prop_info->ce->name),
+ ZSTR_VAL(name));
+ } else {
+ zend_error(E_NOTICE,"Undefined property: %s::$%s", ZSTR_VAL(zobj->ce->name), ZSTR_VAL(name));
+ }
}
retval = &EG(uninitialized_zval);
@@ -743,22 +809,46 @@ exit:
}
/* }}} */
-ZEND_API void zend_std_write_property(zval *object, zval *member, zval *value, void **cache_slot) /* {{{ */
+ZEND_API zval *zend_std_write_property(zval *object, zval *member, zval *value, void **cache_slot) /* {{{ */
{
zend_object *zobj;
zend_string *name, *tmp_name;
- zval *variable_ptr;
+ zval *variable_ptr, tmp;
uintptr_t property_offset;
+ zend_property_info *prop_info = NULL;
+ ZEND_ASSERT(!Z_ISREF_P(value));
zobj = Z_OBJ_P(object);
- name = zval_get_tmp_string(member, &tmp_name);
+ name = zval_try_get_tmp_string(member, &tmp_name);
+ if (UNEXPECTED(!name)) {
+ return value;
+ }
- property_offset = zend_get_property_offset(zobj->ce, name, (zobj->ce->__set != NULL), cache_slot);
+ property_offset = zend_get_property_offset(zobj->ce, name, (zobj->ce->__set != NULL), cache_slot, &prop_info);
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;
+ Z_TRY_ADDREF_P(value);
+
+ if (UNEXPECTED(prop_info)) {
+ ZVAL_COPY_VALUE(&tmp, value);
+ if (UNEXPECTED(!zend_verify_property_type(prop_info, &tmp, EG(current_execute_data) && ZEND_CALL_USES_STRICT_TYPES(EG(current_execute_data))))) {
+ Z_TRY_DELREF_P(value);
+ variable_ptr = &EG(error_zval);
+ goto exit;
+ }
+ value = &tmp;
+ }
+
+found:
+ zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR, EG(current_execute_data) && ZEND_CALL_USES_STRICT_TYPES(EG(current_execute_data)));
+ goto exit;
+ }
+ if (Z_PROP_FLAG_P(variable_ptr) == IS_PROP_UNINIT) {
+ /* Writes to uninitializde typed properties bypass __set(). */
+ Z_PROP_FLAG_P(variable_ptr) = 0;
+ goto write_std_property;
}
} else if (EXPECTED(IS_DYNAMIC_PROPERTY_OFFSET(property_offset))) {
if (EXPECTED(zobj->properties != NULL)) {
@@ -769,12 +859,12 @@ ZEND_API void zend_std_write_property(zval *object, zval *member, zval *value, v
zobj->properties = zend_array_dup(zobj->properties);
}
if ((variable_ptr = zend_hash_find(zobj->properties, name)) != NULL) {
-found:
- zend_assign_to_variable(variable_ptr, value, IS_CV);
- goto exit;
+ Z_TRY_ADDREF_P(value);
+ goto found;
}
}
} else if (UNEXPECTED(EG(exception))) {
+ variable_ptr = &EG(error_zval);
goto exit;
}
@@ -782,45 +872,58 @@ found:
if (zobj->ce->__set) {
uint32_t *guard = zend_get_property_guard(zobj, name);
- if (!((*guard) & IN_SET)) {
+ if (!((*guard) & IN_SET)) {
GC_ADDREF(zobj);
(*guard) |= IN_SET; /* prevent circular setting */
zend_std_call_setter(zobj, name, value);
(*guard) &= ~IN_SET;
OBJ_RELEASE(zobj);
+ variable_ptr = value;
} else if (EXPECTED(!IS_WRONG_PROPERTY_OFFSET(property_offset))) {
goto write_std_property;
} else {
- if (ZSTR_VAL(name)[0] == '\0' && ZSTR_LEN(name) != 0) {
- zend_throw_error(NULL, "Cannot access property started with '\\0'");
- goto exit;
- }
+ /* Trigger the correct error */
+ zend_wrong_offset(zobj->ce, name);
+ ZEND_ASSERT(EG(exception));
+ variable_ptr = &EG(error_zval);
+ goto exit;
}
- } else if (EXPECTED(!IS_WRONG_PROPERTY_OFFSET(property_offset))) {
+ } else {
+ ZEND_ASSERT(!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 */
- value = Z_REFVAL_P(value);
- if (Z_REFCOUNTED_P(value)) {
- Z_ADDREF_P(value);
+ Z_TRY_ADDREF_P(value);
+ if (EXPECTED(IS_VALID_PROPERTY_OFFSET(property_offset))) {
+
+ variable_ptr = OBJ_PROP(zobj, property_offset);
+
+ if (UNEXPECTED(prop_info)) {
+ ZVAL_COPY_VALUE(&tmp, value);
+ if (UNEXPECTED(!zend_verify_property_type(prop_info, &tmp, ZEND_CALL_USES_STRICT_TYPES(EG(current_execute_data))))) {
+ zval_ptr_dtor(value);
+ goto exit;
}
- } else {
- Z_ADDREF_P(value);
+ value = &tmp;
+ goto found; /* might have been updated via e.g. __toString() */
}
- }
- if (EXPECTED(IS_VALID_PROPERTY_OFFSET(property_offset))) {
- ZVAL_COPY_VALUE(OBJ_PROP(zobj, property_offset), value);
+
+ ZVAL_COPY_VALUE(variable_ptr, value);
} else {
if (!zobj->properties) {
rebuild_object_properties(zobj);
}
- zend_hash_add_new(zobj->properties, name, value);
+ variable_ptr = zend_hash_add_new(zobj->properties, name, value);
}
}
exit:
zend_tmp_string_release(tmp_name);
+ return variable_ptr;
+}
+/* }}} */
+
+static ZEND_COLD zend_never_inline void zend_bad_array_access(zend_class_entry *ce) /* {{{ */
+{
+ zend_throw_error(NULL, "Cannot use object of type %s as array", ZSTR_VAL(ce->name));
}
/* }}} */
@@ -837,7 +940,8 @@ ZEND_API zval *zend_std_read_dimension(zval *object, zval *offset, int type, zva
ZVAL_COPY_DEREF(&tmp_offset, offset);
}
- ZVAL_COPY(&tmp_object, object);
+ Z_ADDREF_P(object);
+ ZVAL_OBJ(&tmp_object, Z_OBJ_P(object));
if (type == BP_VAR_IS) {
zend_call_method_with_1_params(&tmp_object, ce, NULL, "offsetexists", rv, &tmp_offset);
if (UNEXPECTED(Z_ISUNDEF_P(rv))) {
@@ -867,7 +971,7 @@ ZEND_API zval *zend_std_read_dimension(zval *object, zval *offset, int type, zva
}
return rv;
} else {
- zend_throw_error(NULL, "Cannot use object of type %s as array", ZSTR_VAL(ce->name));
+ zend_bad_array_access(ce);
return NULL;
}
}
@@ -884,12 +988,13 @@ ZEND_API void zend_std_write_dimension(zval *object, zval *offset, zval *value)
} else {
ZVAL_COPY_DEREF(&tmp_offset, offset);
}
- ZVAL_COPY(&tmp_object, object);
+ Z_ADDREF_P(object);
+ ZVAL_OBJ(&tmp_object, Z_OBJ_P(object));
zend_call_method_with_2_params(&tmp_object, ce, NULL, "offsetset", NULL, &tmp_offset, value);
zval_ptr_dtor(&tmp_object);
zval_ptr_dtor(&tmp_offset);
} else {
- zend_throw_error(NULL, "Cannot use object of type %s as array", ZSTR_VAL(ce->name));
+ zend_bad_array_access(ce);
}
}
/* }}} */
@@ -902,7 +1007,8 @@ ZEND_API int zend_std_has_dimension(zval *object, zval *offset, int check_empty)
if (EXPECTED(instanceof_function_ex(ce, zend_ce_arrayaccess, 1) != 0)) {
ZVAL_COPY_DEREF(&tmp_offset, offset);
- ZVAL_COPY(&tmp_object, object);
+ Z_ADDREF_P(object);
+ ZVAL_OBJ(&tmp_object, Z_OBJ_P(object));
zend_call_method_with_1_params(&tmp_object, ce, NULL, "offsetexists", &retval, &tmp_offset);
result = i_zend_is_true(&retval);
zval_ptr_dtor(&retval);
@@ -914,7 +1020,7 @@ ZEND_API int zend_std_has_dimension(zval *object, zval *offset, int check_empty)
zval_ptr_dtor(&tmp_object);
zval_ptr_dtor(&tmp_offset);
} else {
- zend_throw_error(NULL, "Cannot use object of type %s as array", ZSTR_VAL(ce->name));
+ zend_bad_array_access(ce);
return 0;
}
return result;
@@ -927,26 +1033,36 @@ ZEND_API zval *zend_std_get_property_ptr_ptr(zval *object, zval *member, int typ
zend_string *name, *tmp_name;
zval *retval = NULL;
uintptr_t property_offset;
+ zend_property_info *prop_info = NULL;
zobj = Z_OBJ_P(object);
- name = zval_get_tmp_string(member, &tmp_name);
+ name = zval_try_get_tmp_string(member, &tmp_name);
+ if (UNEXPECTED(!name)) {
+ return &EG(error_zval);
+ }
#if DEBUG_OBJECT_HANDLERS
fprintf(stderr, "Ptr object #%d property: %s\n", Z_OBJ_HANDLE_P(object), ZSTR_VAL(name));
#endif
- property_offset = zend_get_property_offset(zobj->ce, name, (zobj->ce->__get != NULL), cache_slot);
+ property_offset = zend_get_property_offset(zobj->ce, name, (zobj->ce->__get != NULL), cache_slot, &prop_info);
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)) {
- 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));
+ if (UNEXPECTED(prop_info)) {
+ zend_throw_error(NULL,
+ "Typed property %s::$%s must not be accessed before initialization",
+ ZSTR_VAL(prop_info->ce->name),
+ ZSTR_VAL(name));
+ retval = &EG(error_zval);
+ } else {
+ ZVAL_NULL(retval);
+ 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 */
@@ -978,6 +1094,8 @@ ZEND_API zval *zend_std_get_property_ptr_ptr(zval *object, zval *member, int typ
zend_error(E_NOTICE, "Undefined property: %s::$%s", ZSTR_VAL(zobj->ce->name), ZSTR_VAL(name));
}
}
+ } else if (zobj->ce->__get == NULL) {
+ retval = &EG(error_zval);
}
zend_tmp_string_release(tmp_name);
@@ -990,16 +1108,26 @@ ZEND_API void zend_std_unset_property(zval *object, zval *member, void **cache_s
zend_object *zobj;
zend_string *name, *tmp_name;
uintptr_t property_offset;
+ zend_property_info *prop_info = NULL;
zobj = Z_OBJ_P(object);
- name = zval_get_tmp_string(member, &tmp_name);
+ name = zval_try_get_tmp_string(member, &tmp_name);
+ if (UNEXPECTED(!name)) {
+ return;
+ }
- property_offset = zend_get_property_offset(zobj->ce, name, (zobj->ce->__unset != NULL), cache_slot);
+ property_offset = zend_get_property_offset(zobj->ce, name, (zobj->ce->__unset != NULL), cache_slot, &prop_info);
if (EXPECTED(IS_VALID_PROPERTY_OFFSET(property_offset))) {
zval *slot = OBJ_PROP(zobj, property_offset);
if (Z_TYPE_P(slot) != IS_UNDEF) {
+ if (UNEXPECTED(Z_ISREF_P(slot)) &&
+ (ZEND_DEBUG || ZEND_REF_HAS_TYPE_SOURCES(Z_REF_P(slot)))) {
+ if (prop_info) {
+ ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(slot), prop_info);
+ }
+ }
zval_ptr_dtor(slot);
ZVAL_UNDEF(slot);
if (zobj->properties) {
@@ -1007,6 +1135,11 @@ ZEND_API void zend_std_unset_property(zval *object, zval *member, void **cache_s
}
goto exit;
}
+ if (UNEXPECTED(Z_PROP_FLAG_P(slot) == IS_PROP_UNINIT)) {
+ /* Reset the IS_PROP_UNINIT flag, if it exists and bypass __unset(). */
+ Z_PROP_FLAG_P(slot) = 0;
+ goto exit;
+ }
} else if (EXPECTED(IS_DYNAMIC_PROPERTY_OFFSET(property_offset))
&& EXPECTED(zobj->properties != NULL)) {
if (UNEXPECTED(GC_REFCOUNT(zobj->properties) > 1)) {
@@ -1030,11 +1163,13 @@ ZEND_API void zend_std_unset_property(zval *object, zval *member, void **cache_s
(*guard) |= IN_UNSET; /* prevent circular unsetting */
zend_std_call_unsetter(zobj, name);
(*guard) &= ~IN_UNSET;
+ } else if (UNEXPECTED(IS_WRONG_PROPERTY_OFFSET(property_offset))) {
+ /* Trigger the correct error */
+ zend_wrong_offset(zobj->ce, name);
+ ZEND_ASSERT(EG(exception));
+ goto exit;
} else {
- if (ZSTR_VAL(name)[0] == '\0' && ZSTR_LEN(name) != 0) {
- zend_throw_error(NULL, "Cannot access property started with '\\0'");
- goto exit;
- }
+ /* Nothing to do: The property already does not exist. */
}
}
@@ -1050,69 +1185,36 @@ ZEND_API void zend_std_unset_dimension(zval *object, zval *offset) /* {{{ */
if (instanceof_function_ex(ce, zend_ce_arrayaccess, 1)) {
ZVAL_COPY_DEREF(&tmp_offset, offset);
- ZVAL_COPY(&tmp_object, object);
+ Z_ADDREF_P(object);
+ ZVAL_OBJ(&tmp_object, Z_OBJ_P(object));
zend_call_method_with_1_params(&tmp_object, ce, NULL, "offsetunset", NULL, &tmp_offset);
zval_ptr_dtor(&tmp_object);
zval_ptr_dtor(&tmp_offset);
} else {
- zend_throw_error(NULL, "Cannot use object of type %s as array", ZSTR_VAL(ce->name));
+ zend_bad_array_access(ce);
}
}
/* }}} */
-static zend_always_inline zend_function *zend_get_parent_private(zend_class_entry *scope, zend_class_entry *ce, zend_string *function_name) /* {{{ */
+static zend_never_inline zend_function *zend_get_parent_private_method(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;
- }
+ if (scope != ce && scope && is_derived_class(ce, scope)) {
+ func = zend_hash_find(&scope->function_table, function_name);
+ if (func != NULL) {
+ 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.
- */
-ZEND_API int zend_check_private(zend_function *fbc, zend_class_entry *ce, zend_string *function_name) /* {{{ */
-{
- zend_class_entry *scope;
-
- if (!ce) {
- return 0;
- }
-
- /* We may call a private function if:
- * 1. The class of our object is the same as the scope, and the private
- * function (EX(fbc)) has the same scope.
- * 2. One of our parent classes are the same as the scope, and it contains
- * a private function with the same name that has the same scope.
- */
- scope = zend_get_executed_scope();
- if (fbc->common.scope == ce && scope == ce) {
- /* rule #1 checks out ok, allow the function call */
- return 1;
- }
-
-
- /* Check rule #2 */
- return zend_get_parent_private(scope, ce, function_name) != NULL;
-}
-/* }}} */
-
/* Ensures that we're allowed to call a protected method.
*/
ZEND_API int zend_check_protected(zend_class_entry *ce, zend_class_entry *scope) /* {{{ */
@@ -1147,6 +1249,10 @@ ZEND_API zend_function *zend_get_call_trampoline_func(zend_class_entry *ce, zend
size_t mname_len;
zend_op_array *func;
zend_function *fbc = is_static ? ce->__callstatic : ce->__call;
+ /* We use non-NULL value to avoid useless run_time_cache allocation.
+ * The low bit must be zero, to not be interpreted as a MAP_PTR offset.
+ */
+ static const void *dummy = (void*)(intptr_t)2;
ZEND_ASSERT(fbc);
@@ -1165,9 +1271,9 @@ 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->run_time_cache = (void*)(intptr_t)-1;
+ ZEND_MAP_PTR_INIT(func->run_time_cache, (void***)&dummy);
func->scope = fbc->common.scope;
- /* reserve space for arguments, local and temorary variables */
+ /* reserve space for arguments, local and temporary variables */
func->T = (fbc->type == ZEND_USER_FUNCTION)? MAX(fbc->op_array.last_var + fbc->op_array.T, 2) : 2;
func->filename = (fbc->type == ZEND_USER_FUNCTION)? fbc->op_array.filename : ZSTR_EMPTY_ALLOC();
func->line_start = (fbc->type == ZEND_USER_FUNCTION)? fbc->op_array.line_start : 0;
@@ -1181,6 +1287,11 @@ ZEND_API zend_function *zend_get_call_trampoline_func(zend_class_entry *ce, zend
func->function_name = zend_string_copy(method_name);
}
+ func->prototype = NULL;
+ func->num_args = 0;
+ func->required_num_args = 0;
+ func->arg_info = 0;
+
return (zend_function*)func;
}
/* }}} */
@@ -1191,13 +1302,19 @@ static zend_always_inline zend_function *zend_get_user_call_function(zend_class_
}
/* }}} */
+static ZEND_COLD zend_never_inline void zend_bad_method_call(zend_function *fbc, zend_string *method_name, zend_class_entry *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) : "");
+}
+/* }}} */
+
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;
zend_function *fbc;
zend_string *lc_method_name;
- zend_class_entry *scope = NULL;
+ zend_class_entry *scope;
ALLOCA_FLAG(use_heap);
if (EXPECTED(key != NULL)) {
@@ -1222,57 +1339,35 @@ ZEND_API zend_function *zend_std_get_method(zend_object **obj_ptr, zend_string *
}
fbc = Z_FUNC_P(func);
+
/* Check access level */
- if (fbc->op_array.fn_flags & ZEND_ACC_PRIVATE) {
- /* 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.
- */
+ if (fbc->op_array.fn_flags & (ZEND_ACC_CHANGED|ZEND_ACC_PRIVATE|ZEND_ACC_PROTECTED)) {
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 {
- 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 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...
- */
- scope = zend_get_executed_scope();
- do {
+ if (fbc->common.scope != scope) {
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;
+ zend_function *updated_fbc = zend_get_parent_private_method(scope, zobj->ce, lc_method_name);
+
+ if (EXPECTED(updated_fbc != NULL)) {
+ fbc = updated_fbc;
+ goto exit;
+ } else if (fbc->op_array.fn_flags & ZEND_ACC_PUBLIC) {
+ goto exit;
}
}
-
- /* 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.
- */
- if (UNEXPECTED(!zend_check_protected(zend_get_function_root_class(fbc), scope))) {
+ if (UNEXPECTED(fbc->op_array.fn_flags & ZEND_ACC_PRIVATE)
+ || UNEXPECTED(!zend_check_protected(zend_get_function_root_class(fbc), scope))) {
if (zobj->ce->__call) {
fbc = zend_get_user_call_function(zobj->ce, method_name);
} else {
- 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) : "");
+ zend_bad_method_call(fbc, method_name, scope);
fbc = NULL;
}
}
- } while (0);
+ }
}
+exit:
if (UNEXPECTED(!key)) {
ZSTR_ALLOCA_FREE(lc_method_name, use_heap);
}
@@ -1343,30 +1438,17 @@ ZEND_API zend_function *zend_std_get_static_method(zend_class_entry *ce, zend_st
zend_error_noreturn(E_ERROR, "Cannot call non static method %s::%s() without object", ZEND_FN_SCOPE_NAME(fbc), ZSTR_VAL(fbc->common.function_name));
}
#endif
- 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) {
- /* Ensure that if we're calling a private function, we're allowed to do so.
- */
+ if (!(fbc->op_array.fn_flags & ZEND_ACC_PUBLIC)) {
scope = zend_get_executed_scope();
if (UNEXPECTED(fbc->common.scope != scope)) {
- if (ce->__callstatic) {
- fbc = zend_get_user_callstatic_function(ce, function_name);
- } else {
- 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(function_name), scope ? ZSTR_VAL(scope->name) : "");
- fbc = NULL;
- }
- }
- } else if ((fbc->common.fn_flags & ZEND_ACC_PROTECTED)) {
- /* Ensure that if we're calling a protected function, we're allowed to do so.
- */
- scope = zend_get_executed_scope();
- if (UNEXPECTED(!zend_check_protected(zend_get_function_root_class(fbc), scope))) {
- if (ce->__callstatic) {
- fbc = zend_get_user_callstatic_function(ce, function_name);
- } else {
- 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(function_name), scope ? ZSTR_VAL(scope->name) : "");
- fbc = NULL;
+ if (UNEXPECTED(fbc->op_array.fn_flags & ZEND_ACC_PRIVATE)
+ || UNEXPECTED(!zend_check_protected(zend_get_function_root_class(fbc), scope))) {
+ if (ce->__callstatic) {
+ fbc = zend_get_user_callstatic_function(ce, function_name);
+ } else {
+ zend_bad_method_call(fbc, function_name, scope);
+ fbc = NULL;
+ }
}
}
}
@@ -1384,16 +1466,12 @@ 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->default_static_members_count && !CE_STATIC_MEMBERS(class_type)) {
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
+ ZEND_MAP_PTR_SET(class_type->static_members_table, emalloc(sizeof(zval) * class_type->default_static_members_count));
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) {
@@ -1407,20 +1485,32 @@ ZEND_API void zend_class_init_statics(zend_class_entry *class_type) /* {{{ */
}
} /* }}} */
-ZEND_API zval *zend_std_get_static_property(zend_class_entry *ce, zend_string *property_name, zend_bool silent) /* {{{ */
+ZEND_API zval *zend_std_get_static_property_with_info(zend_class_entry *ce, zend_string *property_name, int type, zend_property_info **property_info_ptr) /* {{{ */
{
- zend_property_info *property_info = zend_hash_find_ptr(&ce->properties_info, property_name);
zval *ret;
+ zend_class_entry *scope;
+ zend_property_info *property_info = zend_hash_find_ptr(&ce->properties_info, property_name);
+ *property_info_ptr = property_info;
if (UNEXPECTED(property_info == NULL)) {
goto undeclared_property;
}
- if (UNEXPECTED(!zend_verify_property_access(property_info, ce))) {
- if (!silent) {
- zend_throw_error(NULL, "Cannot access %s property %s::$%s", zend_visibility_string(property_info->flags), ZSTR_VAL(ce->name), ZSTR_VAL(property_name));
+ if (!(property_info->flags & ZEND_ACC_PUBLIC)) {
+ if (UNEXPECTED(EG(fake_scope))) {
+ scope = EG(fake_scope);
+ } else {
+ scope = zend_get_executed_scope();
+ }
+ if (property_info->ce != scope) {
+ if (UNEXPECTED(property_info->flags & ZEND_ACC_PRIVATE)
+ || UNEXPECTED(!is_protected_compatible_scope(property_info->ce, scope))) {
+ if (type != BP_VAR_IS) {
+ zend_bad_property_access(property_info, ce, property_name);
+ }
+ return NULL;
+ }
}
- return NULL;
}
if (UNEXPECTED((property_info->flags & ZEND_ACC_STATIC) == 0)) {
@@ -1433,13 +1523,13 @@ ZEND_API zval *zend_std_get_static_property(zend_class_entry *ce, zend_string *p
}
}
- /* check if static properties were destoyed */
+ /* check if static properties were destroyed */
if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
- if (ce->type == ZEND_INTERNAL_CLASS) {
+ if (ce->type == ZEND_INTERNAL_CLASS || (ce->ce_flags & (ZEND_ACC_IMMUTABLE|ZEND_ACC_PRELOADED))) {
zend_class_init_statics(ce);
} else {
undeclared_property:
- if (!silent) {
+ if (type != BP_VAR_IS) {
zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(property_name));
}
return NULL;
@@ -1448,10 +1538,25 @@ undeclared_property:
ret = CE_STATIC_MEMBERS(ce) + property_info->offset;
ZVAL_DEINDIRECT(ret);
+
+ if (UNEXPECTED((type == BP_VAR_R || type == BP_VAR_RW)
+ && Z_TYPE_P(ret) == IS_UNDEF && property_info->type != 0)) {
+ zend_throw_error(NULL, "Typed static property %s::$%s must not be accessed before initialization",
+ ZSTR_VAL(property_info->ce->name),
+ zend_get_unmangled_property_name(property_name));
+ return NULL;
+ }
+
return ret;
}
/* }}} */
+ZEND_API zval *zend_std_get_static_property(zend_class_entry *ce, zend_string *property_name, int type) /* {{{ */
+{
+ zend_property_info *prop_info;
+ return zend_std_get_static_property_with_info(ce, property_name, type, &prop_info);
+}
+
ZEND_API ZEND_COLD zend_bool zend_std_unset_static_property(zend_class_entry *ce, zend_string *property_name) /* {{{ */
{
zend_throw_error(NULL, "Attempt to unset static property %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(property_name));
@@ -1459,47 +1564,32 @@ ZEND_API ZEND_COLD zend_bool zend_std_unset_static_property(zend_class_entry *ce
}
/* }}} */
+static ZEND_COLD zend_never_inline void zend_bad_constructor_call(zend_function *constructor, zend_class_entry *scope) /* {{{ */
+{
+ if (scope) {
+ zend_throw_error(NULL, "Call to %s %s::%s() from context '%s'", zend_visibility_string(constructor->common.fn_flags), ZSTR_VAL(constructor->common.scope->name), ZSTR_VAL(constructor->common.function_name), ZSTR_VAL(scope->name));
+ } else {
+ zend_throw_error(NULL, "Call to %s %s::%s() from invalid context", zend_visibility_string(constructor->common.fn_flags), ZSTR_VAL(constructor->common.scope->name), ZSTR_VAL(constructor->common.function_name));
+ }
+}
+/* }}} */
+
ZEND_API zend_function *zend_std_get_constructor(zend_object *zobj) /* {{{ */
{
zend_function *constructor = zobj->ce->constructor;
zend_class_entry *scope;
if (constructor) {
- if (constructor->op_array.fn_flags & ZEND_ACC_PUBLIC) {
- /* No further checks necessary */
- } else if (constructor->op_array.fn_flags & ZEND_ACC_PRIVATE) {
- /* Ensure that if we're calling a private function, we're allowed to do so.
- */
- if (EG(fake_scope)) {
+ if (UNEXPECTED(!(constructor->op_array.fn_flags & ZEND_ACC_PUBLIC))) {
+ if (UNEXPECTED(EG(fake_scope))) {
scope = EG(fake_scope);
} else {
scope = zend_get_executed_scope();
}
if (UNEXPECTED(constructor->common.scope != scope)) {
- if (scope) {
- zend_throw_error(NULL, "Call to private %s::%s() from context '%s'", ZSTR_VAL(constructor->common.scope->name), ZSTR_VAL(constructor->common.function_name), ZSTR_VAL(scope->name));
- constructor = NULL;
- } else {
- zend_throw_error(NULL, "Call to private %s::%s() from invalid context", ZSTR_VAL(constructor->common.scope->name), ZSTR_VAL(constructor->common.function_name));
- constructor = NULL;
- }
- }
- } else if ((constructor->common.fn_flags & ZEND_ACC_PROTECTED)) {
- /* Ensure that if we're calling a protected function, we're allowed to do so.
- * Constructors only have prototype if they are defined by an interface but
- * it is the compilers responsibility to take care of the prototype.
- */
- if (EG(fake_scope)) {
- scope = EG(fake_scope);
- } else {
- scope = zend_get_executed_scope();
- }
- if (UNEXPECTED(!zend_check_protected(zend_get_function_root_class(constructor), scope))) {
- if (scope) {
- zend_throw_error(NULL, "Call to protected %s::%s() from context '%s'", ZSTR_VAL(constructor->common.scope->name), ZSTR_VAL(constructor->common.function_name), ZSTR_VAL(scope->name));
- constructor = NULL;
- } else {
- zend_throw_error(NULL, "Call to protected %s::%s() from invalid context", ZSTR_VAL(constructor->common.scope->name), ZSTR_VAL(constructor->common.function_name));
+ if (UNEXPECTED(constructor->op_array.fn_flags & ZEND_ACC_PRIVATE)
+ || UNEXPECTED(!zend_check_protected(zend_get_function_root_class(constructor), scope))) {
+ zend_bad_constructor_call(constructor, scope);
constructor = NULL;
}
}
@@ -1593,17 +1683,26 @@ ZEND_API int zend_std_has_property(zval *object, zval *member, int has_set_exist
zval *value = NULL;
zend_string *name, *tmp_name;
uintptr_t property_offset;
+ zend_property_info *prop_info = NULL;
zobj = Z_OBJ_P(object);
- name = zval_get_tmp_string(member, &tmp_name);
+ name = zval_try_get_tmp_string(member, &tmp_name);
+ if (UNEXPECTED(!name)) {
+ return 0;
+ }
- property_offset = zend_get_property_offset(zobj->ce, name, 1, cache_slot);
+ property_offset = zend_get_property_offset(zobj->ce, name, 1, cache_slot, &prop_info);
if (EXPECTED(IS_VALID_PROPERTY_OFFSET(property_offset))) {
value = OBJ_PROP(zobj, property_offset);
if (Z_TYPE_P(value) != IS_UNDEF) {
goto found;
}
+ if (UNEXPECTED(Z_PROP_FLAG_P(value) == IS_PROP_UNINIT)) {
+ /* Skip __isset() for uninitialized typed properties */
+ result = 0;
+ goto exit;
+ }
} else if (EXPECTED(IS_DYNAMIC_PROPERTY_OFFSET(property_offset))) {
if (EXPECTED(zobj->properties != NULL)) {
if (!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET(property_offset)) {
@@ -1700,31 +1799,18 @@ ZEND_API int zend_std_cast_object_tostring(zval *readobj, zval *writeobj, int ty
switch (type) {
case IS_STRING:
ce = Z_OBJCE_P(readobj);
- if (ce->__tostring &&
- (zend_call_method_with_0_params(readobj, ce, &ce->__tostring, "__tostring", &retval) || EG(exception))) {
- if (UNEXPECTED(EG(exception) != NULL)) {
- zval *msg, ex, rv;
- zval_ptr_dtor(&retval);
- ZVAL_OBJ(&ex, EG(exception));
- EG(exception) = NULL;
- msg = zend_read_property(Z_OBJCE(ex), &ex, "message", sizeof("message") - 1, 1, &rv);
- if (UNEXPECTED(Z_TYPE_P(msg) != IS_STRING)) {
- ZVAL_EMPTY_STRING(&rv);
- msg = &rv;
- }
- zend_error_noreturn(E_ERROR,
- "Method %s::__toString() must not throw an exception, caught %s: %s",
- ZSTR_VAL(ce->name), ZSTR_VAL(Z_OBJCE(ex)->name), Z_STRVAL_P(msg));
- return FAILURE;
- }
+ if (ce->__tostring) {
+ zend_class_entry *fake_scope = EG(fake_scope);
+ EG(fake_scope) = NULL;
+ zend_call_method_with_0_params(readobj, ce, &ce->__tostring, "__tostring", &retval);
+ EG(fake_scope) = fake_scope;
if (EXPECTED(Z_TYPE(retval) == IS_STRING)) {
ZVAL_COPY_VALUE(writeobj, &retval);
return SUCCESS;
- } else {
- zval_ptr_dtor(&retval);
- ZVAL_EMPTY_STRING(writeobj);
- zend_error(E_RECOVERABLE_ERROR, "Method %s::__toString() must return a string value", ZSTR_VAL(ce->name));
- return SUCCESS;
+ }
+ zval_ptr_dtor(&retval);
+ if (!EG(exception)) {
+ zend_throw_error(NULL, "Method %s::__toString() must return a string value", ZSTR_VAL(ce->name));
}
}
return FAILURE;
@@ -1778,6 +1864,43 @@ ZEND_API int zend_std_get_closure(zval *obj, zend_class_entry **ce_ptr, zend_fun
}
/* }}} */
+ZEND_API HashTable *zend_std_get_properties_for(zval *obj, zend_prop_purpose purpose) {
+ HashTable *ht;
+ switch (purpose) {
+ case ZEND_PROP_PURPOSE_DEBUG:
+ if (Z_OBJ_HT_P(obj)->get_debug_info) {
+ int is_temp;
+ ht = Z_OBJ_HT_P(obj)->get_debug_info(obj, &is_temp);
+ if (ht && !is_temp && !(GC_FLAGS(ht) & GC_IMMUTABLE)) {
+ GC_ADDREF(ht);
+ }
+ return ht;
+ }
+ /* break missing intentionally */
+ case ZEND_PROP_PURPOSE_ARRAY_CAST:
+ case ZEND_PROP_PURPOSE_SERIALIZE:
+ case ZEND_PROP_PURPOSE_VAR_EXPORT:
+ case ZEND_PROP_PURPOSE_JSON:
+ case _ZEND_PROP_PURPOSE_ARRAY_KEY_EXISTS:
+ ht = Z_OBJ_HT_P(obj)->get_properties(obj);
+ if (ht && !(GC_FLAGS(ht) & GC_IMMUTABLE)) {
+ GC_ADDREF(ht);
+ }
+ return ht;
+ default:
+ ZEND_ASSERT(0);
+ return NULL;
+ }
+}
+
+ZEND_API HashTable *zend_get_properties_for(zval *obj, zend_prop_purpose purpose) {
+ if (Z_OBJ_HT_P(obj)->get_properties_for) {
+ return Z_OBJ_HT_P(obj)->get_properties_for(obj, purpose);
+ }
+
+ return zend_std_get_properties_for(obj, purpose);
+}
+
ZEND_API const zend_object_handlers std_object_handlers = {
0, /* offset */
@@ -1809,14 +1932,5 @@ ZEND_API const zend_object_handlers std_object_handlers = {
zend_std_get_gc, /* get_gc */
NULL, /* do_operation */
NULL, /* compare */
+ NULL, /* get_properties_for */
};
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * indent-tabs-mode: t
- * End:
- * vim600: sw=4 ts=4 fdm=marker
- * vim<600: sw=4 ts=4
- */
diff --git a/Zend/zend_object_handlers.h b/Zend/zend_object_handlers.h
index acc4b7575f..770a67cbdd 100644
--- a/Zend/zend_object_handlers.h
+++ b/Zend/zend_object_handlers.h
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| Zend Engine |
+----------------------------------------------------------------------+
- | Copyright (c) 1998-2018 Zend Technologies Ltd. (http://www.zend.com) |
+ | Copyright (c) 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 |
@@ -51,9 +51,10 @@ typedef zval *(*zend_object_read_dimension_t)(zval *object, zval *offset, int ty
If you receive a value zval in write_property/write_dimension, you may only modify it if
its reference count is 1. Otherwise, you must create a copy of that zval before making
any changes. You should NOT modify the reference count of the value passed to you.
+ You must return the final value of the assigned property.
*/
/* Used to set property of the object */
-typedef void (*zend_object_write_property_t)(zval *object, zval *member, zval *value, void **cache_slot);
+typedef zval *(*zend_object_write_property_t)(zval *object, zval *member, zval *value, void **cache_slot);
/* Used to set dimension of the object */
typedef void (*zend_object_write_dimension_t)(zval *object, zval *offset, zval *value);
@@ -93,6 +94,28 @@ typedef HashTable *(*zend_object_get_properties_t)(zval *object);
typedef HashTable *(*zend_object_get_debug_info_t)(zval *object, int *is_temp);
+typedef enum _zend_prop_purpose {
+ /* Used for debugging. Supersedes get_debug_info handler. */
+ ZEND_PROP_PURPOSE_DEBUG,
+ /* Used for (array) casts. */
+ ZEND_PROP_PURPOSE_ARRAY_CAST,
+ /* Used for serialization using the "O" scheme.
+ * Unserialization will use __wakeup(). */
+ ZEND_PROP_PURPOSE_SERIALIZE,
+ /* Used for var_export().
+ * The data will be passed to __set_state() when evaluated. */
+ ZEND_PROP_PURPOSE_VAR_EXPORT,
+ /* Used for json_encode(). */
+ ZEND_PROP_PURPOSE_JSON,
+ /* array_key_exists(). Not intended for general use! */
+ _ZEND_PROP_PURPOSE_ARRAY_KEY_EXISTS,
+ /* Dummy member to ensure that "default" is specified. */
+ _ZEND_PROP_PURPOSE_NON_EXHAUSTIVE_ENUM
+} zend_prop_purpose;
+
+/* The return value must be released using zend_release_properties(). */
+typedef zend_array *(*zend_object_get_properties_for_t)(zval *object, zend_prop_purpose purpose);
+
/* Used to call methods */
/* args on stack! */
/* 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.
@@ -111,7 +134,7 @@ typedef zend_object* (*zend_object_clone_obj_t)(zval *object);
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);
+typedef int (*zend_object_compare_zvals_t)(zval *result, zval *op1, zval *op2);
/* Cast an object to some other type.
* readobj and retval must point to distinct zvals.
@@ -131,35 +154,35 @@ typedef int (*zend_object_do_operation_t)(zend_uchar opcode, zval *result, zval
struct _zend_object_handlers {
/* offset of real object header (usually zero) */
int offset;
- /* general object functions */
- zend_object_free_obj_t free_obj;
- zend_object_dtor_obj_t dtor_obj;
- zend_object_clone_obj_t clone_obj;
- /* individual object functions */
- zend_object_read_property_t read_property;
- zend_object_write_property_t write_property;
- zend_object_read_dimension_t read_dimension;
- zend_object_write_dimension_t write_dimension;
- zend_object_get_property_ptr_ptr_t get_property_ptr_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_has_dimension_t has_dimension;
- zend_object_unset_dimension_t unset_dimension;
- 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_name_t get_class_name;
- zend_object_compare_t compare_objects;
- zend_object_cast_t cast_object;
- zend_object_count_elements_t count_elements;
- zend_object_get_debug_info_t get_debug_info;
- zend_object_get_closure_t get_closure;
- zend_object_get_gc_t get_gc;
- zend_object_do_operation_t do_operation;
- zend_object_compare_zvals_t compare;
+ /* object handlers */
+ zend_object_free_obj_t free_obj; /* required */
+ zend_object_dtor_obj_t dtor_obj; /* required */
+ zend_object_clone_obj_t clone_obj; /* optional */
+ zend_object_read_property_t read_property; /* required */
+ zend_object_write_property_t write_property; /* required */
+ zend_object_read_dimension_t read_dimension; /* required */
+ zend_object_write_dimension_t write_dimension; /* required */
+ zend_object_get_property_ptr_ptr_t get_property_ptr_ptr; /* required */
+ zend_object_get_t get; /* optional */
+ zend_object_set_t set; /* optional */
+ zend_object_has_property_t has_property; /* required */
+ zend_object_unset_property_t unset_property; /* required */
+ zend_object_has_dimension_t has_dimension; /* required */
+ zend_object_unset_dimension_t unset_dimension; /* required */
+ zend_object_get_properties_t get_properties; /* required */
+ zend_object_get_method_t get_method; /* required */
+ zend_object_call_method_t call_method; /* optional */
+ zend_object_get_constructor_t get_constructor; /* required */
+ zend_object_get_class_name_t get_class_name; /* required */
+ zend_object_compare_t compare_objects; /* optional */
+ zend_object_cast_t cast_object; /* optional */
+ zend_object_count_elements_t count_elements; /* optional */
+ zend_object_get_debug_info_t get_debug_info; /* optional */
+ zend_object_get_closure_t get_closure; /* optional */
+ zend_object_get_gc_t get_gc; /* required */
+ zend_object_do_operation_t do_operation; /* optional */
+ zend_object_compare_zvals_t compare; /* optional */
+ zend_object_get_properties_for_t get_properties_for; /* optional */
};
BEGIN_EXTERN_C()
@@ -177,7 +200,8 @@ extern const ZEND_API zend_object_handlers std_object_handlers;
ZEND_API void zend_class_init_statics(zend_class_entry *ce);
ZEND_API zend_function *zend_std_get_static_method(zend_class_entry *ce, zend_string *function_name_strval, const zval *key);
-ZEND_API zval *zend_std_get_static_property(zend_class_entry *ce, zend_string *property_name, zend_bool silent);
+ZEND_API zval *zend_std_get_static_property_with_info(zend_class_entry *ce, zend_string *property_name, int type, struct _zend_property_info **prop_info);
+ZEND_API zval *zend_std_get_static_property(zend_class_entry *ce, zend_string *property_name, int type);
ZEND_API ZEND_COLD zend_bool zend_std_unset_static_property(zend_class_entry *ce, zend_string *property_name);
ZEND_API zend_function *zend_std_get_constructor(zend_object *object);
ZEND_API struct _zend_property_info *zend_get_property_info(zend_class_entry *ce, zend_string *member, int silent);
@@ -187,7 +211,7 @@ ZEND_API HashTable *zend_std_get_debug_info(zval *object, int *is_temp);
ZEND_API int zend_std_cast_object_tostring(zval *readobj, zval *writeobj, int type);
ZEND_API zval *zend_std_get_property_ptr_ptr(zval *object, zval *member, int type, void **cache_slot);
ZEND_API zval *zend_std_read_property(zval *object, zval *member, int type, void **cache_slot, zval *rv);
-ZEND_API void zend_std_write_property(zval *object, zval *member, zval *value, void **cache_slot);
+ZEND_API zval *zend_std_write_property(zval *object, zval *member, zval *value, void **cache_slot);
ZEND_API int zend_std_has_property(zval *object, zval *member, int has_set_exists, void **cache_slot);
ZEND_API void zend_std_unset_property(zval *object, zval *member, void **cache_slot);
ZEND_API zval *zend_std_read_dimension(zval *object, zval *offset, int type, zval *rv);
@@ -200,16 +224,28 @@ 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(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);
-ZEND_API int zend_check_property_access(zend_object *zobj, zend_string *prop_info_name);
+ZEND_API int zend_check_property_access(zend_object *zobj, zend_string *prop_info_name, zend_bool is_dynamic);
ZEND_API zend_function *zend_get_call_trampoline_func(zend_class_entry *ce, zend_string *method_name, int is_static);
ZEND_API uint32_t *zend_get_property_guard(zend_object *zobj, zend_string *member);
+/* Default behavior for get_properties_for. For use as a fallback in custom
+ * get_properties_for implementations. */
+ZEND_API HashTable *zend_std_get_properties_for(zval *obj, zend_prop_purpose purpose);
+
+/* Will call get_properties_for handler or use default behavior. For use by
+ * consumers of the get_properties_for API. */
+ZEND_API HashTable *zend_get_properties_for(zval *obj, zend_prop_purpose purpose);
+
+#define zend_release_properties(ht) do { \
+ if ((ht) && !(GC_FLAGS(ht) & GC_IMMUTABLE) && !GC_DELREF(ht)) { \
+ zend_array_destroy(ht); \
+ } \
+} while (0)
+
#define zend_free_trampoline(func) do { \
if ((func) == &EG(trampoline)) { \
EG(trampoline).common.function_name = NULL; \
@@ -221,13 +257,3 @@ ZEND_API uint32_t *zend_get_property_guard(zend_object *zobj, zend_string *membe
END_EXTERN_C()
#endif
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * indent-tabs-mode: t
- * End:
- * vim600: sw=4 ts=4 fdm=marker
- * vim<600: sw=4 ts=4
- */
diff --git a/Zend/zend_objects.c b/Zend/zend_objects.c
index b0a50df113..ac9412a1c6 100644
--- a/Zend/zend_objects.c
+++ b/Zend/zend_objects.c
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| Zend Engine |
+----------------------------------------------------------------------+
- | Copyright (c) 1998-2018 Zend Technologies Ltd. (http://www.zend.com) |
+ | Copyright (c) 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 |
@@ -24,8 +24,9 @@
#include "zend_API.h"
#include "zend_interfaces.h"
#include "zend_exceptions.h"
+#include "zend_weakrefs.h"
-ZEND_API void ZEND_FASTCALL zend_object_std_init(zend_object *object, zend_class_entry *ce)
+static zend_always_inline void _zend_object_std_init(zend_object *object, zend_class_entry *ce)
{
GC_SET_REFCOUNT(object, 1);
GC_TYPE_INFO(object) = IS_OBJECT | (GC_COLLECTABLE << GC_FLAGS_SHIFT);
@@ -37,6 +38,11 @@ ZEND_API void ZEND_FASTCALL zend_object_std_init(zend_object *object, zend_class
}
}
+ZEND_API void ZEND_FASTCALL zend_object_std_init(zend_object *object, zend_class_entry *ce)
+{
+ _zend_object_std_init(object, ce);
+}
+
ZEND_API void zend_object_std_dtor(zend_object *object)
{
zval *p, *end;
@@ -53,10 +59,20 @@ ZEND_API void zend_object_std_dtor(zend_object *object)
if (EXPECTED(object->ce->default_properties_count)) {
end = p + object->ce->default_properties_count;
do {
- i_zval_ptr_dtor(p ZEND_FILE_LINE_CC);
+ if (Z_REFCOUNTED_P(p)) {
+ if (UNEXPECTED(Z_ISREF_P(p)) &&
+ (ZEND_DEBUG || ZEND_REF_HAS_TYPE_SOURCES(Z_REF_P(p)))) {
+ zend_property_info *prop_info = zend_get_property_info_for_slot(object, p);
+ if (prop_info->type) {
+ ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(p), prop_info);
+ }
+ }
+ i_zval_ptr_dtor(p);
+ }
p++;
} while (p != end);
}
+
if (UNEXPECTED(object->ce->ce_flags & ZEND_ACC_USE_GUARDS)) {
if (EXPECTED(Z_TYPE_P(p) == IS_STRING)) {
zval_ptr_dtor_str(p);
@@ -69,6 +85,10 @@ ZEND_API void zend_object_std_dtor(zend_object *object)
FREE_HASHTABLE(guards);
}
}
+
+ if (UNEXPECTED(GC_FLAGS(object) & IS_OBJ_WEAKLY_REFERENCED)) {
+ zend_weakrefs_notify(object);
+ }
}
ZEND_API void zend_objects_destroy_object(zend_object *object)
@@ -175,7 +195,7 @@ 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));
- zend_object_std_init(object, ce);
+ _zend_object_std_init(object, ce);
object->handlers = &std_object_handlers;
return object;
}
@@ -188,9 +208,16 @@ ZEND_API void ZEND_FASTCALL zend_objects_clone_members(zend_object *new_object,
zval *end = src + old_object->ce->default_properties_count;
do {
- i_zval_ptr_dtor(dst ZEND_FILE_LINE_CC);
- ZVAL_COPY_VALUE(dst, src);
+ i_zval_ptr_dtor(dst);
+ ZVAL_COPY_VALUE_PROP(dst, src);
zval_add_ref(dst);
+ if (UNEXPECTED(Z_ISREF_P(dst)) &&
+ (ZEND_DEBUG || ZEND_REF_HAS_TYPE_SOURCES(Z_REF_P(dst)))) {
+ zend_property_info *prop_info = zend_get_property_info_for_slot(new_object, dst);
+ if (prop_info->type) {
+ ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(dst), prop_info);
+ }
+ }
src++;
dst++;
} while (src != end);
@@ -287,13 +314,3 @@ ZEND_API zend_object *zend_objects_clone_obj(zval *zobject)
return new_object;
}
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * indent-tabs-mode: t
- * End:
- * vim600: sw=4 ts=4 fdm=marker
- * vim<600: sw=4 ts=4
- */
diff --git a/Zend/zend_objects.h b/Zend/zend_objects.h
index 6857765525..cb0015599b 100644
--- a/Zend/zend_objects.h
+++ b/Zend/zend_objects.h
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| Zend Engine |
+----------------------------------------------------------------------+
- | Copyright (c) 1998-2018 Zend Technologies Ltd. (http://www.zend.com) |
+ | Copyright (c) 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 |
@@ -33,13 +33,3 @@ ZEND_API zend_object *zend_objects_clone_obj(zval *object);
END_EXTERN_C()
#endif /* ZEND_OBJECTS_H */
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * indent-tabs-mode: t
- * End:
- * vim600: sw=4 ts=4 fdm=marker
- * vim<600: sw=4 ts=4
- */
diff --git a/Zend/zend_objects_API.c b/Zend/zend_objects_API.c
index c5ac9708e5..80359b5e1e 100644
--- a/Zend/zend_objects_API.c
+++ b/Zend/zend_objects_API.c
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| Zend Engine |
+----------------------------------------------------------------------+
- | Copyright (c) 1998-2018 Zend Technologies Ltd. (http://www.zend.com) |
+ | Copyright (c) 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 |
@@ -50,9 +50,8 @@ ZEND_API void ZEND_FASTCALL zend_objects_store_call_destructors(zend_objects_sto
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)) {
+ if (obj->handlers->dtor_obj != zend_objects_destroy_object
+ || obj->ce->destructor) {
GC_ADDREF(obj);
obj->handlers->dtor_obj(obj);
GC_DELREF(obj);
@@ -88,7 +87,8 @@ ZEND_API void ZEND_FASTCALL zend_objects_store_free_object_storage(zend_objects_
return;
}
- /* Free object contents, but don't free objects themselves, so they show up as leaks */
+ /* Free object contents, but don't free objects themselves, so they show up as leaks.
+ * Also add a ref to all objects, so the object can't be freed by something else later. */
end = objects->object_buckets + 1;
obj_ptr = objects->object_buckets + objects->top;
@@ -99,10 +99,9 @@ ZEND_API void ZEND_FASTCALL zend_objects_store_free_object_storage(zend_objects_
if (IS_OBJ_VALID(obj)) {
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) {
+ if (obj->handlers->free_obj != zend_object_std_dtor) {
GC_ADDREF(obj);
obj->handlers->free_obj(obj);
- GC_DELREF(obj);
}
}
}
@@ -114,11 +113,8 @@ ZEND_API void ZEND_FASTCALL zend_objects_store_free_object_storage(zend_objects_
if (IS_OBJ_VALID(obj)) {
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);
- }
+ GC_ADDREF(obj);
+ obj->handlers->free_obj(obj);
}
}
} while (obj_ptr != end);
@@ -127,6 +123,18 @@ ZEND_API void ZEND_FASTCALL zend_objects_store_free_object_storage(zend_objects_
/* Store objects API */
+static ZEND_COLD zend_never_inline void ZEND_FASTCALL zend_objects_store_put_cold(zend_object *object)
+{
+ int handle;
+ uint32_t new_size = 2 * EG(objects_store).size;
+
+ EG(objects_store).object_buckets = (zend_object **) erealloc(EG(objects_store).object_buckets, new_size * sizeof(zend_object*));
+ /* Assign size after realloc, in case it fails */
+ EG(objects_store).size = new_size;
+ handle = EG(objects_store).top++;
+ object->handle = handle;
+ EG(objects_store).object_buckets[handle] = object;
+}
ZEND_API void ZEND_FASTCALL zend_objects_store_put(zend_object *object)
{
@@ -138,13 +146,10 @@ ZEND_API void ZEND_FASTCALL zend_objects_store_put(zend_object *object)
if (EG(objects_store).free_list_head != -1 && EXPECTED(!(EG(flags) & EG_FLAGS_OBJECT_STORE_NO_REUSE))) {
handle = EG(objects_store).free_list_head;
EG(objects_store).free_list_head = GET_OBJ_BUCKET_NUMBER(EG(objects_store).object_buckets[handle]);
+ } else if (UNEXPECTED(EG(objects_store).top == EG(objects_store).size)) {
+ zend_objects_store_put_cold(object);
+ return;
} else {
- if (EG(objects_store).top == EG(objects_store).size) {
- uint32_t new_size = 2 * EG(objects_store).size;
- EG(objects_store).object_buckets = (zend_object **) erealloc(EG(objects_store).object_buckets, new_size * sizeof(zend_object*));
- /* Assign size after realloc, in case it fails */
- EG(objects_store).size = new_size;
- }
handle = EG(objects_store).top++;
}
object->handle = handle;
@@ -167,10 +172,9 @@ ZEND_API void ZEND_FASTCALL zend_objects_store_del(zend_object *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);
+ if (object->handlers->dtor_obj != zend_objects_destroy_object
+ || object->ce->destructor) {
+ GC_SET_REFCOUNT(object, 1);
object->handlers->dtor_obj(object);
GC_DELREF(object);
}
@@ -181,15 +185,12 @@ ZEND_API void ZEND_FASTCALL zend_objects_store_del(zend_object *object) /* {{{ *
void *ptr;
ZEND_ASSERT(EG(objects_store).object_buckets != NULL);
- ZEND_ASSERT(IS_OBJ_VALID(EG(objects_store).object_buckets[object->handle]));
+ ZEND_ASSERT(IS_OBJ_VALID(EG(objects_store).object_buckets[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);
- }
+ GC_SET_REFCOUNT(object, 1);
+ object->handlers->free_obj(object);
}
ptr = ((char*)object) - object->handlers->offset;
GC_REMOVE_FROM_BUFFER(object);
@@ -198,13 +199,3 @@ ZEND_API void ZEND_FASTCALL zend_objects_store_del(zend_object *object) /* {{{ *
}
}
/* }}} */
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * indent-tabs-mode: t
- * End:
- * vim600: sw=4 ts=4 fdm=marker
- * vim<600: sw=4 ts=4
- */
diff --git a/Zend/zend_objects_API.h b/Zend/zend_objects_API.h
index 25c263863c..b9a838e7bb 100644
--- a/Zend/zend_objects_API.h
+++ b/Zend/zend_objects_API.h
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| Zend Engine |
+----------------------------------------------------------------------+
- | Copyright (c) 1998-2018 Zend Technologies Ltd. (http://www.zend.com) |
+ | Copyright (c) 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 |
@@ -67,8 +67,6 @@ static zend_always_inline void zend_object_store_ctor_failed(zend_object *obj)
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
-
END_EXTERN_C()
static zend_always_inline void zend_object_release(zend_object *obj)
@@ -97,15 +95,23 @@ static zend_always_inline void *zend_object_alloc(size_t obj_size, zend_class_en
return obj;
}
+static inline zend_property_info *zend_get_property_info_for_slot(zend_object *obj, zval *slot)
+{
+ zend_property_info **table = obj->ce->properties_info_table;
+ intptr_t prop_num = slot - obj->properties_table;
+ ZEND_ASSERT(prop_num >= 0 && prop_num < obj->ce->default_properties_count);
+ return table[prop_num];
+}
-#endif /* ZEND_OBJECTS_H */
+/* Helper for cases where we're only interested in property info of typed properties. */
+static inline zend_property_info *zend_get_typed_property_info_for_slot(zend_object *obj, zval *slot)
+{
+ zend_property_info *prop_info = zend_get_property_info_for_slot(obj, slot);
+ if (prop_info && prop_info->type) {
+ return prop_info;
+ }
+ return NULL;
+}
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * indent-tabs-mode: t
- * End:
- * vim600: sw=4 ts=4 fdm=marker
- * vim<600: sw=4 ts=4
- */
+
+#endif /* ZEND_OBJECTS_H */
diff --git a/Zend/zend_opcode.c b/Zend/zend_opcode.c
index a7f32de379..d0d49934fe 100644
--- a/Zend/zend_opcode.c
+++ b/Zend/zend_opcode.c
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| Zend Engine |
+----------------------------------------------------------------------+
- | Copyright (c) 1998-2018 Zend Technologies Ltd. (http://www.zend.com) |
+ | Copyright (c) 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 |
@@ -76,6 +76,7 @@ void init_op_array(zend_op_array *op_array, zend_uchar type, int initial_ops_siz
op_array->last_live_range = 0;
op_array->static_variables = NULL;
+ ZEND_MAP_PTR_INIT(op_array->static_variables_ptr, &op_array->static_variables);
op_array->last_try_catch = 0;
op_array->fn_flags = 0;
@@ -83,8 +84,8 @@ void init_op_array(zend_op_array *op_array, zend_uchar type, int initial_ops_siz
op_array->last_literal = 0;
op_array->literals = NULL;
- op_array->run_time_cache = NULL;
- op_array->cache_size = 0;
+ ZEND_MAP_PTR_INIT(op_array->run_time_cache, NULL);
+ op_array->cache_size = zend_op_array_extension_handles * sizeof(void*);
memset(op_array->reserved, 0, ZEND_MAX_RESERVED_RESOURCES * sizeof(void*));
@@ -101,6 +102,26 @@ ZEND_API void destroy_zend_function(zend_function *function)
zend_function_dtor(&tmp);
}
+void zend_free_internal_arg_info(zend_internal_function *function) {
+ if ((function->fn_flags & (ZEND_ACC_HAS_RETURN_TYPE|ZEND_ACC_HAS_TYPE_HINTS)) &&
+ function->arg_info) {
+
+ uint32_t i;
+ uint32_t num_args = function->num_args + 1;
+ zend_internal_arg_info *arg_info = function->arg_info - 1;
+
+ if (function->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_ex(ZEND_TYPE_NAME(arg_info[i].type), 1);
+ }
+ }
+ free(arg_info);
+ }
+}
+
ZEND_API void zend_function_dtor(zval *zv)
{
zend_function *function = Z_PTR_P(zv);
@@ -114,22 +135,9 @@ ZEND_API void zend_function_dtor(zval *zv)
ZEND_ASSERT(function->common.function_name);
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) {
-
- 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_ex(ZEND_TYPE_NAME(arg_info[i].type), 1);
- }
- }
- free(arg_info);
+ /* For methods this will be called explicitly. */
+ if (!function->common.scope) {
+ zend_free_internal_arg_info(&function->internal_function);
}
if (!(function->common.fn_flags & ZEND_ACC_ARENA_ALLOCATED)) {
@@ -144,28 +152,57 @@ ZEND_API void zend_cleanup_internal_class_data(zend_class_entry *ce)
zval *static_members = CE_STATIC_MEMBERS(ce);
zval *p = static_members;
zval *end = p + ce->default_static_members_count;
-
-#ifdef ZTS
- CG(static_members_table)[(zend_intptr_t)(ce->static_members_table)] = NULL;
-#else
- ce->static_members_table = NULL;
-#endif
- while (p != end) {
- i_zval_ptr_dtor(p ZEND_FILE_LINE_CC);
- p++;
+ if (UNEXPECTED(ZEND_MAP_PTR(ce->static_members_table) == &ce->default_static_members_table)) {
+ /* Special case: If this is a static property on a dl'ed internal class, then the
+ * static property table and the default property table are the same. In this case we
+ * destroy the values here, but leave behind valid UNDEF zvals and don't free the
+ * table itself. */
+ while (p != end) {
+ if (UNEXPECTED(Z_ISREF_P(p))) {
+ zend_property_info *prop_info;
+ ZEND_REF_FOREACH_TYPE_SOURCES(Z_REF_P(p), prop_info) {
+ if (prop_info->ce == ce && p - static_members == prop_info->offset) {
+ ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(p), prop_info);
+ break; /* stop iteration here, the array might be realloc()'ed */
+ }
+ } ZEND_REF_FOREACH_TYPE_SOURCES_END();
+ }
+ i_zval_ptr_dtor(p);
+ ZVAL_UNDEF(p);
+ p++;
+ }
+ } else {
+ ZEND_MAP_PTR_SET(ce->static_members_table, NULL);
+ while (p != end) {
+ if (UNEXPECTED(Z_ISREF_P(p))) {
+ zend_property_info *prop_info;
+ ZEND_REF_FOREACH_TYPE_SOURCES(Z_REF_P(p), prop_info) {
+ if (prop_info->ce == ce && p - static_members == prop_info->offset) {
+ ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(p), prop_info);
+ break; /* stop iteration here, the array might be realloc()'ed */
+ }
+ } ZEND_REF_FOREACH_TYPE_SOURCES_END();
+ }
+ i_zval_ptr_dtor(p);
+ p++;
+ }
+ efree(static_members);
}
- efree(static_members);
}
}
-void _destroy_zend_class_traits_info(zend_class_entry *ce)
+static void _destroy_zend_class_traits_info(zend_class_entry *ce)
{
- if (ce->num_traits > 0 && ce->traits) {
- efree(ce->traits);
+ uint32_t i;
+
+ for (i = 0; i < ce->num_traits; i++) {
+ zend_string_release_ex(ce->trait_names[i].name, 0);
+ zend_string_release_ex(ce->trait_names[i].lc_name, 0);
}
+ efree(ce->trait_names);
if (ce->trait_aliases) {
- size_t i = 0;
+ i = 0;
while (ce->trait_aliases[i]) {
if (ce->trait_aliases[i]->trait_method.method_name) {
zend_string_release_ex(ce->trait_aliases[i]->trait_method.method_name, 0);
@@ -186,9 +223,9 @@ void _destroy_zend_class_traits_info(zend_class_entry *ce)
}
if (ce->trait_precedences) {
- int i = 0;
- int j;
+ uint32_t j;
+ i = 0;
while (ce->trait_precedences[i]) {
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);
@@ -209,17 +246,34 @@ ZEND_API void destroy_zend_class(zval *zv)
zend_class_entry *ce = Z_PTR_P(zv);
zend_function *fn;
- if (--ce->refcount > 0) {
+ if (ce->ce_flags & (ZEND_ACC_IMMUTABLE|ZEND_ACC_PRELOADED)) {
+ zend_op_array *op_array;
+
+ if (ce->default_static_members_count) {
+ zend_cleanup_internal_class_data(ce);
+ }
+ if (ce->ce_flags & ZEND_HAS_STATIC_IN_METHODS) {
+ ZEND_HASH_FOREACH_PTR(&ce->function_table, op_array) {
+ if (op_array->type == ZEND_USER_FUNCTION) {
+ destroy_op_array(op_array);
+ }
+ } ZEND_HASH_FOREACH_END();
+ }
+ return;
+ } else if (--ce->refcount > 0) {
return;
}
switch (ce->type) {
case ZEND_USER_CLASS:
+ if (ce->parent_name && !(ce->ce_flags & ZEND_ACC_RESOLVED_PARENT)) {
+ zend_string_release_ex(ce->parent_name, 0);
+ }
if (ce->default_properties_table) {
zval *p = ce->default_properties_table;
zval *end = p + ce->default_properties_count;
while (p != end) {
- i_zval_ptr_dtor(p ZEND_FILE_LINE_CC);
+ i_zval_ptr_dtor(p);
p++;
}
efree(ce->default_properties_table);
@@ -229,18 +283,29 @@ ZEND_API void destroy_zend_class(zval *zv)
zval *end = p + ce->default_static_members_count;
while (p != end) {
- i_zval_ptr_dtor(p ZEND_FILE_LINE_CC);
+ if (UNEXPECTED(Z_ISREF_P(p))) {
+ zend_property_info *prop_info;
+ ZEND_REF_FOREACH_TYPE_SOURCES(Z_REF_P(p), prop_info) {
+ if (prop_info->ce == ce && p - ce->default_static_members_table == prop_info->offset) {
+ ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(p), prop_info);
+ break; /* stop iteration here, the array might be realloc()'ed */
+ }
+ } ZEND_REF_FOREACH_TYPE_SOURCES_END();
+ }
+ i_zval_ptr_dtor(p);
p++;
}
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) && prop_info->ce == ce->parent)) {
+ if (prop_info->ce == ce) {
zend_string_release_ex(prop_info->name, 0);
if (prop_info->doc_comment) {
zend_string_release_ex(prop_info->doc_comment, 0);
}
+ if (ZEND_TYPE_IS_NAME(prop_info->type)) {
+ zend_string_release(ZEND_TYPE_NAME(prop_info->type));
+ }
}
} ZEND_HASH_FOREACH_END();
zend_hash_destroy(&ce->properties_info);
@@ -259,14 +324,24 @@ ZEND_API void destroy_zend_class(zval *zv)
} ZEND_HASH_FOREACH_END();
}
zend_hash_destroy(&ce->constants_table);
- if (ce->num_interfaces > 0 && ce->interfaces) {
+ if (ce->num_interfaces > 0) {
+ if (!(ce->ce_flags & ZEND_ACC_RESOLVED_INTERFACES)) {
+ uint32_t i;
+
+ for (i = 0; i < ce->num_interfaces; i++) {
+ zend_string_release_ex(ce->interface_names[i].name, 0);
+ zend_string_release_ex(ce->interface_names[i].lc_name, 0);
+ }
+ }
efree(ce->interfaces);
}
if (ce->info.user.doc_comment) {
zend_string_release_ex(ce->info.user.doc_comment, 0);
}
- _destroy_zend_class_traits_info(ce);
+ if (ce->num_traits > 0) {
+ _destroy_zend_class_traits_info(ce);
+ }
break;
case ZEND_INTERNAL_CLASS:
@@ -289,6 +364,9 @@ ZEND_API void destroy_zend_class(zval *zv)
p++;
}
free(ce->default_static_members_table);
+ if (ZEND_MAP_PTR(ce->static_members_table) != &ce->default_static_members_table) {
+ zend_cleanup_internal_class_data(ce);
+ }
}
zend_hash_destroy(&ce->properties_info);
zend_string_release_ex(ce->name, 1);
@@ -297,8 +375,7 @@ ZEND_API void destroy_zend_class(zval *zv)
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) {
- /* reset function scope to allow arg_info removing */
- fn->common.scope = NULL;
+ zend_free_internal_arg_info(&fn->internal_function);
}
} ZEND_HASH_FOREACH_END();
@@ -323,6 +400,9 @@ ZEND_API void destroy_zend_class(zval *zv)
if (ce->num_interfaces > 0) {
free(ce->interfaces);
}
+ if (ce->properties_info_table) {
+ free(ce->properties_info_table);
+ }
free(ce);
break;
}
@@ -332,23 +412,27 @@ void zend_class_add_ref(zval *zv)
{
zend_class_entry *ce = Z_PTR_P(zv);
- ce->refcount++;
+ if (!(ce->ce_flags & ZEND_ACC_IMMUTABLE)) {
+ ce->refcount++;
+ }
}
ZEND_API void destroy_op_array(zend_op_array *op_array)
{
uint32_t i;
- if (op_array->static_variables &&
- !(GC_FLAGS(op_array->static_variables) & IS_ARRAY_IMMUTABLE)) {
- if (GC_DELREF(op_array->static_variables) == 0) {
- zend_array_destroy(op_array->static_variables);
+ if (op_array->static_variables) {
+ HashTable *ht = ZEND_MAP_PTR_GET(op_array->static_variables_ptr);
+ if (ht && !(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE)) {
+ if (GC_DELREF(ht) == 0) {
+ zend_array_destroy(ht);
+ }
}
}
- if (op_array->run_time_cache && !op_array->function_name) {
- efree(op_array->run_time_cache);
- op_array->run_time_cache = NULL;
+ if ((op_array->fn_flags & ZEND_ACC_HEAP_RT_CACHE)
+ && ZEND_MAP_PTR(op_array->run_time_cache)) {
+ efree(ZEND_MAP_PTR(op_array->run_time_cache));
}
if (!op_array->refcount || --(*op_array->refcount) > 0) {
@@ -420,7 +504,7 @@ ZEND_API void destroy_op_array(zend_op_array *op_array)
}
}
-static void zend_update_extended_info(zend_op_array *op_array)
+static void zend_update_extended_stmts(zend_op_array *op_array)
{
zend_op *opline = op_array->opcodes, *end=opline+op_array->last;
@@ -489,18 +573,307 @@ 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;
}
+static void emit_live_range_raw(
+ zend_op_array *op_array, uint32_t var_num, uint32_t kind, uint32_t start, uint32_t end) {
+ zend_live_range *range;
+
+ op_array->last_live_range++;
+ op_array->live_range = erealloc(op_array->live_range,
+ sizeof(zend_live_range) * op_array->last_live_range);
+
+ ZEND_ASSERT(start < end);
+ range = &op_array->live_range[op_array->last_live_range - 1];
+ range->var = (uint32_t) (intptr_t) ZEND_CALL_VAR_NUM(NULL, op_array->last_var + var_num);
+ range->var |= kind;
+ range->start = start;
+ range->end = end;
+}
+
+static void emit_live_range(
+ zend_op_array *op_array, uint32_t var_num, uint32_t start, uint32_t end,
+ zend_needs_live_range_cb needs_live_range) {
+ zend_op *def_opline = &op_array->opcodes[start], *orig_def_opline = def_opline;
+ zend_op *use_opline = &op_array->opcodes[end];
+ uint32_t kind;
+
+ switch (def_opline->opcode) {
+ /* These should never be the first def. */
+ case ZEND_ADD_ARRAY_ELEMENT:
+ case ZEND_ADD_ARRAY_UNPACK:
+ case ZEND_ROPE_ADD:
+ ZEND_ASSERT(0);
+ return;
+ /* Result is boolean, it doesn't have to be destroyed. */
+ case ZEND_JMPZ_EX:
+ case ZEND_JMPNZ_EX:
+ case ZEND_BOOL:
+ case ZEND_BOOL_NOT:
+ /* Classes don't have to be destroyed. */
+ case ZEND_FETCH_CLASS:
+ case ZEND_DECLARE_ANON_CLASS:
+ /* FAST_CALLs don't have to be destroyed. */
+ case ZEND_FAST_CALL:
+ return;
+ case ZEND_BEGIN_SILENCE:
+ kind = ZEND_LIVE_SILENCE;
+ start++;
+ break;
+ case ZEND_ROPE_INIT:
+ kind = ZEND_LIVE_ROPE;
+ /* ROPE live ranges include the generating opcode. */
+ def_opline--;
+ break;
+ case ZEND_FE_RESET_R:
+ case ZEND_FE_RESET_RW:
+ kind = ZEND_LIVE_LOOP;
+ start++;
+ break;
+ /* Objects created via ZEND_NEW are only fully initialized
+ * after the DO_FCALL (constructor call).
+ * We are creating two live-ranges: ZEND_LINE_NEW for uninitialized
+ * part, and ZEND_LIVE_TMPVAR for initialized.
+ */
+ case ZEND_NEW:
+ {
+ int level = 0;
+ uint32_t orig_start = start;
+
+ while (def_opline + 1 < use_opline) {
+ def_opline++;
+ start++;
+ if (def_opline->opcode == ZEND_DO_FCALL) {
+ if (level == 0) {
+ break;
+ }
+ level--;
+ } else {
+ switch (def_opline->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;
+ }
+ }
+ }
+ emit_live_range_raw(op_array, var_num, ZEND_LIVE_NEW, orig_start + 1, start + 1);
+ if (start + 1 == end) {
+ /* Trivial live-range, no need to store it. */
+ return;
+ }
+ /* break missing intentionally */
+ default:
+ start++;
+ kind = ZEND_LIVE_TMPVAR;
+
+ /* Check hook to determine whether a live range is necessary,
+ * e.g. based on type info. */
+ if (needs_live_range && !needs_live_range(op_array, orig_def_opline)) {
+ return;
+ }
+ break;
+ }
+ case ZEND_COPY_TMP:
+ {
+ /* COPY_TMP has a split live-range: One from the definition until the use in
+ * "null" branch, and another from the start of the "non-null" branch to the
+ * FREE opcode. */
+ uint32_t rt_var_num =
+ (uint32_t) (intptr_t) ZEND_CALL_VAR_NUM(NULL, op_array->last_var + var_num);
+ zend_op *block_start_op = use_opline;
+
+ if (needs_live_range && !needs_live_range(op_array, orig_def_opline)) {
+ return;
+ }
+
+ while ((block_start_op-1)->opcode == ZEND_FREE) {
+ block_start_op--;
+ }
+
+ kind = ZEND_LIVE_TMPVAR;
+ start = block_start_op - op_array->opcodes;
+ if (start != end) {
+ emit_live_range_raw(op_array, var_num, kind, start, end);
+ }
+
+ do {
+ use_opline--;
+ } while (!(
+ ((use_opline->op1_type & (IS_TMP_VAR|IS_VAR)) && use_opline->op1.var == rt_var_num) ||
+ ((use_opline->op2_type & (IS_TMP_VAR|IS_VAR)) && use_opline->op2.var == rt_var_num)
+ ));
+
+ start = def_opline + 1 - op_array->opcodes;
+ end = use_opline - op_array->opcodes;
+ emit_live_range_raw(op_array, var_num, kind, start, end);
+ return;
+ }
+ }
+
+ emit_live_range_raw(op_array, var_num, kind, start, end);
+}
+
+static zend_bool is_fake_def(zend_op *opline) {
+ /* These opcodes only modify the result, not create it. */
+ return opline->opcode == ZEND_ROPE_ADD
+ || opline->opcode == ZEND_ADD_ARRAY_ELEMENT
+ || opline->opcode == ZEND_ADD_ARRAY_UNPACK;
+}
+
+static zend_bool keeps_op1_alive(zend_op *opline) {
+ /* These opcodes don't consume their OP1 operand,
+ * it is later freed by something else. */
+ if (opline->opcode == ZEND_CASE
+ || opline->opcode == ZEND_SWITCH_LONG
+ || opline->opcode == ZEND_FETCH_LIST_R
+ || opline->opcode == ZEND_COPY_TMP) {
+ return 1;
+ }
+ ZEND_ASSERT(opline->opcode != ZEND_SWITCH_STRING
+ && opline->opcode != ZEND_FE_FETCH_R
+ && opline->opcode != ZEND_FE_FETCH_RW
+ && opline->opcode != ZEND_FETCH_LIST_W
+ && opline->opcode != ZEND_VERIFY_RETURN_TYPE
+ && opline->opcode != ZEND_BIND_LEXICAL
+ && opline->opcode != ZEND_ROPE_ADD);
+ return 0;
+}
+
/* 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;
+ uint32_t tmp;
+ tmp = a->var;
+ a->var = b->var;
+ b->var = tmp;
+ tmp = a->start;
+ a->start = b->start;
+ b->start = tmp;
+ tmp = a->end;
+ a->end = b->end;
+ b->end = tmp;
+}
+
+static void zend_calc_live_ranges(
+ zend_op_array *op_array, zend_needs_live_range_cb needs_live_range) {
+ uint32_t opnum = op_array->last;
+ zend_op *opline = &op_array->opcodes[opnum];
+ ALLOCA_FLAG(use_heap)
+ uint32_t var_offset = op_array->last_var;
+ uint32_t *last_use = do_alloca(sizeof(uint32_t) * op_array->T, use_heap);
+ memset(last_use, -1, sizeof(uint32_t) * op_array->T);
+
+ ZEND_ASSERT(!op_array->live_range);
+ while (opnum > 0) {
+ opnum--;
+ opline--;
+
+ if ((opline->result_type & (IS_TMP_VAR|IS_VAR)) && !is_fake_def(opline)) {
+ uint32_t var_num = EX_VAR_TO_NUM(opline->result.var) - var_offset;
+ /* Defs without uses can occur for two reasons: Either because the result is
+ * genuinely unused (e.g. omitted FREE opcode for an unused boolean result), or
+ * because there are multiple defining opcodes (e.g. JMPZ_EX and QM_ASSIGN), in
+ * which case the last one starts the live range. As such, we can simply ignore
+ * missing uses here. */
+ if (EXPECTED(last_use[var_num] != (uint32_t) -1)) {
+ /* Skip trivial live-range */
+ if (opnum + 1 != last_use[var_num]) {
+ uint32_t num;
+
+#if 1
+ /* OP_DATA uses only op1 operand */
+ ZEND_ASSERT(opline->opcode != ZEND_OP_DATA);
+ num = opnum;
+#else
+ /* OP_DATA is really part of the previous opcode. */
+ num = opnum - (opline->opcode == ZEND_OP_DATA);
+#endif
+ emit_live_range(op_array, var_num, num, last_use[var_num], needs_live_range);
+ }
+ last_use[var_num] = (uint32_t) -1;
+ }
+ }
+
+ if ((opline->op1_type & (IS_TMP_VAR|IS_VAR))) {
+ uint32_t var_num = EX_VAR_TO_NUM(opline->op1.var) - var_offset;
+ if (EXPECTED(last_use[var_num] == (uint32_t) -1)) {
+ if (EXPECTED(!keeps_op1_alive(opline))) {
+ /* OP_DATA is really part of the previous opcode. */
+ last_use[var_num] = opnum - (opline->opcode == ZEND_OP_DATA);
+ }
+ }
+ }
+ if (opline->op2_type & (IS_TMP_VAR|IS_VAR)) {
+ uint32_t var_num = EX_VAR_TO_NUM(opline->op2.var) - var_offset;
+ if (UNEXPECTED(opline->opcode == ZEND_FE_FETCH_R
+ || opline->opcode == ZEND_FE_FETCH_RW)) {
+ /* OP2 of FE_FETCH is actually a def, not a use. */
+ if (last_use[var_num] != (uint32_t) -1) {
+ if (opnum + 1 != last_use[var_num]) {
+ emit_live_range(
+ op_array, var_num, opnum, last_use[var_num], needs_live_range);
+ }
+ last_use[var_num] = (uint32_t) -1;
+ }
+ } else if (EXPECTED(last_use[var_num] == (uint32_t) -1)) {
+#if 1
+ /* OP_DATA uses only op1 operand */
+ ZEND_ASSERT(opline->opcode != ZEND_OP_DATA);
+ last_use[var_num] = opnum;
+#else
+ /* OP_DATA is really part of the previous opcode. */
+ last_use[var_num] = opnum - (opline->opcode == ZEND_OP_DATA);
+#endif
+ }
+ }
+ }
+
+ if (op_array->last_live_range > 1) {
+ zend_live_range *r1 = op_array->live_range;
+ zend_live_range *r2 = r1 + op_array->last_live_range - 1;
+
+ /* In most cases we need just revert the array */
+ while (r1 < r2) {
+ swap_live_range(r1, r2);
+ r1++;
+ r2--;
+ }
+
+ r1 = op_array->live_range;
+ r2 = r1 + op_array->last_live_range - 1;
+ while (r1 < r2) {
+ if (r1->start > (r1+1)->start) {
+ zend_sort(r1, r2 - r1 + 1, sizeof(zend_live_range),
+ (compare_func_t) cmp_live_range, (swap_func_t) swap_live_range);
+ break;
+ }
+ r1++;
+ }
+ }
+
+ free_alloca(last_use, use_heap);
}
-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 void zend_recalc_live_ranges(
+ zend_op_array *op_array, zend_needs_live_range_cb needs_live_range) {
+ /* We assume that we never create live-ranges where there were none before. */
+ ZEND_ASSERT(op_array->live_range);
+ efree(op_array->live_range);
+ op_array->live_range = NULL;
+ op_array->last_live_range = 0;
+ zend_calc_live_ranges(op_array, needs_live_range);
}
ZEND_API int pass_two(zend_op_array *op_array)
@@ -510,8 +883,8 @@ ZEND_API int pass_two(zend_op_array *op_array)
if (!ZEND_USER_CODE(op_array->type)) {
return 0;
}
- if (CG(compiler_options) & ZEND_COMPILE_EXTENDED_INFO) {
- zend_update_extended_info(op_array);
+ if (CG(compiler_options) & ZEND_COMPILE_EXTENDED_STMT) {
+ zend_update_extended_stmts(op_array);
}
if (CG(compiler_options) & ZEND_COMPILE_HANDLE_OP_ARRAY) {
if (zend_extension_flags & ZEND_EXTENSIONS_HAVE_OP_ARRAY_HANDLER) {
@@ -619,8 +992,6 @@ ZEND_API int pass_two(zend_op_array *op_array)
ZEND_PASS_TWO_UPDATE_JMP_TARGET(op_array, opline, opline->op2);
break;
}
- case ZEND_DECLARE_ANON_CLASS:
- case ZEND_DECLARE_ANON_INHERITED_CLASS:
case ZEND_FE_FETCH_R:
case ZEND_FE_FETCH_RW:
/* absolute index to relative offset */
@@ -668,16 +1039,7 @@ ZEND_API int pass_two(zend_op_array *op_array)
opline++;
}
- 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))) |
- (op_array->live_range[i].var & ZEND_LIVE_MASK);
- }
- }
+ zend_calc_live_ranges(op_array, NULL);
return 0;
}
@@ -698,32 +1060,24 @@ ZEND_API binary_op_type get_binary_op(int opcode)
{
switch (opcode) {
case ZEND_ADD:
- case ZEND_ASSIGN_ADD:
return (binary_op_type) add_function;
case ZEND_SUB:
- case ZEND_ASSIGN_SUB:
return (binary_op_type) sub_function;
case ZEND_MUL:
- case ZEND_ASSIGN_MUL:
return (binary_op_type) mul_function;
case ZEND_POW:
- case ZEND_ASSIGN_POW:
return (binary_op_type) pow_function;
case ZEND_DIV:
- case ZEND_ASSIGN_DIV:
return (binary_op_type) div_function;
case ZEND_MOD:
- case ZEND_ASSIGN_MOD:
return (binary_op_type) mod_function;
case ZEND_SL:
- case ZEND_ASSIGN_SL:
return (binary_op_type) shift_left_function;
case ZEND_SR:
- case ZEND_ASSIGN_SR:
return (binary_op_type) shift_right_function;
+ case ZEND_PARENTHESIZED_CONCAT:
case ZEND_FAST_CONCAT:
case ZEND_CONCAT:
- case ZEND_ASSIGN_CONCAT:
return (binary_op_type) concat_function;
case ZEND_IS_IDENTICAL:
return (binary_op_type) is_identical_function;
@@ -741,27 +1095,15 @@ ZEND_API binary_op_type get_binary_op(int opcode)
case ZEND_SPACESHIP:
return (binary_op_type) compare_function;
case ZEND_BW_OR:
- case ZEND_ASSIGN_BW_OR:
return (binary_op_type) bitwise_or_function;
case ZEND_BW_AND:
- case ZEND_ASSIGN_BW_AND:
return (binary_op_type) bitwise_and_function;
case ZEND_BW_XOR:
- case ZEND_ASSIGN_BW_XOR:
return (binary_op_type) bitwise_xor_function;
case ZEND_BOOL_XOR:
return (binary_op_type) boolean_xor_function;
default:
+ ZEND_ASSERT(0);
return (binary_op_type) NULL;
}
}
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * indent-tabs-mode: t
- * End:
- * vim600: sw=4 ts=4 fdm=marker
- * vim<600: sw=4 ts=4
- */
diff --git a/Zend/zend_operators.c b/Zend/zend_operators.c
index ef778ea100..656316cc4e 100644
--- a/Zend/zend_operators.c
+++ b/Zend/zend_operators.c
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| Zend Engine |
+----------------------------------------------------------------------+
- | Copyright (c) 1998-2018 Zend Technologies Ltd. (http://www.zend.com) |
+ | Copyright (c) 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 |
@@ -568,19 +568,33 @@ try_again:
case IS_ARRAY:
zend_error(E_NOTICE, "Array to string conversion");
zval_ptr_dtor(op);
- ZVAL_NEW_STR(op, zend_string_init("Array", sizeof("Array")-1, 0));
+ ZVAL_INTERNED_STR(op, ZSTR_KNOWN(ZEND_STR_ARRAY_CAPITALIZED));
break;
case IS_OBJECT: {
- zval dst;
-
- convert_object_to_type(op, &dst, IS_STRING, convert_to_string);
- zval_ptr_dtor(op);
+ zval tmp;
- if (Z_TYPE(dst) == IS_STRING) {
- ZVAL_COPY_VALUE(op, &dst);
- } else {
- ZVAL_NEW_STR(op, zend_string_init("Object", sizeof("Object")-1, 0));
+ if (Z_OBJ_HT_P(op)->cast_object) {
+ if (Z_OBJ_HT_P(op)->cast_object(op, &tmp, IS_STRING) == SUCCESS) {
+ zval_ptr_dtor(op);
+ ZVAL_COPY_VALUE(op, &tmp);
+ return;
+ }
+ } else if (Z_OBJ_HT_P(op)->get) {
+ zval *z = Z_OBJ_HT_P(op)->get(op, &tmp);
+ if (Z_TYPE_P(z) != IS_OBJECT) {
+ zend_string *str = zval_get_string(z);
+ zval_ptr_dtor(z);
+ zval_ptr_dtor(op);
+ ZVAL_STR(op, str);
+ return;
+ }
+ zval_ptr_dtor(z);
+ }
+ if (!EG(exception)) {
+ zend_throw_error(NULL, "Object of class %s could not be converted to string", ZSTR_VAL(Z_OBJCE_P(op)->name));
}
+ zval_ptr_dtor(op);
+ ZVAL_EMPTY_STRING(op);
break;
}
case IS_REFERENCE:
@@ -591,6 +605,20 @@ try_again:
}
/* }}} */
+ZEND_API zend_bool ZEND_FASTCALL _try_convert_to_string(zval *op)
+{
+ zend_string *str;
+
+ ZEND_ASSERT(Z_TYPE_P(op) != IS_STRING);
+ str = zval_try_get_string_func(op);
+ if (UNEXPECTED(!str)) {
+ return 0;
+ }
+ zval_ptr_dtor(op);
+ ZVAL_STR(op, str);
+ return 1;
+}
+
static void convert_scalar_to_array(zval *op) /* {{{ */
{
HashTable *ht = zend_new_array(1);
@@ -610,32 +638,20 @@ try_again:
if (Z_OBJCE_P(op) == zend_ce_closure) {
convert_scalar_to_array(op);
} else {
- if (Z_OBJ_HT_P(op)->get_properties) {
- HashTable *obj_ht = Z_OBJ_HT_P(op)->get_properties(op);
- if (obj_ht) {
- /* fast copy */
- 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;
- }
+ HashTable *obj_ht = zend_get_properties_for(op, ZEND_PROP_PURPOSE_ARRAY_CAST);
+ if (obj_ht) {
+ HashTable *new_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, new_obj_ht);
+ zend_release_properties(obj_ht);
} else {
- zval dst;
- convert_object_to_type(op, &dst, IS_ARRAY, convert_to_array);
-
- if (Z_TYPE(dst) == IS_ARRAY) {
- zval_ptr_dtor(op);
- ZVAL_COPY_VALUE(op, &dst);
- return;
- }
+ zval_ptr_dtor(op);
+ /*ZVAL_EMPTY_ARRAY(op);*/
+ array_init(op);
}
-
- zval_ptr_dtor(op);
- /*ZVAL_EMPTY_ARRAY(op);*/
- array_init(op);
}
break;
case IS_NULL:
@@ -850,7 +866,7 @@ try_again:
}
/* }}} */
-ZEND_API zend_string* ZEND_FASTCALL zval_get_string_func(zval *op) /* {{{ */
+static zend_always_inline zend_string* __zval_get_string_func(zval *op, zend_bool try) /* {{{ */
{
try_again:
switch (Z_TYPE_P(op)) {
@@ -871,7 +887,8 @@ try_again:
}
case IS_ARRAY:
zend_error(E_NOTICE, "Array to string conversion");
- return zend_string_init("Array", sizeof("Array")-1, 0);
+ return (try && UNEXPECTED(EG(exception))) ?
+ NULL : ZSTR_KNOWN(ZEND_STR_ARRAY_CAPITALIZED);
case IS_OBJECT: {
zval tmp;
if (Z_OBJ_HT_P(op)->cast_object) {
@@ -881,14 +898,16 @@ try_again:
} else if (Z_OBJ_HT_P(op)->get) {
zval *z = Z_OBJ_HT_P(op)->get(op, &tmp);
if (Z_TYPE_P(z) != IS_OBJECT) {
- zend_string *str = zval_get_string(z);
+ zend_string *str = try ? zval_try_get_string(z) : zval_get_string(z);
zval_ptr_dtor(z);
return str;
}
zval_ptr_dtor(z);
}
- zend_error(EG(exception) ? E_ERROR : E_RECOVERABLE_ERROR, "Object of class %s could not be converted to string", ZSTR_VAL(Z_OBJCE_P(op)->name));
- return ZSTR_EMPTY_ALLOC();
+ if (!EG(exception)) {
+ zend_throw_error(NULL, "Object of class %s could not be converted to string", ZSTR_VAL(Z_OBJCE_P(op)->name));
+ }
+ return try ? NULL : ZSTR_EMPTY_ALLOC();
}
case IS_REFERENCE:
op = Z_REFVAL_P(op);
@@ -901,6 +920,18 @@ try_again:
}
/* }}} */
+ZEND_API zend_string* ZEND_FASTCALL zval_get_string_func(zval *op) /* {{{ */
+{
+ return __zval_get_string_func(op, 0);
+}
+/* }}} */
+
+ZEND_API zend_string* ZEND_FASTCALL zval_try_get_string_func(zval *op) /* {{{ */
+{
+ return __zval_get_string_func(op, 1);
+}
+/* }}} */
+
static zend_never_inline void ZEND_FASTCALL add_function_array(zval *result, zval *op1, zval *op2) /* {{{ */
{
if ((result == op1) && (result == op2)) {
@@ -1241,6 +1272,9 @@ ZEND_API int ZEND_FASTCALL pow_function(zval *result, zval *op1, zval *op2) /* {
}
/* }}} */
+#ifdef __clang__
+__attribute__((no_sanitize("float-divide-by-zero")))
+#endif
ZEND_API int ZEND_FASTCALL div_function(zval *result, zval *op1, zval *op2) /* {{{ */
{
zval op1_copy, op2_copy;
@@ -1735,7 +1769,8 @@ ZEND_API int ZEND_FASTCALL shift_left_function(zval *result, zval *op1, zval *op
zval_ptr_dtor(result);
}
- ZVAL_LONG(result, op1_lval << op2_lval);
+ /* Perform shift on unsigned numbers to get well-defined wrap behavior. */
+ ZVAL_LONG(result, (zend_long) ((zend_ulong) op1_lval << op2_lval));
return SUCCESS;
}
/* }}} */
@@ -1830,7 +1865,7 @@ ZEND_API int ZEND_FASTCALL concat_function(zval *result, zval *op1, zval *op2) /
if (UNEXPECTED(Z_STRLEN_P(op1) == 0)) {
if (EXPECTED(result != op2)) {
if (result == orig_op1) {
- i_zval_ptr_dtor(result ZEND_FILE_LINE_CC);
+ i_zval_ptr_dtor(result);
}
ZVAL_COPY(result, op2);
}
@@ -1861,7 +1896,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) {
- i_zval_ptr_dtor(result ZEND_FILE_LINE_CC);
+ i_zval_ptr_dtor(result);
}
}
@@ -1943,7 +1978,6 @@ 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 *tmp_str1, *tmp_str2;
@@ -1956,7 +1990,6 @@ ZEND_API int ZEND_FASTCALL string_locale_compare_function(zval *op1, zval *op2)
return ret;
}
/* }}} */
-#endif
ZEND_API int ZEND_FASTCALL numeric_compare_function(zval *op1, zval *op2) /* {{{ */
{
@@ -2138,15 +2171,15 @@ ZEND_API int ZEND_FASTCALL compare_function(zval *result, zval *op1, zval *op2)
}
}
if (!converted) {
- if (Z_TYPE_P(op1) == IS_NULL || Z_TYPE_P(op1) == IS_FALSE) {
+ if (Z_TYPE_P(op1) < IS_TRUE) {
ZVAL_LONG(result, zval_is_true(op2) ? -1 : 0);
return SUCCESS;
- } else if (Z_TYPE_P(op2) == IS_NULL || Z_TYPE_P(op2) == IS_FALSE) {
- ZVAL_LONG(result, zval_is_true(op1) ? 1 : 0);
- return SUCCESS;
} else if (Z_TYPE_P(op1) == IS_TRUE) {
ZVAL_LONG(result, zval_is_true(op2) ? 0 : 1);
return SUCCESS;
+ } else if (Z_TYPE_P(op2) < IS_TRUE) {
+ ZVAL_LONG(result, zval_is_true(op1) ? 1 : 0);
+ return SUCCESS;
} else if (Z_TYPE_P(op2) == IS_TRUE) {
ZVAL_LONG(result, zval_is_true(op1) ? 0 : -1);
return SUCCESS;
@@ -2167,14 +2200,12 @@ ZEND_API int ZEND_FASTCALL compare_function(zval *result, zval *op1, zval *op2)
} else if (Z_TYPE_P(op2)==IS_ARRAY) {
ZVAL_LONG(result, -1);
return SUCCESS;
- } else if (Z_TYPE_P(op1)==IS_OBJECT) {
- ZVAL_LONG(result, 1);
- return SUCCESS;
- } else if (Z_TYPE_P(op2)==IS_OBJECT) {
- ZVAL_LONG(result, -1);
- return SUCCESS;
} else {
- ZVAL_LONG(result, 0);
+ ZEND_ASSERT(0);
+ zend_throw_error(NULL, "Unsupported operand types");
+ if (result != op1) {
+ ZVAL_UNDEF(result);
+ }
return FAILURE;
}
}
@@ -2184,8 +2215,6 @@ ZEND_API int ZEND_FASTCALL compare_function(zval *result, zval *op1, zval *op2)
static int hash_zval_identical_function(zval *z1, zval *z2) /* {{{ */
{
- zval result;
-
/* is_identical_function() returns 1 in case of identity and 0 in case
* of a difference;
* whereas this comparison function is expected to return 0 on identity,
@@ -2193,14 +2222,11 @@ static int hash_zval_identical_function(zval *z1, zval *z2) /* {{{ */
*/
ZVAL_DEREF(z1);
ZVAL_DEREF(z2);
- if (is_identical_function(&result, z1, z2)==FAILURE) {
- return 1;
- }
- return Z_TYPE(result) != IS_TRUE;
+ return fast_is_not_identical_function(z1, z2);
}
/* }}} */
-ZEND_API int ZEND_FASTCALL zend_is_identical(zval *op1, zval *op2) /* {{{ */
+ZEND_API zend_bool ZEND_FASTCALL zend_is_identical(zval *op1, zval *op2) /* {{{ */
{
if (Z_TYPE_P(op1) != Z_TYPE_P(op2)) {
return 0;
@@ -2283,27 +2309,14 @@ ZEND_API int ZEND_FASTCALL is_smaller_or_equal_function(zval *result, zval *op1,
}
/* }}} */
-static zend_bool ZEND_FASTCALL instanceof_interface_only(const zend_class_entry *instance_ce, const zend_class_entry *ce) /* {{{ */
-{
- uint32_t i;
-
- for (i = 0; i < instance_ce->num_interfaces; i++) {
- if (instanceof_interface_only(instance_ce->interfaces[i], ce)) {
- return 1;
- }
- }
- return 0;
-}
-/* }}} */
-
static zend_always_inline zend_bool instanceof_class(const zend_class_entry *instance_ce, const zend_class_entry *ce) /* {{{ */
{
- while (instance_ce) {
+ do {
if (instance_ce == ce) {
return 1;
}
instance_ce = instance_ce->parent;
- }
+ } while (instance_ce);
return 0;
}
/* }}} */
@@ -2312,30 +2325,28 @@ static zend_bool ZEND_FASTCALL instanceof_interface(const zend_class_entry *inst
{
uint32_t i;
- for (i = 0; i < instance_ce->num_interfaces; i++) {
- if (instanceof_interface(instance_ce->interfaces[i], ce)) {
- return 1;
+ if (instance_ce->num_interfaces) {
+ ZEND_ASSERT(instance_ce->ce_flags & ZEND_ACC_RESOLVED_INTERFACES);
+ for (i = 0; i < instance_ce->num_interfaces; i++) {
+ if (instance_ce->interfaces[i] == ce) {
+ return 1;
+ }
}
}
- return instanceof_class(instance_ce, ce);
+ return instance_ce == ce;
}
/* }}} */
-ZEND_API zend_bool ZEND_FASTCALL instanceof_function_ex(const zend_class_entry *instance_ce, const zend_class_entry *ce, zend_bool interfaces_only) /* {{{ */
+// TODO: It would make more sense to expose instanceof_class + instanceof_interface instead
+ZEND_API zend_bool ZEND_FASTCALL instanceof_function_ex(const zend_class_entry *instance_ce, const zend_class_entry *ce, zend_bool is_interface) /* {{{ */
{
- if (ce->ce_flags & ZEND_ACC_INTERFACE) {
- if (!interfaces_only) {
- if (instanceof_interface_only(instance_ce, ce)) {
- return 1;
- }
- } else {
- return instanceof_interface(instance_ce, ce);
- }
- }
- if (!interfaces_only) {
+ if (is_interface) {
+ ZEND_ASSERT(ce->ce_flags & ZEND_ACC_INTERFACE);
+ return instanceof_interface(instance_ce, ce);
+ } else {
+ ZEND_ASSERT(!(ce->ce_flags & ZEND_ACC_INTERFACE));
return instanceof_class(instance_ce, ce);
}
- return 0;
}
/* }}} */
@@ -3014,7 +3025,7 @@ ZEND_API zend_uchar ZEND_FASTCALL _is_numeric_string_ex(const char *str, size_t
int digits = 0, dp_or_e = 0;
double local_dval = 0.0;
zend_uchar type;
- zend_long tmp_lval = 0;
+ zend_ulong tmp_lval = 0;
int neg = 0;
if (!length) {
@@ -3099,6 +3110,9 @@ process_double:
}
if (allow_errors == -1) {
zend_error(E_NOTICE, "A non well formed numeric value encountered");
+ if (EG(exception)) {
+ return 0;
+ }
}
}
@@ -3122,7 +3136,7 @@ process_double:
if (neg) {
tmp_lval = -tmp_lval;
}
- *lval = tmp_lval;
+ *lval = (zend_long) tmp_lval;
}
return IS_LONG;
@@ -3263,13 +3277,3 @@ ZEND_API zend_long ZEND_FASTCALL zend_dval_to_lval_slow(double d)
}
#endif
#endif
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * indent-tabs-mode: t
- * End:
- * vim600: sw=4 ts=4 fdm=marker
- * vim<600: sw=4 ts=4
- */
diff --git a/Zend/zend_operators.h b/Zend/zend_operators.h
index aa73a969e2..dad23bc4d8 100644
--- a/Zend/zend_operators.h
+++ b/Zend/zend_operators.h
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| Zend Engine |
+----------------------------------------------------------------------+
- | Copyright (c) 1998-2018 Zend Technologies Ltd. (http://www.zend.com) |
+ | Copyright (c) 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 |
@@ -24,10 +24,7 @@
#include <errno.h>
#include <math.h>
#include <assert.h>
-
-#ifdef __GNUC__
#include <stddef.h>
-#endif
#ifdef HAVE_IEEEFP_H
#include <ieeefp.h>
@@ -38,7 +35,7 @@
#include "zend_multiply.h"
#include "zend_object_handlers.h"
-#define LONG_SIGN_MASK (((zend_long)1) << (8*sizeof(zend_long)-1))
+#define LONG_SIGN_MASK ZEND_LONG_MIN
BEGIN_EXTERN_C()
ZEND_API int ZEND_FASTCALL add_function(zval *result, zval *op1, zval *op2);
@@ -57,7 +54,7 @@ ZEND_API int ZEND_FASTCALL shift_left_function(zval *result, zval *op1, zval *op
ZEND_API int ZEND_FASTCALL shift_right_function(zval *result, zval *op1, zval *op2);
ZEND_API int ZEND_FASTCALL concat_function(zval *result, zval *op1, zval *op2);
-ZEND_API int ZEND_FASTCALL zend_is_identical(zval *op1, zval *op2);
+ZEND_API zend_bool ZEND_FASTCALL zend_is_identical(zval *op1, zval *op2);
ZEND_API int ZEND_FASTCALL is_equal_function(zval *result, zval *op1, zval *op2);
ZEND_API int ZEND_FASTCALL is_identical_function(zval *result, zval *op1, zval *op2);
@@ -66,7 +63,7 @@ ZEND_API int ZEND_FASTCALL is_not_equal_function(zval *result, zval *op1, zval *
ZEND_API int ZEND_FASTCALL is_smaller_function(zval *result, zval *op1, zval *op2);
ZEND_API int ZEND_FASTCALL is_smaller_or_equal_function(zval *result, zval *op1, zval *op2);
-ZEND_API zend_bool ZEND_FASTCALL instanceof_function_ex(const zend_class_entry *instance_ce, const zend_class_entry *ce, zend_bool interfaces_only);
+ZEND_API zend_bool ZEND_FASTCALL instanceof_function_ex(const zend_class_entry *instance_ce, const zend_class_entry *ce, zend_bool is_interface);
ZEND_API zend_bool ZEND_FASTCALL instanceof_function(const zend_class_entry *instance_ce, const zend_class_entry *ce);
/**
@@ -228,10 +225,12 @@ zend_memnrstr(const char *haystack, const char *needle, size_t needle_len, const
p -= needle_len;
do {
- if ((p = (const char *)zend_memrchr(haystack, *needle, (p - haystack) + 1)) && ne == p[needle_len-1]) {
- if (!memcmp(needle + 1, p + 1, needle_len - 2)) {
- return p;
- }
+ p = (const char *)zend_memrchr(haystack, *needle, (p - haystack) + 1);
+ if (!p) {
+ return NULL;
+ }
+ if (ne == p[needle_len-1] && !memcmp(needle + 1, p + 1, needle_len - 2)) {
+ return p;
}
} while (p-- >= haystack);
@@ -261,6 +260,7 @@ 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_string* ZEND_FASTCALL zval_try_get_string_func(zval *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);
@@ -286,6 +286,39 @@ static zend_always_inline void zend_tmp_string_release(zend_string *tmp) {
}
}
+/* Like zval_get_string, but returns NULL if the conversion fails with an exception. */
+static zend_always_inline zend_string *zval_try_get_string(zval *op) {
+ if (EXPECTED(Z_TYPE_P(op) == IS_STRING)) {
+ zend_string *ret = zend_string_copy(Z_STR_P(op));
+ ZEND_ASSUME(ret != NULL);
+ return ret;
+ } else {
+ return zval_try_get_string_func(op);
+ }
+}
+
+/* Like zval_get_tmp_string, but returns NULL if the conversion fails with an exception. */
+static zend_always_inline zend_string *zval_try_get_tmp_string(zval *op, zend_string **tmp) {
+ if (EXPECTED(Z_TYPE_P(op) == IS_STRING)) {
+ zend_string *ret = Z_STR_P(op);
+ *tmp = NULL;
+ ZEND_ASSUME(ret != NULL);
+ return ret;
+ } else {
+ return *tmp = zval_try_get_string_func(op);
+ }
+}
+
+/* Like convert_to_string(), but returns whether the conversion succeeded and does not modify the
+ * zval in-place if it fails. */
+ZEND_API zend_bool ZEND_FASTCALL _try_convert_to_string(zval *op);
+static zend_always_inline zend_bool try_convert_to_string(zval *op) {
+ if (Z_TYPE_P(op) == IS_STRING) {
+ return 1;
+ }
+ return _try_convert_to_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)
@@ -361,9 +394,7 @@ ZEND_API int ZEND_FASTCALL numeric_compare_function(zval *op1, zval *op2);
ZEND_API int ZEND_FASTCALL string_compare_function_ex(zval *op1, zval *op2, zend_bool case_insensitive);
ZEND_API int ZEND_FASTCALL string_compare_function(zval *op1, zval *op2);
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);
-#endif
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);
@@ -454,7 +485,7 @@ ZEND_API void ZEND_FASTCALL zend_locale_sprintf_double(zval *op ZEND_FILE_LINE_D
convert_scalar_to_number(pzv); \
}
-#if HAVE_SETLOCALE && defined(ZEND_WIN32) && !defined(ZTS) && defined(_MSC_VER)
+#if defined(ZEND_WIN32) && !defined(ZTS) && defined(_MSC_VER)
/* This performance improvement of tolower() on Windows gives 10-18% on bench.php */
#define ZEND_USE_TOLOWER_L 1
#endif
@@ -469,9 +500,15 @@ ZEND_API void zend_update_current_locale(void);
#define ZVAL_OFFSETOF_TYPE \
(offsetof(zval, u1.type_info) - offsetof(zval, value))
+#if defined(HAVE_ASM_GOTO) && !__has_feature(memory_sanitizer)
+# define ZEND_USE_ASM_ARITHMETIC 1
+#else
+# define ZEND_USE_ASM_ARITHMETIC 0
+#endif
+
static zend_always_inline void fast_long_increment_function(zval *op1)
{
-#if defined(HAVE_ASM_GOTO) && defined(__i386__) && !(4 == __GNUC__ && 8 == __GNUC_MINOR__)
+#if ZEND_USE_ASM_ARITHMETIC && defined(__i386__) && !(4 == __GNUC__ && 8 == __GNUC_MINOR__)
__asm__ goto(
"addl $1,(%0)\n\t"
"jo %l1\n"
@@ -482,7 +519,7 @@ static zend_always_inline void fast_long_increment_function(zval *op1)
return;
overflow: ZEND_ATTRIBUTE_COLD_LABEL
ZVAL_DOUBLE(op1, (double)ZEND_LONG_MAX + 1.0);
-#elif defined(HAVE_ASM_GOTO) && defined(__x86_64__)
+#elif ZEND_USE_ASM_ARITHMETIC && defined(__x86_64__)
__asm__ goto(
"addq $1,(%0)\n\t"
"jo %l1\n"
@@ -493,6 +530,19 @@ overflow: ZEND_ATTRIBUTE_COLD_LABEL
return;
overflow: ZEND_ATTRIBUTE_COLD_LABEL
ZVAL_DOUBLE(op1, (double)ZEND_LONG_MAX + 1.0);
+#elif ZEND_USE_ASM_ARITHMETIC && defined(__aarch64__)
+ __asm__ goto (
+ "ldr x5, [%0]\n\t"
+ "adds x5, x5, 1\n\t"
+ "bvs %l1\n"
+ "str x5, [%0]"
+ :
+ : "r"(&op1->value)
+ : "x5", "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))) {
@@ -521,7 +571,7 @@ overflow: ZEND_ATTRIBUTE_COLD_LABEL
static zend_always_inline void fast_long_decrement_function(zval *op1)
{
-#if defined(HAVE_ASM_GOTO) && defined(__i386__) && !(4 == __GNUC__ && 8 == __GNUC_MINOR__)
+#if ZEND_USE_ASM_ARITHMETIC && defined(__i386__) && !(4 == __GNUC__ && 8 == __GNUC_MINOR__)
__asm__ goto(
"subl $1,(%0)\n\t"
"jo %l1\n"
@@ -532,7 +582,7 @@ static zend_always_inline void fast_long_decrement_function(zval *op1)
return;
overflow: ZEND_ATTRIBUTE_COLD_LABEL
ZVAL_DOUBLE(op1, (double)ZEND_LONG_MIN - 1.0);
-#elif defined(HAVE_ASM_GOTO) && defined(__x86_64__)
+#elif ZEND_USE_ASM_ARITHMETIC && defined(__x86_64__)
__asm__ goto(
"subq $1,(%0)\n\t"
"jo %l1\n"
@@ -543,6 +593,19 @@ overflow: ZEND_ATTRIBUTE_COLD_LABEL
return;
overflow: ZEND_ATTRIBUTE_COLD_LABEL
ZVAL_DOUBLE(op1, (double)ZEND_LONG_MIN - 1.0);
+#elif ZEND_USE_ASM_ARITHMETIC && defined(__aarch64__)
+ __asm__ goto (
+ "ldr x5, [%0]\n\t"
+ "subs x5 ,x5, 1\n\t"
+ "bvs %l1\n"
+ "str x5, [%0]"
+ :
+ : "r"(&op1->value)
+ : "x5", "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))) {
@@ -571,7 +634,7 @@ overflow: ZEND_ATTRIBUTE_COLD_LABEL
static zend_always_inline void fast_long_add_function(zval *result, zval *op1, zval *op2)
{
-#if defined(HAVE_ASM_GOTO) && defined(__i386__) && !(4 == __GNUC__ && 8 == __GNUC_MINOR__)
+#if ZEND_USE_ASM_ARITHMETIC && defined(__i386__) && !(4 == __GNUC__ && 8 == __GNUC_MINOR__)
__asm__ goto(
"movl (%1), %%eax\n\t"
"addl (%2), %%eax\n\t"
@@ -589,7 +652,7 @@ static zend_always_inline void fast_long_add_function(zval *result, zval *op1, z
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__)
+#elif ZEND_USE_ASM_ARITHMETIC && defined(__x86_64__)
__asm__ goto(
"movq (%1), %%rax\n\t"
"addq (%2), %%rax\n\t"
@@ -607,6 +670,26 @@ overflow: ZEND_ATTRIBUTE_COLD_LABEL
return;
overflow: ZEND_ATTRIBUTE_COLD_LABEL
ZVAL_DOUBLE(result, (double) Z_LVAL_P(op1) + (double) Z_LVAL_P(op2));
+#elif ZEND_USE_ASM_ARITHMETIC && defined(__aarch64__)
+ __asm__ goto(
+ "ldr x5, [%1]\n\t"
+ "ldr x6, [%2]\n\t"
+ "adds x5, x5, x6\n\t"
+ "bvs %l5\n\t"
+ "mov w6, %3\n\t"
+ "str x5, [%0]\n\t"
+ "str w6, [%0, %c4]\n"
+ :
+ : "r"(&result->value),
+ "r"(&op1->value),
+ "r"(&op2->value),
+ "n"(IS_LONG),
+ "n"(ZVAL_OFFSETOF_TYPE)
+ : "x5", "x6", "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))) {
@@ -661,7 +744,7 @@ 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 defined(HAVE_ASM_GOTO) && defined(__i386__) && !(4 == __GNUC__ && 8 == __GNUC_MINOR__)
+#if ZEND_USE_ASM_ARITHMETIC && defined(__i386__) && !(4 == __GNUC__ && 8 == __GNUC_MINOR__)
__asm__ goto(
"movl (%1), %%eax\n\t"
"subl (%2), %%eax\n\t"
@@ -679,7 +762,7 @@ static zend_always_inline void fast_long_sub_function(zval *result, zval *op1, z
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__)
+#elif ZEND_USE_ASM_ARITHMETIC && defined(__x86_64__)
__asm__ goto(
"movq (%1), %%rax\n\t"
"subq (%2), %%rax\n\t"
@@ -697,6 +780,26 @@ overflow: ZEND_ATTRIBUTE_COLD_LABEL
return;
overflow: ZEND_ATTRIBUTE_COLD_LABEL
ZVAL_DOUBLE(result, (double) Z_LVAL_P(op1) - (double) Z_LVAL_P(op2));
+#elif ZEND_USE_ASM_ARITHMETIC && defined(__aarch64__)
+ __asm__ goto(
+ "ldr x5, [%1]\n\t"
+ "ldr x6, [%2]\n\t"
+ "subs x5, x5, x6\n\t"
+ "bvs %l5\n\t"
+ "mov w6, %3\n\t"
+ "str x5, [%0]\n\t"
+ "str w6, [%0, %c4]\n"
+ :
+ : "r"(&result->value),
+ "r"(&op1->value),
+ "r"(&op2->value),
+ "n"(IS_LONG),
+ "n"(ZVAL_OFFSETOF_TYPE)
+ : "x5", "x6", "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))) {
@@ -781,7 +884,7 @@ static zend_always_inline int fast_equal_check_string(zval *op1, zval *op2)
return Z_LVAL(result) == 0;
}
-static zend_always_inline int fast_is_identical_function(zval *op1, zval *op2)
+static zend_always_inline zend_bool fast_is_identical_function(zval *op1, zval *op2)
{
if (Z_TYPE_P(op1) != Z_TYPE_P(op2)) {
return 0;
@@ -791,7 +894,7 @@ static zend_always_inline int fast_is_identical_function(zval *op1, zval *op2)
return zend_is_identical(op1, op2);
}
-static zend_always_inline int fast_is_not_identical_function(zval *op1, zval *op2)
+static zend_always_inline zend_bool fast_is_not_identical_function(zval *op1, zval *op2)
{
if (Z_TYPE_P(op1) != Z_TYPE_P(op2)) {
return 1;
@@ -878,13 +981,3 @@ static zend_always_inline void zend_unwrap_reference(zval *op) /* {{{ */
END_EXTERN_C()
#endif
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * indent-tabs-mode: t
- * End:
- * vim600: sw=4 ts=4 fdm=marker
- * vim<600: sw=4 ts=4
- */
diff --git a/Zend/zend_portability.h b/Zend/zend_portability.h
index 301032d8c3..58c42a289e 100644
--- a/Zend/zend_portability.h
+++ b/Zend/zend_portability.h
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| Zend Engine |
+----------------------------------------------------------------------+
- | Copyright (c) 1998-2018 Zend Technologies Ltd. (http://www.zend.com) |
+ | Copyright (c) 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 |
@@ -54,17 +54,14 @@
# include <unix.h>
#endif
-#ifdef HAVE_STDARG_H
-# include <stdarg.h>
-#endif
+#include <stdarg.h>
+#include <stddef.h>
#ifdef HAVE_DLFCN_H
# include <dlfcn.h>
#endif
-#ifdef HAVE_LIMITS_H
-# include <limits.h>
-#endif
+#include <limits.h>
#if HAVE_ALLOCA_H && !defined(_ALLOCA_H)
# include <alloca.h>
@@ -90,6 +87,9 @@
#ifndef __has_builtin
# define __has_builtin(x) 0
#endif
+#ifndef __has_feature
+# define __has_feature(x) 0
+#endif
#if defined(ZEND_WIN32) && !defined(__clang__)
# define ZEND_ASSUME(c) __assume(c)
@@ -127,10 +127,8 @@
#if defined(HAVE_LIBDL) && !defined(ZEND_WIN32)
-# if defined(__has_feature)
-# if __has_feature(address_sanitizer)
-# define __SANITIZE_ADDRESS__
-# endif
+# if __has_feature(address_sanitizer)
+# define __SANITIZE_ADDRESS__
# endif
# ifndef RTLD_LAZY
@@ -141,12 +139,18 @@
# define RTLD_GLOBAL 0
# endif
+# ifdef PHP_USE_RTLD_NOW
+# define PHP_RTLD_MODE RTLD_NOW
+# else
+# define PHP_RTLD_MODE RTLD_LAZY
+# endif
+
# if defined(RTLD_GROUP) && defined(RTLD_WORLD) && defined(RTLD_PARENT)
-# define DL_LOAD(libname) dlopen(libname, RTLD_LAZY | RTLD_GLOBAL | RTLD_GROUP | RTLD_WORLD | RTLD_PARENT)
-# elif defined(RTLD_DEEPBIND) && !defined(__SANITIZE_ADDRESS__)
-# define DL_LOAD(libname) dlopen(libname, RTLD_LAZY | RTLD_GLOBAL | RTLD_DEEPBIND)
+# define DL_LOAD(libname) dlopen(libname, PHP_RTLD_MODE | RTLD_GLOBAL | RTLD_GROUP | RTLD_WORLD | RTLD_PARENT)
+# elif defined(RTLD_DEEPBIND) && !defined(__SANITIZE_ADDRESS__) && !__has_feature(memory_sanitizer)
+# define DL_LOAD(libname) dlopen(libname, PHP_RTLD_MODE | RTLD_GLOBAL | RTLD_DEEPBIND)
# else
-# define DL_LOAD(libname) dlopen(libname, RTLD_LAZY | RTLD_GLOBAL)
+# define DL_LOAD(libname) dlopen(libname, PHP_RTLD_MODE | RTLD_GLOBAL)
# endif
# define DL_UNLOAD dlclose
# if defined(DLSYM_NEEDS_UNDERSCORE)
@@ -215,8 +219,13 @@ char *alloca();
# define ZEND_ATTRIBUTE_DEPRECATED
#endif
-#if defined(__GNUC__) && ZEND_GCC_VERSION >= 4003
+#if ZEND_GCC_VERSION >= 4003 || __has_attribute(unused)
# define ZEND_ATTRIBUTE_UNUSED __attribute__((unused))
+#else
+# define ZEND_ATTRIBUTE_UNUSED
+#endif
+
+#if defined(__GNUC__) && ZEND_GCC_VERSION >= 4003
# define ZEND_COLD __attribute__((cold))
# define ZEND_HOT __attribute__((hot))
# ifdef __OPTIMIZE__
@@ -227,7 +236,6 @@ char *alloca();
# define ZEND_OPT_SPEED
# endif
#else
-# define ZEND_ATTRIBUTE_UNUSED
# define ZEND_COLD
# define ZEND_HOT
# define ZEND_OPT_SIZE
@@ -254,14 +262,6 @@ char *alloca();
# define ZEND_FASTCALL
#endif
-#ifndef restrict
-# if defined(__GNUC__) && ZEND_GCC_VERSION >= 3004
-# else
-# define __restrict__
-# endif
-# define restrict __restrict__
-#endif
-
#if (defined(__GNUC__) && __GNUC__ >= 3 && !defined(__INTEL_COMPILER) && !defined(DARWIN) && !defined(__hpux) && !defined(_AIX) && !defined(__osf__)) || __has_attribute(noreturn)
# define HAVE_NORETURN
# define ZEND_NORETURN __attribute__((noreturn))
@@ -289,7 +289,7 @@ char *alloca();
(_default)
#endif
-#if ZEND_DEBUG
+#if ZEND_DEBUG || defined(ZEND_WIN32_NEVER_INLINE)
# define zend_always_inline inline
# define zend_never_inline
#else
@@ -328,24 +328,19 @@ char *alloca();
#ifndef XtOffsetOf
# if defined(CRAY) || (defined(__ARMCC_VERSION) && !defined(LINUX))
-# ifdef __STDC__
-# define XtOffset(p_type, field) _Offsetof(p_type, field)
-# else
-# ifdef CRAY2
-# define XtOffset(p_type, field) \
- (sizeof(int)*((unsigned int)&(((p_type)NULL)->field)))
-
-# else /* !CRAY2 */
-
-# define XtOffset(p_type, field) ((unsigned int)&(((p_type)NULL)->field))
-
-# endif /* !CRAY2 */
-# endif /* __STDC__ */
+# ifdef __STDC__
+# define XtOffset(p_type, field) _Offsetof(p_type, field)
+# else
+# ifdef CRAY2
+# define XtOffset(p_type, field) \
+ (sizeof(int)*((unsigned int)&(((p_type)NULL)->field)))
+# else /* !CRAY2 */
+# define XtOffset(p_type, field) ((unsigned int)&(((p_type)NULL)->field))
+# endif /* !CRAY2 */
+# endif /* __STDC__ */
# else /* ! (CRAY || __arm) */
-
-# define XtOffset(p_type, field) \
- ((zend_long) (((char *) (&(((p_type)NULL)->field))) - ((char *) NULL)))
-
+# define XtOffset(p_type, field) \
+ ((zend_long) (((char *) (&(((p_type)NULL)->field))) - ((char *) NULL)))
# endif /* !CRAY */
# ifdef offsetof
@@ -356,7 +351,7 @@ char *alloca();
#endif
-#if (HAVE_ALLOCA || (defined (__GNUC__) && __GNUC__ >= 2)) && !(defined(ZTS)) && !(defined(ZTS) && defined(HPUX)) && !defined(DARWIN)
+#if (HAVE_ALLOCA || (defined (__GNUC__) && __GNUC__ >= 2)) && !(defined(ZTS) && defined(HPUX)) && !defined(DARWIN)
# define ZEND_ALLOCA_MAX_SIZE (32 * 1024)
# define ALLOCA_FLAG(name) \
zend_bool name;
@@ -526,6 +521,12 @@ static zend_always_inline double _zend_get_nan(void) /* {{{ */
/* Intrinsics macros start. */
+/* Memory sanitizer is incompatible with ifunc resolvers. Even if the resolver
+ * is marked as no_sanitize("memory") it will still be instrumented and crash. */
+#if __has_feature(memory_sanitizer) || __has_feature(thread_sanitizer)
+# undef HAVE_FUNC_ATTRIBUTE_IFUNC
+#endif
+
#if defined(HAVE_FUNC_ATTRIBUTE_IFUNC) && defined(HAVE_FUNC_ATTRIBUTE_TARGET)
# define ZEND_INTRIN_HAVE_IFUNC_TARGET 1
#endif
@@ -557,6 +558,7 @@ static zend_always_inline double _zend_get_nan(void) /* {{{ */
# define ZEND_INTRIN_SSSE3_RESOLVER 1
#endif
+/* Do not use for conditional declaration of API functions! */
#if ZEND_INTRIN_SSSE3_RESOLVER && ZEND_INTRIN_HAVE_IFUNC_TARGET
# define ZEND_INTRIN_SSSE3_FUNC_PROTO 1
#elif ZEND_INTRIN_SSSE3_RESOLVER
@@ -573,7 +575,7 @@ static zend_always_inline double _zend_get_nan(void) /* {{{ */
# define ZEND_INTRIN_SSSE3_FUNC_DECL(func)
#endif
-#if defined(HAVE_SSE4_2_DEF) || (defined(ZEND_WIN32) && defined(__SSE4_2__))
+#ifdef __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)
@@ -581,6 +583,7 @@ static zend_always_inline double _zend_get_nan(void) /* {{{ */
# define ZEND_INTRIN_SSE4_2_RESOLVER 1
#endif
+/* Do not use for conditional declaration of API functions! */
#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
@@ -603,6 +606,7 @@ static zend_always_inline double _zend_get_nan(void) /* {{{ */
# define ZEND_INTRIN_AVX2_RESOLVER 1
#endif
+/* Do not use for conditional declaration of API functions! */
#if ZEND_INTRIN_AVX2_RESOLVER && ZEND_INTRIN_HAVE_IFUNC_TARGET
# define ZEND_INTRIN_AVX2_FUNC_PROTO 1
#elif ZEND_INTRIN_AVX2_RESOLVER
@@ -639,14 +643,17 @@ static zend_always_inline double _zend_get_nan(void) /* {{{ */
# define ZEND_EXPAND_VA(code) code
#endif
-#endif /* ZEND_PORTABILITY_H */
+/* On CPU with few registers, it's cheaper to reload value then use spill slot */
+#if defined(__i386__) || (defined(_WIN32) && !defined(_WIN64))
+# define ZEND_PREFER_RELOAD
+#endif
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * indent-tabs-mode: t
- * End:
- * vim600: sw=4 ts=4 fdm=marker
- * vim<600: sw=4 ts=4
- */
+#if defined(ZEND_WIN32) && defined(_DEBUG) && defined(PHP_WIN32_DEBUG_HEAP)
+# define ZEND_IGNORE_LEAKS_BEGIN() _CrtSetDbgFlag(_CrtSetDbgFlag(_CRTDBG_REPORT_FLAG) & ~_CRTDBG_ALLOC_MEM_DF)
+# define ZEND_IGNORE_LEAKS_END() _CrtSetDbgFlag(_CrtSetDbgFlag(_CRTDBG_REPORT_FLAG) | _CRTDBG_ALLOC_MEM_DF)
+#else
+# define ZEND_IGNORE_LEAKS_BEGIN()
+# define ZEND_IGNORE_LEAKS_END()
+#endif
+
+#endif /* ZEND_PORTABILITY_H */
diff --git a/Zend/zend_ptr_stack.c b/Zend/zend_ptr_stack.c
index 082caed7fb..2030cc132b 100644
--- a/Zend/zend_ptr_stack.c
+++ b/Zend/zend_ptr_stack.c
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| Zend Engine |
+----------------------------------------------------------------------+
- | Copyright (c) 1998-2018 Zend Technologies Ltd. (http://www.zend.com) |
+ | Copyright (c) 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 |
@@ -19,9 +19,7 @@
#include "zend.h"
#include "zend_ptr_stack.h"
-#ifdef HAVE_STDARG_H
-# include <stdarg.h>
-#endif
+#include <stdarg.h>
ZEND_API void zend_ptr_stack_init_ex(zend_ptr_stack *stack, zend_bool persistent)
{
@@ -117,12 +115,3 @@ ZEND_API int zend_ptr_stack_num_elements(zend_ptr_stack *stack)
{
return stack->top;
}
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * indent-tabs-mode: t
- * End:
- * vim600: sw=4 ts=4 fdm=marker
- * vim<600: sw=4 ts=4
- */
diff --git a/Zend/zend_ptr_stack.h b/Zend/zend_ptr_stack.h
index 4ec00bf255..2298e4f211 100644
--- a/Zend/zend_ptr_stack.h
+++ b/Zend/zend_ptr_stack.h
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| Zend Engine |
+----------------------------------------------------------------------+
- | Copyright (c) 1998-2018 Zend Technologies Ltd. (http://www.zend.com) |
+ | Copyright (c) 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 |
@@ -116,13 +116,3 @@ static zend_always_inline void *zend_ptr_stack_top(zend_ptr_stack *stack)
}
#endif /* ZEND_PTR_STACK_H */
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * indent-tabs-mode: t
- * End:
- * vim600: sw=4 ts=4 fdm=marker
- * vim<600: sw=4 ts=4
- */
diff --git a/Zend/zend_range_check.h b/Zend/zend_range_check.h
index 2b1a256e2f..9c822493fa 100644
--- a/Zend/zend_range_check.h
+++ b/Zend/zend_range_check.h
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| Zend Engine |
+----------------------------------------------------------------------+
- | Copyright (c) 1998-2018 Zend Technologies Ltd. (http://www.zend.com) |
+ | Copyright (c) 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 |
@@ -65,13 +65,3 @@
#define ZEND_SIZE_T_LTE_ZEND_LONG(size, zlong) ((zlong) >= 0 && (size) <= (size_t)(zlong))
#endif /* ZEND_RANGE_CHECK_H */
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * indent-tabs-mode: t
- * End:
- * vim600: sw=4 ts=4 fdm=marker
- * vim<600: sw=4 ts=4
- */
diff --git a/Zend/zend_signal.c b/Zend/zend_signal.c
index 45c6335285..e69914752a 100644
--- a/Zend/zend_signal.c
+++ b/Zend/zend_signal.c
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| Zend Signal Handling |
+----------------------------------------------------------------------+
- | Copyright (c) 2008-2018 The PHP Group |
+ | Copyright (c) The PHP Group |
+----------------------------------------------------------------------+
| This source file is subject to version 3.01 of the PHP license, |
| that is bundled with this package in the file LICENSE, and is |
@@ -30,10 +30,7 @@
#include "zend.h"
#include "zend_globals.h"
-
-#ifdef HAVE_SIGNAL_H
#include <signal.h>
-#endif
#ifdef HAVE_UNISTD_H
#include <unistd.h>
@@ -45,6 +42,7 @@
#ifdef ZTS
ZEND_API int zend_signal_globals_id;
+ZEND_API size_t zend_signal_globals_offset;
#else
ZEND_API zend_signal_globals_t zend_signal_globals;
#endif /* not ZTS */
@@ -84,17 +82,17 @@ void zend_signal_handler_defer(int signo, siginfo_t *siginfo, void *context)
{
int errno_save = errno;
zend_signal_queue_t *queue, *qtmp;
- zend_bool is_handling_safe = 1;
#ifdef ZTS
- ZEND_TSRMLS_CACHE_UPDATE();
/* A signal could hit after TSRM shutdown, in this case globals are already freed. */
- if (NULL == TSRMLS_CACHE || NULL == TSRMG_BULK_STATIC(zend_signal_globals_id, zend_signal_globals_t *)) {
- is_handling_safe = 0;
+ if (tsrm_is_shutdown()) {
+ /* Forward to default handler handler */
+ zend_signal_handler(signo, siginfo, context);
+ return;
}
#endif
- if (EXPECTED(is_handling_safe && SIGG(active))) {
+ if (EXPECTED(SIGG(active))) {
if (UNEXPECTED(SIGG(depth) == 0)) { /* try to handle signal */
if (UNEXPECTED(SIGG(blocked))) {
SIGG(blocked) = 0;
@@ -179,7 +177,7 @@ static void zend_signal_handler(int signo, siginfo_t *siginfo, void *context)
sigset_t sigset;
zend_signal_entry_t p_sig;
#ifdef ZTS
- if (NULL == TSRMLS_CACHE || NULL == TSRMG_BULK_STATIC(zend_signal_globals_id, zend_signal_globals_t *)) {
+ if (tsrm_is_shutdown()) {
p_sig.flags = 0;
p_sig.handler = SIG_DFL;
} else
@@ -322,13 +320,14 @@ void zend_signal_activate(void)
memcpy(&SIGG(handlers), &global_orig_handlers, sizeof(global_orig_handlers));
- for (x = 0; x < sizeof(zend_sigs) / sizeof(*zend_sigs); x++) {
- zend_signal_register(zend_sigs[x], zend_signal_handler_defer);
+ if (SIGG(reset)) {
+ for (x = 0; x < sizeof(zend_sigs) / sizeof(*zend_sigs); x++) {
+ zend_signal_register(zend_sigs[x], zend_signal_handler_defer);
+ }
}
SIGG(active) = 1;
SIGG(depth) = 0;
- SIGG(check) = ZEND_DEBUG;
} /* }}} */
/* {{{ zend_signal_deactivate
@@ -376,6 +375,7 @@ static void zend_signal_globals_ctor(zend_signal_globals_t *zend_signal_globals)
size_t x;
memset(zend_signal_globals, 0, sizeof(*zend_signal_globals));
+ zend_signal_globals->reset = 1;
for (x = 0; x < sizeof(zend_signal_globals->pstorage) / sizeof(*zend_signal_globals->pstorage); ++x) {
zend_signal_queue_t *queue = &zend_signal_globals->pstorage[x];
@@ -412,7 +412,7 @@ ZEND_API void zend_signal_startup(void)
{
#ifdef ZTS
- ts_allocate_id(&zend_signal_globals_id, sizeof(zend_signal_globals_t), (ts_allocate_ctor) zend_signal_globals_ctor, NULL);
+ ts_allocate_fast_id(&zend_signal_globals_id, &zend_signal_globals_offset, sizeof(zend_signal_globals_t), (ts_allocate_ctor) zend_signal_globals_ctor, NULL);
#else
zend_signal_globals_ctor(&zend_signal_globals);
#endif
@@ -445,13 +445,3 @@ ZEND_API void zend_signal_startup(void)
#endif /* ZEND_SIGNALS */
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * indent-tabs-mode: t
- * End:
- * vim600: sw=4 ts=4 fdm=marker
- * vim<600: sw=4 ts=4
- */
diff --git a/Zend/zend_signal.h b/Zend/zend_signal.h
index 37bb0139d5..0bb191db73 100644
--- a/Zend/zend_signal.h
+++ b/Zend/zend_signal.h
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| Zend Signal Handling |
+----------------------------------------------------------------------+
- | Copyright (c) 2008-2018 The PHP Group |
+ | Copyright (c) The PHP Group |
+----------------------------------------------------------------------+
| This source file is subject to version 3.01 of the PHP license, |
| that is bundled with this package in the file LICENSE, and is |
@@ -23,9 +23,7 @@
#ifdef ZEND_SIGNALS
-# ifdef HAVE_SIGNAL_H
-# include <signal.h>
-# endif
+#include <signal.h>
#ifndef NSIG
#define NSIG 65
@@ -59,14 +57,16 @@ typedef struct _zend_signal_globals_t {
int running; /* in signal handler execution */
int active; /* internal signal handling is enabled */
zend_bool check; /* check for replaced handlers on shutdown */
+ zend_bool reset; /* reset signal handlers on each request */
zend_signal_entry_t handlers[NSIG];
zend_signal_queue_t pstorage[ZEND_SIGNAL_QUEUE_SIZE], *phead, *ptail, *pavail; /* pending queue */
} zend_signal_globals_t;
# ifdef ZTS
-# define SIGG(v) ZEND_TSRMG(zend_signal_globals_id, zend_signal_globals_t *, v)
+# define SIGG(v) ZEND_TSRMG_FAST(zend_signal_globals_offset, zend_signal_globals_t *, v)
BEGIN_EXTERN_C()
ZEND_API extern int zend_signal_globals_id;
+ZEND_API extern size_t zend_signal_globals_offset;
END_EXTERN_C()
# else
# define SIGG(v) (zend_signal_globals.v)
@@ -110,13 +110,3 @@ ZEND_API int zend_sigaction(int signo, const struct sigaction *act, struct sigac
#endif /* ZEND_SIGNALS */
#endif /* ZEND_SIGNAL_H */
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * indent-tabs-mode: t
- * End:
- * vim600: sw=4 ts=4 fdm=marker
- * vim<600: sw=4 ts=4
- */
diff --git a/Zend/zend_smart_str.c b/Zend/zend_smart_str.c
index e13741f72e..1a5eb455ad 100644
--- a/Zend/zend_smart_str.c
+++ b/Zend/zend_smart_str.c
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| PHP Version 7 |
+----------------------------------------------------------------------+
- | Copyright (c) 1997-2018 The PHP Group |
+ | Copyright (c) The PHP Group |
+----------------------------------------------------------------------+
| This source file is subject to version 3.01 of the PHP license, |
| that is bundled with this package in the file LICENSE, and is |
@@ -171,13 +171,3 @@ ZEND_API void ZEND_FASTCALL _smart_string_alloc(smart_string *str, size_t len)
str->c = erealloc2(str->c, str->a + 1, str->len);
}
}
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * indent-tabs-mode: t
- * End:
- * vim600: sw=4 ts=4 fdm=marker
- * vim<600: sw=4 ts=4
- */
diff --git a/Zend/zend_smart_str.h b/Zend/zend_smart_str.h
index aed87d773b..2dab1f809a 100644
--- a/Zend/zend_smart_str.h
+++ b/Zend/zend_smart_str.h
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| PHP Version 7 |
+----------------------------------------------------------------------+
- | Copyright (c) 1997-2018 The PHP Group |
+ | Copyright (c) The PHP Group |
+----------------------------------------------------------------------+
| This source file is subject to version 3.01 of the PHP license, |
| that is bundled with this package in the file LICENSE, and is |
@@ -150,13 +150,3 @@ static zend_always_inline void smart_str_setl(smart_str *dest, const char *src,
}
#endif
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * indent-tabs-mode: t
- * End:
- * vim600: sw=4 ts=4 fdm=marker
- * vim<600: sw=4 ts=4
- */
diff --git a/Zend/zend_smart_str_public.h b/Zend/zend_smart_str_public.h
index 7fa47c7ca8..ba0b399881 100644
--- a/Zend/zend_smart_str_public.h
+++ b/Zend/zend_smart_str_public.h
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| PHP Version 7 |
+----------------------------------------------------------------------+
- | Copyright (c) 1997-2018 The PHP Group |
+ | Copyright (c) The PHP Group |
+----------------------------------------------------------------------+
| This source file is subject to version 3.01 of the PHP license, |
| that is bundled with this package in the file LICENSE, and is |
@@ -25,13 +25,3 @@ typedef struct {
} smart_str;
#endif
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * indent-tabs-mode: t
- * End:
- * vim600: sw=4 ts=4 fdm=marker
- * vim<600: sw=4 ts=4
- */
diff --git a/Zend/zend_smart_string.h b/Zend/zend_smart_string.h
index f162bf2163..4580e43769 100644
--- a/Zend/zend_smart_string.h
+++ b/Zend/zend_smart_string.h
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| PHP Version 7 |
+----------------------------------------------------------------------+
- | Copyright (c) 1997-2018 The PHP Group |
+ | Copyright (c) The PHP Group |
+----------------------------------------------------------------------+
| This source file is subject to version 3.01 of the PHP license, |
| that is bundled with this package in the file LICENSE, and is |
@@ -113,13 +113,3 @@ static zend_always_inline void smart_string_reset(smart_string *str) {
}
#endif
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * indent-tabs-mode: t
- * End:
- * vim600: sw=4 ts=4 fdm=marker
- * vim<600: sw=4 ts=4
- */
diff --git a/Zend/zend_smart_string_public.h b/Zend/zend_smart_string_public.h
index ea0f3ddf4f..e39d67c16e 100644
--- a/Zend/zend_smart_string_public.h
+++ b/Zend/zend_smart_string_public.h
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| PHP Version 7 |
+----------------------------------------------------------------------+
- | Copyright (c) 1997-2018 The PHP Group |
+ | Copyright (c) The PHP Group |
+----------------------------------------------------------------------+
| This source file is subject to version 3.01 of the PHP license, |
| that is bundled with this package in the file LICENSE, and is |
@@ -29,13 +29,3 @@ typedef struct {
} smart_string;
#endif
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * indent-tabs-mode: t
- * End:
- * vim600: sw=4 ts=4 fdm=marker
- * vim<600: sw=4 ts=4
- */
diff --git a/Zend/zend_sort.c b/Zend/zend_sort.c
index 3127586097..4fe3835edb 100644
--- a/Zend/zend_sort.c
+++ b/Zend/zend_sort.c
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| Zend Engine |
+----------------------------------------------------------------------+
- | Copyright (c) 1998-2018 Zend Technologies Ltd. (http://www.zend.com) |
+ | Copyright (c) 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 |
@@ -372,12 +372,3 @@ done:
}
}
/* }}} */
-
-/*
- * Local Variables:
- * c-basic-offset: 4
- * tab-width: 4
- * End:
- * vim600: sw=4 ts=4 fdm=marker
- * vim<600: sw=4 ts=4
- */
diff --git a/Zend/zend_sort.h b/Zend/zend_sort.h
index a19cd44123..e2ef938df7 100644
--- a/Zend/zend_sort.h
+++ b/Zend/zend_sort.h
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| Zend Engine |
+----------------------------------------------------------------------+
- | Copyright (c) 1998-2018 Zend Technologies Ltd. (http://www.zend.com) |
+ | Copyright (c) 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 |
@@ -27,13 +27,3 @@ ZEND_API void zend_insert_sort(void *base, size_t nmemb, size_t siz, compare_fun
END_EXTERN_C()
#endif /* ZEND_SORT_H */
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * indent-tabs-mode: t
- * End:
- * vim600: sw=4 ts=4 fdm=marker
- * vim<600: sw=4 ts=4
- */
diff --git a/Zend/zend_sprintf.c b/Zend/zend_sprintf.c
deleted file mode 100644
index efe0897195..0000000000
--- a/Zend/zend_sprintf.c
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- +----------------------------------------------------------------------+
- | 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: Andi Gutmans <andi@php.net> |
- | Zeev Suraski <zeev@php.net> |
- +----------------------------------------------------------------------+
-*/
-
-#include <stdio.h>
-
-#include "zend.h"
-
-#ifdef HAVE_STDARG_H
-# include <stdarg.h>
-#endif
-
-#if ZEND_BROKEN_SPRINTF
-int zend_sprintf(char *buffer, const char *format, ...)
-{
- int len;
- va_list args;
-
- va_start(args, format);
- len = vsprintf(buffer, format, args);
- va_end(args);
-
- return len;
-}
-#endif
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * indent-tabs-mode: t
- * End:
- * vim600: sw=4 ts=4 fdm=marker
- * vim<600: sw=4 ts=4
- */
diff --git a/Zend/zend_stack.c b/Zend/zend_stack.c
index 1bb3aa0c55..51f68b5c9a 100644
--- a/Zend/zend_stack.c
+++ b/Zend/zend_stack.c
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| Zend Engine |
+----------------------------------------------------------------------+
- | Copyright (c) 1998-2018 Zend Technologies Ltd. (http://www.zend.com) |
+ | Copyright (c) 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 |
@@ -162,13 +162,3 @@ ZEND_API void zend_stack_clean(zend_stack *stack, void (*func)(void *), zend_boo
stack->top = stack->max = 0;
}
}
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * indent-tabs-mode: t
- * End:
- * vim600: sw=4 ts=4 fdm=marker
- * vim<600: sw=4 ts=4
- */
diff --git a/Zend/zend_stack.h b/Zend/zend_stack.h
index 889cdd3c94..912850a25e 100644
--- a/Zend/zend_stack.h
+++ b/Zend/zend_stack.h
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| Zend Engine |
+----------------------------------------------------------------------+
- | Copyright (c) 1998-2018 Zend Technologies Ltd. (http://www.zend.com) |
+ | Copyright (c) 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 |
@@ -47,13 +47,3 @@ END_EXTERN_C()
#define ZEND_STACK_APPLY_BOTTOMUP 2
#endif /* ZEND_STACK_H */
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * indent-tabs-mode: t
- * End:
- * vim600: sw=4 ts=4 fdm=marker
- * vim<600: sw=4 ts=4
- */
diff --git a/Zend/zend_stream.c b/Zend/zend_stream.c
index 22726f0812..38b145736b 100644
--- a/Zend/zend_stream.c
+++ b/Zend/zend_stream.c
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| Zend Engine |
+----------------------------------------------------------------------+
- | Copyright (c) 1998-2018 Zend Technologies Ltd. (http://www.zend.com) |
+ | Copyright (c) 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 |
@@ -23,30 +23,9 @@
#include "zend_compile.h"
#include "zend_stream.h"
-#if HAVE_MMAP
-# if HAVE_UNISTD_H
-# include <unistd.h>
-# if defined(_SC_PAGESIZE)
-# define REAL_PAGE_SIZE sysconf(_SC_PAGESIZE);
-# elif defined(_SC_PAGE_SIZE)
-# define REAL_PAGE_SIZE sysconf(_SC_PAGE_SIZE);
-# endif
-# endif
-# if HAVE_SYS_MMAN_H
-# include <sys/mman.h>
-# endif
-# ifndef REAL_PAGE_SIZE
-# ifdef PAGE_SIZE
-# define REAL_PAGE_SIZE PAGE_SIZE
-# else
-# define REAL_PAGE_SIZE 4096
-# endif
-# endif
-#endif
-
ZEND_DLIMPORT int isatty(int fd);
-static size_t zend_stream_stdio_reader(void *handle, char *buf, size_t len) /* {{{ */
+static ssize_t zend_stream_stdio_reader(void *handle, char *buf, size_t len) /* {{{ */
{
return fread(buf, 1, len, (FILE*)handle);
} /* }}} */
@@ -69,72 +48,41 @@ static size_t zend_stream_stdio_fsizer(void *handle) /* {{{ */
#endif
return buf.st_size;
}
- return 0;
-} /* }}} */
-
-static void zend_stream_unmap(zend_stream *stream) { /* {{{ */
-#if HAVE_MMAP
- if (stream->mmap.map) {
- munmap(stream->mmap.map, stream->mmap.len + ZEND_MMAP_AHEAD);
- } else
-#endif
- if (stream->mmap.buf) {
- efree(stream->mmap.buf);
- }
- stream->mmap.len = 0;
- stream->mmap.pos = 0;
- stream->mmap.map = 0;
- stream->mmap.buf = 0;
- stream->handle = stream->mmap.old_handle;
+ return -1;
} /* }}} */
-static void zend_stream_mmap_closer(zend_stream *stream) /* {{{ */
+static size_t zend_stream_fsize(zend_file_handle *file_handle) /* {{{ */
{
- zend_stream_unmap(stream);
- if (stream->mmap.old_closer && stream->handle) {
- stream->mmap.old_closer(stream->handle);
+ ZEND_ASSERT(file_handle->type == ZEND_HANDLE_STREAM);
+ if (file_handle->handle.stream.isatty) {
+ return 0;
}
+ return file_handle->handle.stream.fsizer(file_handle->handle.stream.handle);
} /* }}} */
-static inline int zend_stream_is_mmap(zend_file_handle *file_handle) { /* {{{ */
- return file_handle->type == ZEND_HANDLE_MAPPED;
-} /* }}} */
-
-static size_t zend_stream_fsize(zend_file_handle *file_handle) /* {{{ */
-{
- zend_stat_t buf;
-
- if (zend_stream_is_mmap(file_handle)) {
- return file_handle->handle.stream.mmap.len;
- }
- if (file_handle->type == ZEND_HANDLE_STREAM || file_handle->type == ZEND_HANDLE_MAPPED) {
- return file_handle->handle.stream.fsizer(file_handle->handle.stream.handle);
- }
- if (file_handle->handle.fp && zend_fstat(fileno(file_handle->handle.fp), &buf) == 0) {
-#ifdef S_ISREG
- if (!S_ISREG(buf.st_mode)) {
- return 0;
- }
-#endif
- return buf.st_size;
- }
+ZEND_API void zend_stream_init_fp(zend_file_handle *handle, FILE *fp, const char *filename) {
+ memset(handle, 0, sizeof(zend_file_handle));
+ handle->type = ZEND_HANDLE_FP;
+ handle->handle.fp = fp;
+ handle->filename = filename;
+}
- return -1;
-} /* }}} */
+ZEND_API void zend_stream_init_filename(zend_file_handle *handle, const char *filename) {
+ memset(handle, 0, sizeof(zend_file_handle));
+ handle->type = ZEND_HANDLE_FILENAME;
+ handle->filename = filename;
+}
ZEND_API int zend_stream_open(const char *filename, zend_file_handle *handle) /* {{{ */
{
+ zend_string *opened_path;
if (zend_stream_open_function) {
return zend_stream_open_function(filename, handle);
}
- handle->type = ZEND_HANDLE_FP;
- handle->opened_path = NULL;
- handle->handle.fp = zend_fopen(filename, &handle->opened_path);
- handle->filename = filename;
- handle->free_filename = 0;
- memset(&handle->handle.stream.mmap, 0, sizeof(zend_mmap));
- return (handle->handle.fp) ? SUCCESS : FAILURE;
+ zend_stream_init_fp(handle, zend_fopen(filename, &opened_path), filename);
+ handle->opened_path = opened_path;
+ return handle->handle.fp ? SUCCESS : FAILURE;
} /* }}} */
static int zend_stream_getc(zend_file_handle *file_handle) /* {{{ */
@@ -147,9 +95,9 @@ static int zend_stream_getc(zend_file_handle *file_handle) /* {{{ */
return EOF;
} /* }}} */
-static size_t zend_stream_read(zend_file_handle *file_handle, char *buf, size_t len) /* {{{ */
+static ssize_t zend_stream_read(zend_file_handle *file_handle, char *buf, size_t len) /* {{{ */
{
- if (!zend_stream_is_mmap(file_handle) && file_handle->handle.stream.isatty) {
+ if (file_handle->handle.stream.isatty) {
int c = '*';
size_t n;
@@ -167,8 +115,13 @@ static size_t zend_stream_read(zend_file_handle *file_handle, char *buf, size_t
ZEND_API int zend_stream_fixup(zend_file_handle *file_handle, char **buf, size_t *len) /* {{{ */
{
- size_t size;
- zend_stream_type old_type;
+ size_t file_size;
+
+ if (file_handle->buf) {
+ *buf = file_handle->buf;
+ *len = file_handle->len;
+ return SUCCESS;
+ }
if (file_handle->type == ZEND_HANDLE_FILENAME) {
if (zend_stream_open(file_handle->filename, file_handle) == FAILURE) {
@@ -176,75 +129,41 @@ ZEND_API int zend_stream_fixup(zend_file_handle *file_handle, char **buf, size_t
}
}
- switch (file_handle->type) {
- case ZEND_HANDLE_FD:
- file_handle->type = ZEND_HANDLE_FP;
- file_handle->handle.fp = fdopen(file_handle->handle.fd, "rb");
- /* no break; */
- case ZEND_HANDLE_FP:
- if (!file_handle->handle.fp) {
- return FAILURE;
- }
- memset(&file_handle->handle.stream.mmap, 0, sizeof(zend_mmap));
- file_handle->handle.stream.isatty = isatty(fileno((FILE *)file_handle->handle.stream.handle)) ? 1 : 0;
- file_handle->handle.stream.reader = (zend_stream_reader_t)zend_stream_stdio_reader;
- file_handle->handle.stream.closer = (zend_stream_closer_t)zend_stream_stdio_closer;
- file_handle->handle.stream.fsizer = (zend_stream_fsizer_t)zend_stream_stdio_fsizer;
- memset(&file_handle->handle.stream.mmap, 0, sizeof(file_handle->handle.stream.mmap));
- /* no break; */
- case ZEND_HANDLE_STREAM:
- /* nothing to do */
- break;
-
- case ZEND_HANDLE_MAPPED:
- file_handle->handle.stream.mmap.pos = 0;
- *buf = file_handle->handle.stream.mmap.buf;
- *len = file_handle->handle.stream.mmap.len;
- return SUCCESS;
-
- default:
+ if (file_handle->type == ZEND_HANDLE_FP) {
+ if (!file_handle->handle.fp) {
return FAILURE;
+ }
+
+ file_handle->type = ZEND_HANDLE_STREAM;
+ file_handle->handle.stream.handle = file_handle->handle.fp;
+ file_handle->handle.stream.isatty = isatty(fileno((FILE *)file_handle->handle.stream.handle));
+ file_handle->handle.stream.reader = (zend_stream_reader_t)zend_stream_stdio_reader;
+ file_handle->handle.stream.closer = (zend_stream_closer_t)zend_stream_stdio_closer;
+ file_handle->handle.stream.fsizer = (zend_stream_fsizer_t)zend_stream_stdio_fsizer;
}
- size = zend_stream_fsize(file_handle);
- if (size == (size_t)-1) {
+ file_size = zend_stream_fsize(file_handle);
+ if (file_size == (size_t)-1) {
return FAILURE;
}
- old_type = file_handle->type;
- file_handle->type = ZEND_HANDLE_STREAM; /* we might still be _FP but we need fsize() work */
-
- if (old_type == ZEND_HANDLE_FP && !file_handle->handle.stream.isatty && size) {
-#if HAVE_MMAP
- size_t page_size = REAL_PAGE_SIZE;
-
- if (file_handle->handle.fp &&
- size != 0 &&
- ((size - 1) % page_size) <= page_size - ZEND_MMAP_AHEAD) {
- /* *buf[size] is zeroed automatically by the kernel */
- *buf = mmap(0, size + ZEND_MMAP_AHEAD, PROT_READ, MAP_PRIVATE, fileno(file_handle->handle.fp), 0);
- if (*buf != MAP_FAILED) {
- zend_long offset = ftell(file_handle->handle.fp);
- file_handle->handle.stream.mmap.map = *buf;
-
- if (offset != -1) {
- *buf += offset;
- size -= offset;
- }
- file_handle->handle.stream.mmap.buf = *buf;
- file_handle->handle.stream.mmap.len = size;
-
- goto return_mapped;
- }
+ if (file_size) {
+ ssize_t read;
+ size_t size = 0;
+ *buf = safe_emalloc(1, file_size, ZEND_MMAP_AHEAD);
+ while ((read = zend_stream_read(file_handle, *buf + size, file_size - size)) > 0) {
+ size += read;
}
-#endif
- file_handle->handle.stream.mmap.map = 0;
- file_handle->handle.stream.mmap.buf = *buf = safe_emalloc(1, size, ZEND_MMAP_AHEAD);
- file_handle->handle.stream.mmap.len = zend_stream_read(file_handle, *buf, size);
+ if (read < 0) {
+ efree(*buf);
+ return FAILURE;
+ }
+ file_handle->buf = *buf;
+ file_handle->len = size;
} else {
- size_t read, remain = 4*1024;
+ size_t size = 0, remain = 4*1024;
+ ssize_t read;
*buf = emalloc(remain);
- size = 0;
while ((read = zend_stream_read(file_handle, *buf + size, remain)) > 0) {
size += read;
@@ -255,34 +174,27 @@ ZEND_API int zend_stream_fixup(zend_file_handle *file_handle, char **buf, size_t
remain = size;
}
}
- file_handle->handle.stream.mmap.map = 0;
- file_handle->handle.stream.mmap.len = size;
+ if (read < 0) {
+ efree(*buf);
+ return FAILURE;
+ }
+
+ file_handle->len = size;
if (size && remain < ZEND_MMAP_AHEAD) {
*buf = safe_erealloc(*buf, size, 1, ZEND_MMAP_AHEAD);
}
- file_handle->handle.stream.mmap.buf = *buf;
+ file_handle->buf = *buf;
}
- if (file_handle->handle.stream.mmap.len == 0) {
+ if (file_handle->len == 0) {
*buf = erealloc(*buf, ZEND_MMAP_AHEAD);
- file_handle->handle.stream.mmap.buf = *buf;
+ file_handle->buf = *buf;
}
- if (ZEND_MMAP_AHEAD) {
- memset(file_handle->handle.stream.mmap.buf + file_handle->handle.stream.mmap.len, 0, ZEND_MMAP_AHEAD);
- }
-#if HAVE_MMAP
-return_mapped:
-#endif
- file_handle->type = ZEND_HANDLE_MAPPED;
- file_handle->handle.stream.mmap.pos = 0;
- file_handle->handle.stream.mmap.old_handle = file_handle->handle.stream.handle;
- file_handle->handle.stream.mmap.old_closer = file_handle->handle.stream.closer;
- file_handle->handle.stream.handle = &file_handle->handle.stream;
- file_handle->handle.stream.closer = (zend_stream_closer_t)zend_stream_mmap_closer;
+ memset(file_handle->buf + file_handle->len, 0, ZEND_MMAP_AHEAD);
- *buf = file_handle->handle.stream.mmap.buf;
- *len = file_handle->handle.stream.mmap.len;
+ *buf = file_handle->buf;
+ *len = file_handle->len;
return SUCCESS;
} /* }}} */
@@ -290,14 +202,10 @@ return_mapped:
ZEND_API void zend_file_handle_dtor(zend_file_handle *fh) /* {{{ */
{
switch (fh->type) {
- case ZEND_HANDLE_FD:
- /* nothing to do */
- break;
case ZEND_HANDLE_FP:
fclose(fh->handle.fp);
break;
case ZEND_HANDLE_STREAM:
- case ZEND_HANDLE_MAPPED:
if (fh->handle.stream.closer && fh->handle.stream.handle) {
fh->handle.stream.closer(fh->handle.stream.handle);
}
@@ -313,6 +221,10 @@ ZEND_API void zend_file_handle_dtor(zend_file_handle *fh) /* {{{ */
zend_string_release_ex(fh->opened_path, 0);
fh->opened_path = NULL;
}
+ if (fh->buf) {
+ efree(fh->buf);
+ fh->buf = NULL;
+ }
if (fh->free_filename && fh->filename) {
efree((char*)fh->filename);
fh->filename = NULL;
@@ -326,29 +238,14 @@ ZEND_API int zend_compare_file_handles(zend_file_handle *fh1, zend_file_handle *
return 0;
}
switch (fh1->type) {
- case ZEND_HANDLE_FD:
- return fh1->handle.fd == fh2->handle.fd;
+ case ZEND_HANDLE_FILENAME:
+ return strcmp(fh1->filename, fh2->filename) == 0;
case ZEND_HANDLE_FP:
return fh1->handle.fp == fh2->handle.fp;
case ZEND_HANDLE_STREAM:
return fh1->handle.stream.handle == fh2->handle.stream.handle;
- case ZEND_HANDLE_MAPPED:
- return (fh1->handle.stream.handle == &fh1->handle.stream &&
- fh2->handle.stream.handle == &fh2->handle.stream &&
- fh1->handle.stream.mmap.old_handle == fh2->handle.stream.mmap.old_handle)
- || fh1->handle.stream.handle == fh2->handle.stream.handle;
default:
return 0;
}
return 0;
} /* }}} */
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * indent-tabs-mode: t
- * End:
- * vim600: sw=4 ts=4 fdm=marker
- * vim<600: sw=4 ts=4
- */
diff --git a/Zend/zend_stream.h b/Zend/zend_stream.h
index 8279d69c4d..51651add38 100644
--- a/Zend/zend_stream.h
+++ b/Zend/zend_stream.h
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| Zend Engine |
+----------------------------------------------------------------------+
- | Copyright (c) 1998-2018 Zend Technologies Ltd. (http://www.zend.com) |
+ | Copyright (c) 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 |
@@ -29,32 +29,20 @@
* These functions are private to the engine.
* */
typedef size_t (*zend_stream_fsizer_t)(void* handle);
-typedef size_t (*zend_stream_reader_t)(void* handle, char *buf, size_t len);
+typedef ssize_t (*zend_stream_reader_t)(void* handle, char *buf, size_t len);
typedef void (*zend_stream_closer_t)(void* handle);
#define ZEND_MMAP_AHEAD 32
typedef enum {
ZEND_HANDLE_FILENAME,
- ZEND_HANDLE_FD,
ZEND_HANDLE_FP,
- ZEND_HANDLE_STREAM,
- ZEND_HANDLE_MAPPED
+ ZEND_HANDLE_STREAM
} zend_stream_type;
-typedef struct _zend_mmap {
- size_t len;
- size_t pos;
- void *map;
- char *buf;
- void *old_handle;
- zend_stream_closer_t old_closer;
-} zend_mmap;
-
typedef struct _zend_stream {
void *handle;
int isatty;
- zend_mmap mmap;
zend_stream_reader_t reader;
zend_stream_fsizer_t fsizer;
zend_stream_closer_t closer;
@@ -62,47 +50,49 @@ typedef struct _zend_stream {
typedef struct _zend_file_handle {
union {
- int fd;
FILE *fp;
zend_stream stream;
} handle;
const char *filename;
zend_string *opened_path;
zend_stream_type type;
- zend_bool free_filename;
+ /* free_filename is used by wincache */
+ /* TODO: Clean up filename vs opened_path mess */
+ zend_bool free_filename;
+ char *buf;
+ size_t len;
} zend_file_handle;
BEGIN_EXTERN_C()
+ZEND_API void zend_stream_init_fp(zend_file_handle *handle, FILE *fp, const char *filename);
+ZEND_API void zend_stream_init_filename(zend_file_handle *handle, const char *filename);
ZEND_API int zend_stream_open(const char *filename, zend_file_handle *handle);
ZEND_API int zend_stream_fixup(zend_file_handle *file_handle, char **buf, size_t *len);
ZEND_API void zend_file_handle_dtor(zend_file_handle *fh);
ZEND_API int zend_compare_file_handles(zend_file_handle *fh1, zend_file_handle *fh2);
END_EXTERN_C()
+#ifdef ZEND_WIN32
+# include "win32/ioutil.h"
+typedef php_win32_ioutil_stat_t zend_stat_t;
#ifdef _WIN64
-# define zend_fseek _fseeki64
-# define zend_ftell _ftelli64
-# define zend_lseek _lseeki64
-# define zend_fstat _fstat64
-# define zend_stat _stat64
-typedef struct __stat64 zend_stat_t;
+# define zend_fseek _fseeki64
+# define zend_ftell _ftelli64
+# define zend_lseek _lseeki64
+# else
+# define zend_fseek fseek
+# define zend_ftell ftell
+# define zend_lseek lseek
+# endif
+# define zend_fstat php_win32_ioutil_fstat
+# define zend_stat php_win32_ioutil_stat
#else
+typedef struct stat zend_stat_t;
# define zend_fseek fseek
# define zend_ftell ftell
# define zend_lseek lseek
# define zend_fstat fstat
# define zend_stat stat
-typedef struct stat zend_stat_t;
#endif
#endif
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * indent-tabs-mode: t
- * End:
- * vim600: sw=4 ts=4 fdm=marker
- * vim<600: sw=4 ts=4
- */
diff --git a/Zend/zend_string.c b/Zend/zend_string.c
index 61e5f51b7f..75e7e6249f 100644
--- a/Zend/zend_string.c
+++ b/Zend/zend_string.c
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| Zend Engine |
+----------------------------------------------------------------------+
- | Copyright (c) 1998-2018 Zend Technologies Ltd. (http://www.zend.com) |
+ | Copyright (c) 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 |
@@ -39,8 +39,6 @@ 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];
@@ -69,22 +67,22 @@ ZEND_KNOWN_STRINGS(_ZEND_STR_DSC)
NULL
};
-static void zend_init_interned_strings_ht(HashTable *interned_strings, int permanent)
+static zend_always_inline 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_mixed(interned_strings);
+ if (permanent) {
+ zend_hash_real_init_mixed(interned_strings);
+ }
}
ZEND_API void zend_interned_strings_init(void)
{
char s[2];
- int i;
+ unsigned int i;
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;
@@ -315,26 +313,14 @@ ZEND_API void zend_interned_strings_set_request_storage_handlers(zend_new_intern
interned_string_init_request_handler = 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)
-{
- interned_string_copy_storage = copy_handler;
- interned_string_restore_storage = restore_handler;
-}
-
ZEND_API void zend_interned_strings_switch_storage(zend_bool request)
{
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();
- }
}
}
@@ -475,13 +461,3 @@ ZEND_API zend_bool ZEND_FASTCALL I_WRAP_SONAME_FNNAME_ZU(NONE,zend_string_equal_
#endif
#endif
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * indent-tabs-mode: t
- * End:
- * vim600: sw=4 ts=4 fdm=marker
- * vim<600: sw=4 ts=4
- */
diff --git a/Zend/zend_string.h b/Zend/zend_string.h
index c95578d4a5..b4a0ddef95 100644
--- a/Zend/zend_string.h
+++ b/Zend/zend_string.h
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| Zend Engine |
+----------------------------------------------------------------------+
- | Copyright (c) 1998-2018 Zend Technologies Ltd. (http://www.zend.com) |
+ | Copyright (c) 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 |
@@ -39,7 +39,6 @@ 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 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;
@@ -80,7 +79,7 @@ END_EXTERN_C()
(str) = (zend_string *)do_alloca(ZEND_MM_ALIGNED_SIZE_EX(_ZSTR_STRUCT_SIZE(_len), 8), (use_heap)); \
GC_SET_REFCOUNT(str, 1); \
GC_TYPE_INFO(str) = IS_STRING; \
- zend_string_forget_hash_val(str); \
+ ZSTR_H(str) = 0; \
ZSTR_LEN(str) = _len; \
} while (0)
@@ -102,6 +101,7 @@ static zend_always_inline zend_ulong zend_string_hash_val(zend_string *s)
static zend_always_inline void zend_string_forget_hash_val(zend_string *s)
{
ZSTR_H(s) = 0;
+ GC_DEL_FLAGS(s, IS_STR_VALID_UTF8);
}
static zend_always_inline uint32_t zend_string_refcount(const zend_string *s)
@@ -134,7 +134,7 @@ static zend_always_inline zend_string *zend_string_alloc(size_t len, int persist
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_H(ret) = 0;
ZSTR_LEN(ret) = len;
return ret;
}
@@ -145,7 +145,7 @@ static zend_always_inline zend_string *zend_string_safe_alloc(size_t n, size_t m
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_H(ret) = 0;
ZSTR_LEN(ret) = (n * m) + l;
return ret;
}
@@ -337,7 +337,7 @@ static zend_always_inline zend_bool zend_string_equals(zend_string *s1, zend_str
* constants, prime or not, has never been adequately explained by
* anyone. So I try an explanation: if one experimentally tests all
* multipliers between 1 and 256 (as RSE did now) one detects that even
- * numbers are not useable at all. The remaining 128 odd numbers
+ * numbers are not usable at all. The remaining 128 odd numbers
* (except for the number 1) work more or less all equally well. They
* all distribute in an acceptable way and this way fill a hash table
* with an average percent of approx. 86%.
@@ -361,6 +361,69 @@ static zend_always_inline zend_ulong zend_inline_hash_func(const char *str, size
{
zend_ulong hash = Z_UL(5381);
+#if defined(_WIN32) || defined(__i386__) || defined(__x86_64__) || defined(__aarch64__)
+ /* Version with multiplication works better on modern CPU */
+ for (; len >= 8; len -= 8, str += 8) {
+# if defined(__aarch64__) && !defined(WORDS_BIGENDIAN)
+ /* On some architectures it is beneficial to load 8 bytes at a
+ time and extract each byte with a bit field extract instr. */
+ uint64_t chunk;
+
+ memcpy(&chunk, str, sizeof(chunk));
+ hash =
+ hash * 33 * 33 * 33 * 33 +
+ ((chunk >> (8 * 0)) & 0xff) * 33 * 33 * 33 +
+ ((chunk >> (8 * 1)) & 0xff) * 33 * 33 +
+ ((chunk >> (8 * 2)) & 0xff) * 33 +
+ ((chunk >> (8 * 3)) & 0xff);
+ hash =
+ hash * 33 * 33 * 33 * 33 +
+ ((chunk >> (8 * 4)) & 0xff) * 33 * 33 * 33 +
+ ((chunk >> (8 * 5)) & 0xff) * 33 * 33 +
+ ((chunk >> (8 * 6)) & 0xff) * 33 +
+ ((chunk >> (8 * 7)) & 0xff);
+# else
+ hash =
+ hash * 33 * 33 * 33 * 33 +
+ str[0] * 33 * 33 * 33 +
+ str[1] * 33 * 33 +
+ str[2] * 33 +
+ str[3];
+ hash =
+ hash * 33 * 33 * 33 * 33 +
+ str[4] * 33 * 33 * 33 +
+ str[5] * 33 * 33 +
+ str[6] * 33 +
+ str[7];
+# endif
+ }
+ if (len >= 4) {
+ hash =
+ hash * 33 * 33 * 33 * 33 +
+ str[0] * 33 * 33 * 33 +
+ str[1] * 33 * 33 +
+ str[2] * 33 +
+ str[3];
+ len -= 4;
+ str += 4;
+ }
+ if (len >= 2) {
+ if (len > 2) {
+ hash =
+ hash * 33 * 33 * 33 +
+ str[0] * 33 * 33 +
+ str[1] * 33 +
+ str[2];
+ } else {
+ hash =
+ hash * 33 * 33 +
+ str[0] * 33 +
+ str[1];
+ }
+ } else if (len != 0) {
+ hash = hash * 33 + *str;
+ }
+#else
/* variant with the hash unrolled eight times */
for (; len >= 8; len -= 8) {
hash = ((hash << 5) + hash) + *str++;
@@ -383,6 +446,7 @@ static zend_always_inline zend_ulong zend_inline_hash_func(const char *str, size
case 0: break;
EMPTY_SWITCH_DEFAULT_CASE()
}
+#endif
/* Hash value can't be zero, so we always set the high bit */
#if SIZEOF_ZEND_LONG == 8
@@ -442,6 +506,7 @@ EMPTY_SWITCH_DEFAULT_CASE()
_(ZEND_STR_NAME, "name") \
_(ZEND_STR_ARGV, "argv") \
_(ZEND_STR_ARGC, "argc") \
+ _(ZEND_STR_ARRAY_CAPITALIZED, "Array") \
typedef enum _zend_known_string_id {
@@ -452,13 +517,3 @@ ZEND_KNOWN_STRINGS(_ZEND_STR_ID)
} zend_known_string_id;
#endif /* ZEND_STRING_H */
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * indent-tabs-mode: t
- * End:
- * vim600: sw=4 ts=4 fdm=marker
- * vim<600: sw=4 ts=4
- */
diff --git a/Zend/zend_strtod.c b/Zend/zend_strtod.c
index 3aa99f8d98..2228e2262c 100644
--- a/Zend/zend_strtod.c
+++ b/Zend/zend_strtod.c
@@ -546,6 +546,7 @@ Bigint {
static Bigint *freelist[Kmax+1];
static void destroy_freelist(void);
+static void free_p5s(void);
#ifdef ZTS
static MUTEX_T dtoa_mutex;
@@ -564,6 +565,8 @@ ZEND_API int zend_startup_strtod(void) /* {{{ */
ZEND_API int zend_shutdown_strtod(void) /* {{{ */
{
destroy_freelist();
+ free_p5s();
+
#ifdef ZTS
tsrm_mutex_free(dtoa_mutex);
dtoa_mutex = NULL;
@@ -2705,7 +2708,7 @@ zend_strtod
L = c - '0';
s1 = s;
while((c = *++s) >= '0' && c <= '9')
- L = 10*L + c - '0';
+ L = (Long) (10*(ULong)L + (c - '0'));
if (s - s1 > 8 || L > 19999)
/* Avoid confusion from exponents
* so large that e might overflow.
@@ -3751,7 +3754,7 @@ zend_dtoa
*/
int bbits, b2, b5, be, dig, i, ieps, ilim = 0, ilim0, ilim1,
- j, j1, k, k0, k_check, leftright, m2, m5, s2, s5,
+ j, j1 = 0, k, k0, k_check, leftright, m2, m5, s2, s5,
spec_case = 0, try_quick;
Long L;
#ifndef Sudden_Underflow
@@ -4540,14 +4543,19 @@ static void destroy_freelist(void)
FREE_DTOA_LOCK(0)
}
+static void free_p5s(void)
+{
+ Bigint **listp, *tmp;
+
+ ACQUIRE_DTOA_LOCK(1)
+ listp = &p5s;
+ while ((tmp = *listp) != NULL) {
+ *listp = tmp->next;
+ free(tmp);
+ }
+ FREE_DTOA_LOCK(1)
+}
+
#ifdef __cplusplus
}
#endif
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * End:
- * vim600: sw=4 ts=4 fdm=marker
- * vim<600: sw=4 ts=4
- */
diff --git a/Zend/zend_strtod.h b/Zend/zend_strtod.h
index aec1bfe777..ea81827df2 100644
--- a/Zend/zend_strtod.h
+++ b/Zend/zend_strtod.h
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| Zend Engine |
+----------------------------------------------------------------------+
- | Copyright (c) 1998-2018 Zend Technologies Ltd. (http://www.zend.com) |
+ | Copyright (c) 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 |
@@ -34,13 +34,3 @@ ZEND_API int zend_shutdown_strtod(void);
END_EXTERN_C()
#endif
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * indent-tabs-mode: t
- * End:
- * vim600: sw=4 ts=4 fdm=marker
- * vim<600: sw=4 ts=4
- */
diff --git a/Zend/zend_strtod_int.h b/Zend/zend_strtod_int.h
index f3fc6ea90a..5fe31f940d 100644
--- a/Zend/zend_strtod_int.h
+++ b/Zend/zend_strtod_int.h
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| Zend Engine |
+----------------------------------------------------------------------+
- | Copyright (c) 1998-2018 Zend Technologies Ltd. (http://www.zend.com) |
+ | Copyright (c) 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 |
@@ -145,13 +145,3 @@ typedef unsigned long int uint32_t;
#endif
#endif /* ZEND_STRTOD_INT_H */
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * indent-tabs-mode: t
- * End:
- * vim600: sw=4 ts=4 fdm=marker
- * vim<600: sw=4 ts=4
- */
diff --git a/Zend/zend_ts_hash.c b/Zend/zend_ts_hash.c
index 9ed1306479..3cff54bf6c 100644
--- a/Zend/zend_ts_hash.c
+++ b/Zend/zend_ts_hash.c
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| Zend Engine |
+----------------------------------------------------------------------+
- | Copyright (c) 1998-2018 Zend Technologies Ltd. (http://www.zend.com) |
+ | Copyright (c) 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 |
@@ -230,28 +230,6 @@ ZEND_API zval *zend_ts_hash_index_find(TsHashTable *ht, zend_ulong h)
return retval;
}
-ZEND_API int zend_ts_hash_exists(TsHashTable *ht, zend_string *key)
-{
- int retval;
-
- begin_read(ht);
- retval = zend_hash_exists(TS_HASH(ht), key);
- end_read(ht);
-
- return retval;
-}
-
-ZEND_API int zend_ts_hash_index_exists(TsHashTable *ht, zend_ulong h)
-{
- int retval;
-
- begin_read(ht);
- retval = zend_hash_index_exists(TS_HASH(ht), h);
- end_read(ht);
-
- return retval;
-}
-
ZEND_API void zend_ts_hash_copy(TsHashTable *target, TsHashTable *source, copy_ctor_func_t pCopyConstructor)
{
begin_read(source);
@@ -375,11 +353,3 @@ ZEND_API zval *zend_ts_hash_str_add(TsHashTable *ht, const char *key, size_t len
return retval;
}
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * indent-tabs-mode: t
- * End:
- */
diff --git a/Zend/zend_ts_hash.h b/Zend/zend_ts_hash.h
index 91840f203f..35a4250d34 100644
--- a/Zend/zend_ts_hash.h
+++ b/Zend/zend_ts_hash.h
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| Zend Engine |
+----------------------------------------------------------------------+
- | Copyright (c) 1998-2018 Zend Technologies Ltd. (http://www.zend.com) |
+ | Copyright (c) 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 |
@@ -64,14 +64,10 @@ ZEND_API void zend_ts_hash_reverse_apply(TsHashTable *ht, apply_func_t apply_fun
ZEND_API int zend_ts_hash_del(TsHashTable *ht, zend_string *key);
ZEND_API int zend_ts_hash_index_del(TsHashTable *ht, zend_ulong h);
-/* Data retreival */
+/* Data retrieval */
ZEND_API zval *zend_ts_hash_find(TsHashTable *ht, zend_string *key);
ZEND_API zval *zend_ts_hash_index_find(TsHashTable *ht, zend_ulong);
-/* Misc */
-ZEND_API int zend_ts_hash_exists(TsHashTable *ht, zend_string *key);
-ZEND_API int zend_ts_hash_index_exists(TsHashTable *ht, zend_ulong h);
-
/* Copying, merging and sorting */
ZEND_API void zend_ts_hash_copy(TsHashTable *target, TsHashTable *source, copy_ctor_func_t pCopyConstructor);
ZEND_API void zend_ts_hash_copy_to_hash(HashTable *target, TsHashTable *source, copy_ctor_func_t pCopyConstructor);
@@ -121,6 +117,16 @@ static zend_always_inline void *zend_ts_hash_str_add_ptr(TsHashTable *ht, const
return zv ? Z_PTR_P(zv) : NULL;
}
+static zend_always_inline int zend_ts_hash_exists(TsHashTable *ht, zend_string *key)
+{
+ return zend_ts_hash_find(ht, key) != NULL;
+}
+
+static zend_always_inline int zend_ts_hash_index_exists(TsHashTable *ht, zend_ulong h)
+{
+ return zend_ts_hash_index_find(ht, h) != NULL;
+}
+
END_EXTERN_C()
#define ZEND_TS_INIT_SYMTABLE(ht) \
@@ -130,13 +136,3 @@ END_EXTERN_C()
zend_ts_hash_init(ht, n, NULL, ZVAL_PTR_DTOR, persistent)
#endif /* ZEND_HASH_H */
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * indent-tabs-mode: t
- * End:
- * vim600: sw=4 ts=4 fdm=marker
- * vim<600: sw=4 ts=4
- */
diff --git a/Zend/zend_type_info.h b/Zend/zend_type_info.h
index 7273892dd7..72550b6fc3 100644
--- a/Zend/zend_type_info.h
+++ b/Zend/zend_type_info.h
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| Zend Engine |
+----------------------------------------------------------------------+
- | Copyright (c) 1998-2018 Zend Technologies Ltd. (http://www.zend.com) |
+ | Copyright (c) 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 |
@@ -56,13 +56,3 @@
#define MAY_BE_CLASS (1<<24)
#endif /* ZEND_TYPE_INFO_H */
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * indent-tabs-mode: t
- * End:
- * vim600: sw=4 ts=4 fdm=marker
- * vim<600: sw=4 ts=4
- */
diff --git a/Zend/zend_types.h b/Zend/zend_types.h
index 4250aabd1f..7b8c079c45 100644
--- a/Zend/zend_types.h
+++ b/Zend/zend_types.h
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| Zend Engine |
+----------------------------------------------------------------------+
- | Copyright (c) 1998-2018 Zend Technologies Ltd. (http://www.zend.com) |
+ | Copyright (c) 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 |
@@ -108,6 +108,8 @@ typedef void (*copy_ctor_func_t)(zval *pElement);
* ZEND_TYPE_IS_SET() - checks if type-hint exists
* ZEND_TYPE_IS_CODE() - checks if type-hint refer to standard type
* ZEND_TYPE_IS_CLASS() - checks if type-hint refer to some class
+ * ZEND_TYPE_IS_CE() - checks if type-hint refer to some class by zend_class_entry *
+ * ZEND_TYPE_IS_NAME() - checks if type-hint refer to some class by zend_string *
*
* ZEND_TYPE_NAME() - returns referenced class name
* ZEND_TYPE_CE() - returns referenced class entry
@@ -122,13 +124,19 @@ typedef void (*copy_ctor_func_t)(zval *pElement);
typedef uintptr_t zend_type;
#define ZEND_TYPE_IS_SET(t) \
- ((t) > Z_L(1))
+ ((t) > Z_L(0x3))
#define ZEND_TYPE_IS_CODE(t) \
- (((t) > Z_L(1)) && ((t) <= Z_L(0x1ff)))
+ (((t) > Z_L(0x3)) && ((t) <= Z_L(0x3ff)))
#define ZEND_TYPE_IS_CLASS(t) \
- ((t) > Z_L(0x1ff))
+ ((t) > Z_L(0x3ff))
+
+#define ZEND_TYPE_IS_CE(t) \
+ (((t) & Z_L(0x2)) != 0)
+
+#define ZEND_TYPE_IS_NAME(t) \
+ (ZEND_TYPE_IS_CLASS(t) && !ZEND_TYPE_IS_CE(t))
#define ZEND_TYPE_NAME(t) \
((zend_string*)((t) & ~Z_L(0x3)))
@@ -137,16 +145,22 @@ typedef uintptr_t zend_type;
((zend_class_entry*)((t) & ~Z_L(0x3)))
#define ZEND_TYPE_CODE(t) \
- ((t) >> Z_L(1))
+ ((t) >> Z_L(2))
#define ZEND_TYPE_ALLOW_NULL(t) \
(((t) & Z_L(0x1)) != 0)
+#define ZEND_TYPE_WITHOUT_NULL(t) \
+ ((t) & ~Z_L(0x1))
+
#define ZEND_TYPE_ENCODE(code, allow_null) \
- (((code) << Z_L(1)) | ((allow_null) ? Z_L(0x1) : Z_L(0x0)))
+ (((code) << Z_L(2)) | ((allow_null) ? Z_L(0x1) : Z_L(0x0)))
+
+#define ZEND_TYPE_ENCODE_CE(ce, allow_null) \
+ (((uintptr_t)(ce)) | ((allow_null) ? Z_L(0x3) : Z_L(0x2)))
#define ZEND_TYPE_ENCODE_CLASS(class_name, allow_null) \
- (((uintptr_t)(class_name)) | ((allow_null) ? Z_L(0x1) : Z_L(0)))
+ (((uintptr_t)(class_name)) | ((allow_null) ? Z_L(0x1) : Z_L(0x0)))
#define ZEND_TYPE_ENCODE_CLASS_CONST_0(class_name) \
((zend_type) class_name)
@@ -187,7 +201,6 @@ struct _zval_struct {
zend_uchar type, /* active type */
zend_uchar type_flags,
union {
- uint16_t call_info; /* call info for EX(This) */
uint16_t extra; /* not further specified */
} u)
} v;
@@ -369,9 +382,25 @@ struct _zend_resource {
void *ptr;
};
+typedef struct {
+ size_t num;
+ size_t num_allocated;
+ struct _zend_property_info *ptr[1];
+} zend_property_info_list;
+
+typedef union {
+ struct _zend_property_info *ptr;
+ uintptr_t list;
+} zend_property_info_source_list;
+
+#define ZEND_PROPERTY_INFO_SOURCE_FROM_LIST(list) (0x1 | (uintptr_t) (list))
+#define ZEND_PROPERTY_INFO_SOURCE_TO_LIST(list) ((zend_property_info_list *) ((list) & ~0x1))
+#define ZEND_PROPERTY_INFO_SOURCE_IS_LIST(list) ((list) & 0x1)
+
struct _zend_reference {
- zend_refcounted_h gc;
- zval val;
+ zend_refcounted_h gc;
+ zval val;
+ zend_property_info_source_list sources;
};
struct _zend_ast_ref {
@@ -398,6 +427,7 @@ struct _zend_ast_ref {
/* internal types */
#define IS_INDIRECT 13
#define IS_PTR 14
+#define IS_ALIAS_PTR 15
#define _IS_ERROR 15
/* fake types used only for type hinting (Z_TYPE(zv) can not use them) */
@@ -524,9 +554,11 @@ static zend_always_inline uint32_t zval_gc_info(uint32_t gc_type_info) {
/* zval.u1.v.type_flags */
#define IS_TYPE_REFCOUNTED (1<<0)
+#define IS_TYPE_COLLECTABLE (1<<1)
#if 1
/* This optimized version assumes that we have a single "type_flag" */
+/* IS_TYPE_COLLECTABLE may be used only with IS_TYPE_REFCOUNTED */
# 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)
@@ -536,8 +568,8 @@ static zend_always_inline uint32_t zval_gc_info(uint32_t gc_type_info) {
#define IS_INTERNED_STRING_EX IS_STRING
#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_ARRAY_EX (IS_ARRAY | (IS_TYPE_REFCOUNTED << Z_TYPE_FLAGS_SHIFT) | (IS_TYPE_COLLECTABLE << Z_TYPE_FLAGS_SHIFT))
+#define IS_OBJECT_EX (IS_OBJECT | (IS_TYPE_REFCOUNTED << Z_TYPE_FLAGS_SHIFT) | (IS_TYPE_COLLECTABLE << 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))
@@ -547,12 +579,14 @@ static zend_always_inline uint32_t zval_gc_info(uint32_t gc_type_info) {
#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 */
+#define IS_STR_VALID_UTF8 (1<<9) /* valid UTF-8 according to PCRE */
/* array flags */
#define IS_ARRAY_IMMUTABLE GC_IMMUTABLE
#define IS_ARRAY_PERSISTENT GC_PERSISTENT
/* object flags (zval.value->gc.u.flags) */
+#define IS_OBJ_WEAKLY_REFERENCED GC_PERSISTENT
#define IS_OBJ_DESTRUCTOR_CALLED (1<<8)
#define IS_OBJ_FREE_CALLED (1<<9)
@@ -591,12 +625,16 @@ static zend_always_inline uint32_t zval_gc_info(uint32_t gc_type_info) {
#if 1
/* This optimized version assumes that we have a single "type_flag" */
+/* IS_TYPE_COLLECTABLE may be used only with IS_TYPE_REFCOUNTED */
#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_COLLECTABLE(zval) ((Z_TYPE_FLAGS(zval) & IS_TYPE_COLLECTABLE) != 0)
+#define Z_COLLECTABLE_P(zval_p) Z_COLLECTABLE(*(zval_p))
+
/* 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))
@@ -678,9 +716,6 @@ static zend_always_inline uint32_t zval_gc_info(uint32_t gc_type_info) {
#define Z_OBJPROP(zval) Z_OBJ_HT((zval))->get_properties(&(zval))
#define Z_OBJPROP_P(zval_p) Z_OBJPROP(*(zval_p))
-#define Z_OBJDEBUG(zval,tmp) (Z_OBJ_HANDLER((zval),get_debug_info)?Z_OBJ_HANDLER((zval),get_debug_info)(&(zval),&tmp):(tmp=0,Z_OBJ_HANDLER((zval),get_properties)?Z_OBJPROP(zval):NULL))
-#define Z_OBJDEBUG_P(zval_p,tmp) Z_OBJDEBUG(*(zval_p), tmp)
-
#define Z_RES(zval) (zval).value.res
#define Z_RES_P(zval_p) Z_RES(*zval_p)
@@ -864,6 +899,7 @@ static zend_always_inline uint32_t zval_gc_info(uint32_t gc_type_info) {
(zend_reference *) emalloc(sizeof(zend_reference)); \
GC_SET_REFCOUNT(_ref, 1); \
GC_TYPE_INFO(_ref) = IS_REFERENCE; \
+ _ref->sources.ptr = NULL; \
Z_REF_P(z) = _ref; \
Z_TYPE_INFO_P(z) = IS_REFERENCE_EX; \
} while (0)
@@ -874,6 +910,7 @@ static zend_always_inline uint32_t zval_gc_info(uint32_t gc_type_info) {
GC_SET_REFCOUNT(_ref, 1); \
GC_TYPE_INFO(_ref) = IS_REFERENCE; \
ZVAL_COPY_VALUE(&_ref->val, r); \
+ _ref->sources.ptr = NULL; \
Z_REF_P(z) = _ref; \
Z_TYPE_INFO_P(z) = IS_REFERENCE_EX; \
} while (0)
@@ -885,6 +922,7 @@ static zend_always_inline uint32_t zval_gc_info(uint32_t gc_type_info) {
GC_SET_REFCOUNT(_ref, (refcount)); \
GC_TYPE_INFO(_ref) = IS_REFERENCE; \
ZVAL_COPY_VALUE(&_ref->val, _z); \
+ _ref->sources.ptr = NULL; \
Z_REF_P(_z) = _ref; \
Z_TYPE_INFO_P(_z) = IS_REFERENCE_EX; \
} while (0)
@@ -896,6 +934,7 @@ static zend_always_inline uint32_t zval_gc_info(uint32_t gc_type_info) {
GC_TYPE_INFO(_ref) = IS_REFERENCE | \
(GC_PERSISTENT << GC_FLAGS_SHIFT); \
ZVAL_COPY_VALUE(&_ref->val, r); \
+ _ref->sources.ptr = NULL; \
Z_REF_P(z) = _ref; \
Z_TYPE_INFO_P(z) = IS_REFERENCE_EX; \
} while (0)
@@ -926,6 +965,11 @@ static zend_always_inline uint32_t zval_gc_info(uint32_t gc_type_info) {
Z_TYPE_INFO_P(z) = IS_PTR; \
} while (0)
+#define ZVAL_ALIAS_PTR(z, p) do { \
+ Z_PTR_P(z) = (p); \
+ Z_TYPE_INFO_P(z) = IS_ALIAS_PTR; \
+ } while (0)
+
#define ZVAL_ERROR(z) do { \
Z_TYPE_INFO_P(z) = _IS_ERROR; \
} while (0)
@@ -962,7 +1006,7 @@ static zend_always_inline uint32_t zval_gc_info(uint32_t gc_type_info) {
#if ZEND_RC_DEBUG
extern ZEND_API zend_bool zend_rc_debug;
# define ZEND_RC_MOD_CHECK(p) do { \
- if (zend_rc_debug) { \
+ if (zend_rc_debug && zval_gc_type((p)->u.type_info) != IS_OBJECT) { \
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); \
} \
@@ -992,6 +1036,7 @@ static zend_always_inline uint32_t zend_gc_addref(zend_refcounted_h *p) {
}
static zend_always_inline uint32_t zend_gc_delref(zend_refcounted_h *p) {
+ ZEND_ASSERT(p->refcount > 0);
ZEND_RC_MOD_CHECK(p);
return --(p->refcount);
}
@@ -1221,14 +1266,18 @@ static zend_always_inline uint32_t zval_delref_p(zval* pz) {
} \
} while (0)
-#endif /* ZEND_TYPES_H */
+/* Properties store a flag distinguishing unset and unintialized properties
+ * (both use IS_UNDEF type) in the Z_EXTRA space. As such we also need to copy
+ * the Z_EXTRA space when copying property default values etc. We define separate
+ * macros for this purpose, so this workaround is easier to remove in the future. */
+#define IS_PROP_UNINIT 1
+#define Z_PROP_FLAG_P(z) Z_EXTRA_P(z)
+#define ZVAL_COPY_VALUE_PROP(z, v) \
+ do { *(z) = *(v); } while (0)
+#define ZVAL_COPY_PROP(z, v) \
+ do { ZVAL_COPY(z, v); Z_PROP_FLAG_P(z) = Z_PROP_FLAG_P(v); } while (0)
+#define ZVAL_COPY_OR_DUP_PROP(z, v) \
+ do { ZVAL_COPY_OR_DUP(z, v); Z_PROP_FLAG_P(z) = Z_PROP_FLAG_P(v); } while (0)
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * indent-tabs-mode: t
- * End:
- * vim600: sw=4 ts=4 fdm=marker
- * vim<600: sw=4 ts=4
- */
+
+#endif /* ZEND_TYPES_H */
diff --git a/Zend/zend_variables.c b/Zend/zend_variables.c
index c2594274dd..810866a1be 100644
--- a/Zend/zend_variables.c
+++ b/Zend/zend_variables.c
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| Zend Engine |
+----------------------------------------------------------------------+
- | Copyright (c) 1998-2018 Zend Technologies Ltd. (http://www.zend.com) |
+ | Copyright (c) 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 |
@@ -26,21 +26,13 @@
#include "zend_constants.h"
#include "zend_list.h"
-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);
+static void ZEND_FASTCALL zend_string_destroy(zend_string *str);
#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
+# define zend_string_destroy _efree
#endif
+static void ZEND_FASTCALL zend_reference_destroy(zend_reference *ref);
+static void ZEND_FASTCALL zend_empty_destroy(zend_reference *ref);
typedef void (ZEND_FASTCALL *zend_rc_dtor_func_t)(zend_refcounted *p);
@@ -52,11 +44,11 @@ static const zend_rc_dtor_func_t zend_rc_dtor_func[] = {
/* 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_ARRAY */ (zend_rc_dtor_func_t)zend_array_destroy,
+ /* IS_OBJECT */ (zend_rc_dtor_func_t)zend_objects_store_del,
+ /* IS_RESOURCE */ (zend_rc_dtor_func_t)zend_list_free,
/* IS_REFERENCE */ (zend_rc_dtor_func_t)zend_reference_destroy,
- /* IS_CONSTANT_AST */ (zend_rc_dtor_func_t)zend_ast_ref_destroy_wrapper
+ /* IS_CONSTANT_AST */ (zend_rc_dtor_func_t)zend_ast_ref_destroy
};
ZEND_API void ZEND_FASTCALL rc_dtor_func(zend_refcounted *p)
@@ -65,6 +57,7 @@ ZEND_API void ZEND_FASTCALL rc_dtor_func(zend_refcounted *p)
zend_rc_dtor_func[GC_TYPE(p)](p);
}
+#if ZEND_DEBUG
static void ZEND_FASTCALL zend_string_destroy(zend_string *str)
{
CHECK_ZVAL_STRING(str);
@@ -73,10 +66,12 @@ static void ZEND_FASTCALL zend_string_destroy(zend_string *str)
ZEND_ASSERT(!(GC_FLAGS(str) & IS_STR_PERSISTENT));
efree(str);
}
+#endif
static void ZEND_FASTCALL zend_reference_destroy(zend_reference *ref)
{
- i_zval_ptr_dtor(&ref->val ZEND_FILE_LINE_CC);
+ ZEND_ASSERT(!ZEND_REF_HAS_TYPE_SOURCES(ref));
+ i_zval_ptr_dtor(&ref->val);
efree_size(ref, sizeof(zend_reference));
}
@@ -84,31 +79,9 @@ static void ZEND_FASTCALL zend_empty_destroy(zend_reference *ref)
{
}
-#if ZEND_DEBUG
-static void ZEND_FASTCALL zend_array_destroy_wrapper(zend_array *arr)
-{
- zend_array_destroy(arr);
-}
-
-static void ZEND_FASTCALL zend_object_destroy_wrapper(zend_object *obj)
-{
- 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);
+ i_zval_ptr_dtor(zval_ptr);
}
/* }}} */
@@ -158,11 +131,3 @@ ZEND_API void ZEND_FASTCALL zval_copy_ctor_func(zval *zvalue)
ZVAL_NEW_STR(zvalue, zend_string_dup(Z_STR_P(zvalue), 0));
}
}
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * indent-tabs-mode: t
- * End:
- */
diff --git a/Zend/zend_variables.h b/Zend/zend_variables.h
index 665dbbd760..bdee8b1879 100644
--- a/Zend/zend_variables.h
+++ b/Zend/zend_variables.h
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| Zend Engine |
+----------------------------------------------------------------------+
- | Copyright (c) 1998-2018 Zend Technologies Ltd. (http://www.zend.com) |
+ | Copyright (c) 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 |
@@ -36,7 +36,7 @@ static zend_always_inline void zval_ptr_dtor_nogc(zval *zval_ptr)
}
}
-static zend_always_inline void i_zval_ptr_dtor(zval *zval_ptr ZEND_FILE_LINE_DC)
+static zend_always_inline void i_zval_ptr_dtor(zval *zval_ptr)
{
if (Z_REFCOUNTED_P(zval_ptr)) {
zend_refcounted *ref = Z_COUNTED_P(zval_ptr);
@@ -94,13 +94,3 @@ END_EXTERN_C()
#define ZVAL_INTERNAL_PTR_DTOR zval_internal_ptr_dtor
#endif
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * indent-tabs-mode: t
- * End:
- * vim600: sw=4 ts=4 fdm=marker
- * vim<600: sw=4 ts=4
- */
diff --git a/Zend/zend_virtual_cwd.c b/Zend/zend_virtual_cwd.c
index 7c5ac825c5..22b92728bc 100644
--- a/Zend/zend_virtual_cwd.c
+++ b/Zend/zend_virtual_cwd.c
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| PHP Version 7 |
+----------------------------------------------------------------------+
- | Copyright (c) 1997-2018 The PHP Group |
+ | Copyright (c) The PHP Group |
+----------------------------------------------------------------------+
| This source file is subject to version 3.01 of the PHP license, |
| that is bundled with this package in the file LICENSE, and is |
@@ -70,6 +70,9 @@
# ifndef VOLUME_NAME_DOS
# define VOLUME_NAME_DOS 0x0
# endif
+
+# include <winioctl.h>
+# include <winnt.h>
#endif
#ifndef HAVE_REALPATH
@@ -87,6 +90,7 @@ MUTEX_T cwd_mutex;
#ifdef ZTS
ts_rsrc_id cwd_globals_id;
+size_t cwd_globals_offset;
#else
virtual_cwd_globals cwd_globals;
#endif
@@ -120,259 +124,6 @@ static cwd_state main_cwd_state; /* True global */
# define CWD_STATE_FREE_ERR(state) CWD_STATE_FREE(state)
#endif
-#ifdef ZEND_WIN32
-
-#ifdef CTL_CODE
-#undef CTL_CODE
-#endif
-#define CTL_CODE(DeviceType,Function,Method,Access) (((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method))
-#define FILE_DEVICE_FILE_SYSTEM 0x00000009
-#define METHOD_BUFFERED 0
-#define FILE_ANY_ACCESS 0
-#define FSCTL_GET_REPARSE_POINT CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 42, METHOD_BUFFERED, FILE_ANY_ACCESS)
-#define MAXIMUM_REPARSE_DATA_BUFFER_SIZE ( 16 * 1024 )
-
-typedef struct {
- unsigned long ReparseTag;
- unsigned short ReparseDataLength;
- unsigned short Reserved;
- union {
- struct {
- unsigned short SubstituteNameOffset;
- unsigned short SubstituteNameLength;
- unsigned short PrintNameOffset;
- unsigned short PrintNameLength;
- unsigned long Flags;
- wchar_t ReparseTarget[1];
- } SymbolicLinkReparseBuffer;
- struct {
- unsigned short SubstituteNameOffset;
- unsigned short SubstituteNameLength;
- unsigned short PrintNameOffset;
- unsigned short PrintNameLength;
- wchar_t ReparseTarget[1];
- } MountPointReparseBuffer;
- struct {
- unsigned char ReparseTarget[1];
- } GenericReparseBuffer;
- };
-} REPARSE_DATA_BUFFER, *PREPARSE_DATA_BUFFER;
-
-#define SECS_BETWEEN_EPOCHS (__int64)11644473600
-#define SECS_TO_100NS (__int64)10000000
-static inline time_t FileTimeToUnixTime(const FILETIME *FileTime)
-{
- __int64 UnixTime;
- SYSTEMTIME SystemTime;
- FileTimeToSystemTime(FileTime, &SystemTime);
-
- UnixTime = ((__int64)FileTime->dwHighDateTime << 32) +
- FileTime->dwLowDateTime;
-
- UnixTime -= (SECS_BETWEEN_EPOCHS * SECS_TO_100NS);
-
- UnixTime /= SECS_TO_100NS; /* now convert to seconds */
-
- if ((time_t)UnixTime != UnixTime) {
- UnixTime = 0;
- }
- return (time_t)UnixTime;
-}
-
-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;
- char *ret;
-
- if (!linkw) {
- return -1;
- }
-
- if (!target_len) {
- free(linkw);
- return -1;
- }
-
- hFile = CreateFileW(linkw, // file to open
- 0, // query possible attributes
- PHP_WIN32_IOUTIL_DEFAULT_SHARE_MODE,
- NULL, // default security
- OPEN_EXISTING, // existing file only
- FILE_FLAG_BACKUP_SEMANTICS, // normal file
- NULL); // no attr. template
- if( hFile == INVALID_HANDLE_VALUE) {
- free(linkw);
- return -1;
- }
-
- /* Despite MSDN has documented it won't to, the length returned by
- GetFinalPathNameByHandleA includes the length of the
- null terminator. This behavior is at least reproducible
- with VS2012 and earlier, and seems not to be fixed till
- now. Thus, correcting target_len so it's suddenly don't
- overflown. */
- targetw_len = GetFinalPathNameByHandleW(hFile, targetw, MAXPATHLEN, VOLUME_NAME_DOS);
- if(targetw_len >= target_len || targetw_len >= MAXPATHLEN || targetw_len == 0) {
- free(linkw);
- CloseHandle(hFile);
- return -1;
- }
-
- if(targetw_len > 4) {
- /* Skip first 4 characters if they are "\\?\" */
- if(targetw[0] == L'\\' && targetw[1] == L'\\' && targetw[2] == L'?' && targetw[3] == L'\\') {
- offset = 4;
-
- /* \\?\UNC\ */
- if (targetw_len > 7 && targetw[4] == L'U' && targetw[5] == L'N' && targetw[6] == L'C') {
- offset += 2;
- targetw[offset] = L'\\';
- }
- }
- }
-
- ret = php_win32_ioutil_conv_w_to_any(targetw + offset, targetw_len - offset, &ret_len);
- if (!ret || ret_len >= MAXPATHLEN) {
- CloseHandle(hFile);
- free(linkw);
- free(ret);
- return -1;
- }
- memcpy(target, ret, ret_len + 1);
-
- free(ret);
- CloseHandle(hFile);
- free(linkw);
-
- return (ssize_t)ret_len;
-}
-/* }}} */
-
-CWD_API int php_sys_stat_ex(const char *path, zend_stat_t *buf, int lstat) /* {{{ */
-{
- WIN32_FILE_ATTRIBUTE_DATA data;
- LARGE_INTEGER t;
- size_t pathw_len = 0;
- ALLOCA_FLAG(use_heap_large)
- wchar_t *pathw = php_win32_ioutil_conv_any_to_w(path, PHP_WIN32_CP_IGNORE_LEN, &pathw_len);
-
- if (!pathw) {
- return -1;
- }
-
- if (!GetFileAttributesExW(pathw, GetFileExInfoStandard, &data)) {
- int ret;
-#if ZEND_ENABLE_ZVAL_LONG64
- ret = _wstat64(pathw, buf);
-#else
- ret = _wstat(pathw, (struct _stat32 *)buf);
-#endif
- free(pathw);
-
- return ret;
- }
-
- if (pathw_len >= 1 && pathw[1] == L':') {
- if (pathw[0] >= L'A' && pathw[0] <= L'Z') {
- buf->st_dev = buf->st_rdev = pathw[0] - L'A';
- } else {
- buf->st_dev = buf->st_rdev = pathw[0] - L'a';
- }
- } else if (PHP_WIN32_IOUTIL_IS_UNC(pathw, pathw_len)) {
- buf->st_dev = buf->st_rdev = 0;
- } else {
- wchar_t cur_path[MAXPATHLEN+1];
-
- if (NULL != _wgetcwd(cur_path, sizeof(cur_path)/sizeof(wchar_t))) {
- if (cur_path[1] == L':') {
- if (pathw[0] >= L'A' && pathw[0] <= L'Z') {
- buf->st_dev = buf->st_rdev = pathw[0] - L'A';
- } else {
- buf->st_dev = buf->st_rdev = pathw[0] - L'a';
- }
- } else {
- buf->st_dev = buf->st_rdev = -1;
- }
- } else {
- buf->st_dev = buf->st_rdev = -1;
- }
- }
-
- buf->st_uid = buf->st_gid = buf->st_ino = 0;
-
- if (lstat && data.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT) {
- /* File is a reparse point. Get the target */
- HANDLE hLink = NULL;
- REPARSE_DATA_BUFFER * pbuffer;
- DWORD retlength = 0;
-
- 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;
- }
-
- pbuffer = (REPARSE_DATA_BUFFER *)do_alloca(MAXIMUM_REPARSE_DATA_BUFFER_SIZE, use_heap_large);
- if(!DeviceIoControl(hLink, FSCTL_GET_REPARSE_POINT, NULL, 0, pbuffer, MAXIMUM_REPARSE_DATA_BUFFER_SIZE, &retlength, NULL)) {
- free_alloca(pbuffer, use_heap_large);
- CloseHandle(hLink);
- free(pathw);
- return -1;
- }
-
- CloseHandle(hLink);
-
- if(pbuffer->ReparseTag == IO_REPARSE_TAG_SYMLINK) {
- buf->st_mode = S_IFLNK;
- buf->st_mode |= (data.dwFileAttributes & FILE_ATTRIBUTE_READONLY) ? (S_IREAD|(S_IREAD>>3)|(S_IREAD>>6)) : (S_IREAD|(S_IREAD>>3)|(S_IREAD>>6)|S_IWRITE|(S_IWRITE>>3)|(S_IWRITE>>6));
- }
-
-#if 0 /* Not used yet */
- else if(pbuffer->ReparseTag == IO_REPARSE_TAG_MOUNT_POINT) {
- buf->st_mode |=;
- }
-#endif
- free_alloca(pbuffer, use_heap_large);
- } else {
- buf->st_mode = (data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ? (S_IFDIR|S_IEXEC|(S_IEXEC>>3)|(S_IEXEC>>6)) : S_IFREG;
- buf->st_mode |= (data.dwFileAttributes & FILE_ATTRIBUTE_READONLY) ? (S_IREAD|(S_IREAD>>3)|(S_IREAD>>6)) : (S_IREAD|(S_IREAD>>3)|(S_IREAD>>6)|S_IWRITE|(S_IWRITE>>3)|(S_IWRITE>>6));
- }
-
- if ((data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == 0) {
- if (pathw_len >= 4 && pathw[pathw_len-4] == L'.') {
- if (_wcsnicmp(pathw+pathw_len-3, L"exe", 3) == 0 ||
- _wcsnicmp(pathw+pathw_len-3, L"com", 3) == 0 ||
- _wcsnicmp(pathw+pathw_len-3, L"bat", 3) == 0 ||
- _wcsnicmp(pathw+pathw_len-3, L"cmd", 3) == 0) {
- buf->st_mode |= (S_IEXEC|(S_IEXEC>>3)|(S_IEXEC>>6));
- }
- }
- }
-
- buf->st_nlink = 1;
- t.HighPart = data.nFileSizeHigh;
- t.LowPart = data.nFileSizeLow;
- /* It's an overflow on 32 bit, however it won't fix as long
- as zend_long is 32 bit. */
- buf->st_size = (zend_long)t.QuadPart;
- buf->st_atime = FileTimeToUnixTime(&data.ftLastAccessTime);
- buf->st_ctime = FileTimeToUnixTime(&data.ftCreationTime);
- buf->st_mtime = FileTimeToUnixTime(&data.ftLastWriteTime);
-
- free(pathw);
-
- return 0;
-}
-/* }}} */
-#endif
-
static int php_is_dir_ok(const cwd_state *state) /* {{{ */
{
zend_stat_t buf;
@@ -445,7 +196,7 @@ CWD_API void virtual_cwd_startup(void) /* {{{ */
{
virtual_cwd_main_cwd_init(0);
#ifdef ZTS
- ts_allocate_id(&cwd_globals_id, sizeof(virtual_cwd_globals), (ts_allocate_ctor) cwd_globals_ctor, (ts_allocate_dtor) cwd_globals_dtor);
+ ts_allocate_fast_id(&cwd_globals_id, &cwd_globals_offset, sizeof(virtual_cwd_globals), (ts_allocate_ctor) cwd_globals_ctor, (ts_allocate_dtor) cwd_globals_dtor);
#else
cwd_globals_ctor(&cwd_globals);
#endif
@@ -875,7 +626,7 @@ retry_reparse_tag_cloud:
) {
/* File is a reparse point. Get the target */
HANDLE hLink = NULL;
- REPARSE_DATA_BUFFER * pbuffer;
+ PHP_WIN32_IOUTIL_REPARSE_DATA_BUFFER * pbuffer;
DWORD retlength = 0;
size_t bufindex = 0;
uint8_t isabsolute = 0;
@@ -908,7 +659,7 @@ retry_reparse_tag_cloud:
return (size_t)-1;
}
- pbuffer = (REPARSE_DATA_BUFFER *)do_alloca(MAXIMUM_REPARSE_DATA_BUFFER_SIZE, use_heap_large);
+ pbuffer = (PHP_WIN32_IOUTIL_REPARSE_DATA_BUFFER *)do_alloca(MAXIMUM_REPARSE_DATA_BUFFER_SIZE, use_heap_large);
if (pbuffer == NULL) {
CloseHandle(hLink);
free_alloca(tmp, use_heap);
@@ -941,7 +692,7 @@ retry_reparse_tag_cloud:
if(pbuffer->ReparseTag == IO_REPARSE_TAG_SYMLINK) {
reparsetarget = pbuffer->SymbolicLinkReparseBuffer.ReparseTarget;
- isabsolute = (pbuffer->SymbolicLinkReparseBuffer.Flags == 0) ? 1 : 0;
+ isabsolute = pbuffer->SymbolicLinkReparseBuffer.Flags == 0;
#if VIRTUAL_CWD_DEBUG
printname = php_win32_ioutil_w_to_any(reparsetarget + pbuffer->MountPointReparseBuffer.PrintNameOffset / sizeof(WCHAR));
if (!printname) {
@@ -1265,7 +1016,7 @@ CWD_API int virtual_file_ex(cwd_state *state, const char *path, verify_path_func
if (!path_length || path_length >= MAXPATHLEN-1) {
#ifdef ZEND_WIN32
- _set_errno(EINVAL);
+ SET_ERRNO_FROM_WIN32_CODE(ERROR_INVALID_PARAMETER);
#else
errno = EINVAL;
#endif
@@ -1983,10 +1734,3 @@ CWD_API char *tsrm_realpath(const char *path, char *real_path) /* {{{ */
}
}
/* }}} */
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * End:
- */
diff --git a/Zend/zend_virtual_cwd.h b/Zend/zend_virtual_cwd.h
index 6799dba630..574bee992b 100644
--- a/Zend/zend_virtual_cwd.h
+++ b/Zend/zend_virtual_cwd.h
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| PHP Version 7 |
+----------------------------------------------------------------------+
- | Copyright (c) 1997-2018 The PHP Group |
+ | Copyright (c) The PHP Group |
+----------------------------------------------------------------------+
| This source file is subject to version 3.01 of the PHP license, |
| that is bundled with this package in the file LICENSE, and is |
@@ -22,7 +22,6 @@
#define VIRTUAL_CWD_H
#include "TSRM.h"
-#include "tsrm_config_common.h"
#include <sys/types.h>
#include <sys/stat.h>
@@ -32,8 +31,24 @@
#include <utime.h>
#endif
-#ifdef HAVE_STDARG_H
#include <stdarg.h>
+#include <limits.h>
+
+#if HAVE_SYS_PARAM_H
+# include <sys/param.h>
+#endif
+
+#ifndef MAXPATHLEN
+# if _WIN32
+# include "win32/ioutil.h"
+# define MAXPATHLEN PHP_WIN32_IOUTIL_MAXPATHLEN
+# elif PATH_MAX
+# define MAXPATHLEN PATH_MAX
+# elif defined(MAX_PATH)
+# define MAXPATHLEN MAX_PATH
+# else
+# define MAXPATHLEN 256
+# endif
#endif
#ifdef ZTS
@@ -51,7 +66,7 @@
#endif
#ifdef ZEND_WIN32
-#include "readdir.h"
+#include "win32/readdir.h"
#include <sys/utime.h>
#include "win32/ioutil.h"
/* mode_t isn't defined on Windows */
@@ -116,15 +131,21 @@ typedef unsigned short mode_t;
#endif
#ifdef ZEND_WIN32
-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 ssize_t php_sys_readlink(const char *link, char *target, size_t target_len);
+# define php_sys_stat_ex php_win32_ioutil_stat_ex
+# define php_sys_stat php_win32_ioutil_stat
+# define php_sys_lstat php_win32_ioutil_lstat
+# define php_sys_fstat php_win32_ioutil_fstat
+# define php_sys_readlink php_win32_ioutil_readlink
+# define php_sys_symlink php_win32_ioutil_symlink
+# define php_sys_link php_win32_ioutil_link
#else
# define php_sys_stat stat
# define php_sys_lstat lstat
+# define php_sys_fstat fstat
# ifdef HAVE_SYMLINK
# define php_sys_readlink(link, target, target_len) readlink(link, target, target_len)
+# define php_sys_symlink symlink
+# define php_sys_link link
# endif
#endif
@@ -208,7 +229,8 @@ typedef struct _virtual_cwd_globals {
#ifdef ZTS
extern ts_rsrc_id cwd_globals_id;
-# define CWDG(v) ZEND_TSRMG(cwd_globals_id, virtual_cwd_globals *, v)
+extern size_t cwd_globals_offset;
+# define CWDG(v) ZEND_TSRMG_FAST(cwd_globals_offset, virtual_cwd_globals *, v)
#else
extern virtual_cwd_globals cwd_globals;
# define CWDG(v) (cwd_globals.v)
@@ -361,13 +383,3 @@ extern void virtual_cwd_main_cwd_init(uint8_t);
#endif
#endif /* VIRTUAL_CWD_H */
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * indent-tabs-mode: t
- * End:
- * vim600: sw=4 ts=4 fdm=marker
- * vim<600: sw=4 ts=4
- */
diff --git a/Zend/zend_vm.h b/Zend/zend_vm.h
index f14267e828..f246e7fb77 100644
--- a/Zend/zend_vm.h
+++ b/Zend/zend_vm.h
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| Zend Engine |
+----------------------------------------------------------------------+
- | Copyright (c) 1998-2018 Zend Technologies Ltd. (http://www.zend.com) |
+ | Copyright (c) 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 |
@@ -38,13 +38,3 @@ END_EXTERN_C()
#define ZEND_VM_SET_OPCODE_HANDLER(opline) zend_vm_set_opcode_handler(opline)
#endif
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * indent-tabs-mode: t
- * End:
- * vim600: sw=4 ts=4 fdm=marker
- * vim<600: sw=4 ts=4
- */
diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h
index 9c46476b6a..827548504c 100644
--- a/Zend/zend_vm_def.h
+++ b/Zend/zend_vm_def.h
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| Zend Engine |
+----------------------------------------------------------------------+
- | Copyright (c) 1998-2018 Zend Technologies Ltd. (http://www.zend.com) |
+ | Copyright (c) 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 |
@@ -23,101 +23,159 @@
* php zend_vm_gen.php
*/
-ZEND_VM_COLD_CONSTCONST_HANDLER(1, ZEND_ADD, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
+ZEND_VM_HELPER(zend_add_helper, ANY, ANY, zval *op_1, zval *op_2)
+{
+ USE_OPLINE
+
+ SAVE_OPLINE();
+ if (UNEXPECTED(Z_TYPE_INFO_P(op_1) == IS_UNDEF)) {
+ op_1 = ZVAL_UNDEFINED_OP1();
+ }
+ if (UNEXPECTED(Z_TYPE_INFO_P(op_2) == IS_UNDEF)) {
+ op_2 = ZVAL_UNDEFINED_OP2();
+ }
+ add_function(EX_VAR(opline->result.var), op_1, op_2);
+ if (OP1_TYPE & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_nogc(op_1);
+ }
+ if (OP2_TYPE & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_nogc(op_2);
+ }
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+}
+
+ZEND_VM_HOT_NOCONSTCONST_HANDLER(1, ZEND_ADD, CONST|TMPVARCV, CONST|TMPVARCV)
{
USE_OPLINE
zend_free_op free_op1, free_op2;
zval *op1, *op2, *result;
+ double d1, d2;
op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
op2 = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
- if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (ZEND_VM_SPEC && OP1_TYPE == IS_CONST && OP2_TYPE == IS_CONST) {
+ /* pass */
+ } else 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();
+ d1 = (double)Z_LVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+ ZEND_VM_C_GOTO(add_double);
}
} else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+ZEND_VM_C_LABEL(add_double):
result = EX_VAR(opline->result.var);
- ZVAL_DOUBLE(result, Z_DVAL_P(op1) + Z_DVAL_P(op2));
+ ZVAL_DOUBLE(result, d1 + d2);
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();
+ d1 = Z_DVAL_P(op1);
+ d2 = (double)Z_LVAL_P(op2);
+ ZEND_VM_C_GOTO(add_double);
}
}
+ ZEND_VM_DISPATCH_TO_HELPER(zend_add_helper, op_1, op1, op_2, op2);
+}
+
+ZEND_VM_HELPER(zend_sub_helper, ANY, ANY, zval *op_1, zval *op_2)
+{
+ USE_OPLINE
+
SAVE_OPLINE();
- if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
- op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
+ if (UNEXPECTED(Z_TYPE_INFO_P(op_1) == IS_UNDEF)) {
+ op_1 = ZVAL_UNDEFINED_OP1();
}
- if (OP2_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
- op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
+ if (UNEXPECTED(Z_TYPE_INFO_P(op_2) == IS_UNDEF)) {
+ op_2 = ZVAL_UNDEFINED_OP2();
+ }
+ sub_function(EX_VAR(opline->result.var), op_1, op_2);
+ if (OP1_TYPE & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_nogc(op_1);
+ }
+ if (OP2_TYPE & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_nogc(op_2);
}
- add_function(EX_VAR(opline->result.var), op1, op2);
- FREE_OP1();
- FREE_OP2();
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-ZEND_VM_COLD_CONSTCONST_HANDLER(2, ZEND_SUB, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
+ZEND_VM_HOT_NOCONSTCONST_HANDLER(2, ZEND_SUB, CONST|TMPVARCV, CONST|TMPVARCV)
{
USE_OPLINE
zend_free_op free_op1, free_op2;
zval *op1, *op2, *result;
+ double d1, d2;
op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
op2 = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
- if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (ZEND_VM_SPEC && OP1_TYPE == IS_CONST && OP2_TYPE == IS_CONST) {
+ /* pass */
+ } else 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();
+ d1 = (double)Z_LVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+ ZEND_VM_C_GOTO(sub_double);
}
} else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+ZEND_VM_C_LABEL(sub_double):
result = EX_VAR(opline->result.var);
- ZVAL_DOUBLE(result, Z_DVAL_P(op1) - Z_DVAL_P(op2));
+ ZVAL_DOUBLE(result, d1 - d2);
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();
+ d1 = Z_DVAL_P(op1);
+ d2 = (double)Z_LVAL_P(op2);
+ ZEND_VM_C_GOTO(sub_double);
}
}
+ ZEND_VM_DISPATCH_TO_HELPER(zend_sub_helper, op_1, op1, op_2, op2);
+}
+
+ZEND_VM_HELPER(zend_mul_helper, ANY, ANY, zval *op_1, zval *op_2)
+{
+ USE_OPLINE
+
SAVE_OPLINE();
- if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
- op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
+ if (UNEXPECTED(Z_TYPE_INFO_P(op_1) == IS_UNDEF)) {
+ op_1 = ZVAL_UNDEFINED_OP1();
}
- if (OP2_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
- op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
+ if (UNEXPECTED(Z_TYPE_INFO_P(op_2) == IS_UNDEF)) {
+ op_2 = ZVAL_UNDEFINED_OP2();
+ }
+ mul_function(EX_VAR(opline->result.var), op_1, op_2);
+ if (OP1_TYPE & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_nogc(op_1);
+ }
+ if (OP2_TYPE & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_nogc(op_2);
}
- sub_function(EX_VAR(opline->result.var), op1, op2);
- FREE_OP1();
- FREE_OP2();
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-ZEND_VM_COLD_CONSTCONST_HANDLER(3, ZEND_MUL, CONST|TMPVAR|CV, CONST|TMPVAR|CV, SPEC(COMMUTATIVE))
+ZEND_VM_COLD_CONSTCONST_HANDLER(3, ZEND_MUL, CONST|TMPVARCV, CONST|TMPVARCV, SPEC(COMMUTATIVE))
{
USE_OPLINE
zend_free_op free_op1, free_op2;
zval *op1, *op2, *result;
+ double d1, d2;
op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
op2 = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
- if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (ZEND_VM_SPEC && OP1_TYPE == IS_CONST && OP2_TYPE == IS_CONST) {
+ /* pass */
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
zend_long overflow;
@@ -126,33 +184,26 @@ ZEND_VM_COLD_CONSTCONST_HANDLER(3, ZEND_MUL, CONST|TMPVAR|CV, CONST|TMPVAR|CV, S
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();
+ d1 = (double)Z_LVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+ ZEND_VM_C_GOTO(mul_double);
}
} else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+ZEND_VM_C_LABEL(mul_double):
result = EX_VAR(opline->result.var);
- ZVAL_DOUBLE(result, Z_DVAL_P(op1) * Z_DVAL_P(op2));
+ ZVAL_DOUBLE(result, d1 * d2);
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();
+ d1 = Z_DVAL_P(op1);
+ d2 = (double)Z_LVAL_P(op2);
+ ZEND_VM_C_GOTO(mul_double);
}
}
- SAVE_OPLINE();
- if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
- op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
- }
- if (OP2_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
- op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
- }
- mul_function(EX_VAR(opline->result.var), op1, op2);
- FREE_OP1();
- FREE_OP2();
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+ ZEND_VM_DISPATCH_TO_HELPER(zend_mul_helper, op_1, op1, op_2, op2);
}
ZEND_VM_COLD_CONSTCONST_HANDLER(4, ZEND_DIV, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
@@ -180,7 +231,28 @@ ZEND_VM_COLD_HELPER(zend_mod_by_zero_helper, ANY, ANY)
HANDLE_EXCEPTION();
}
-ZEND_VM_COLD_CONSTCONST_HANDLER(5, ZEND_MOD, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
+ZEND_VM_HELPER(zend_mod_helper, ANY, ANY, zval *op_1, zval *op_2)
+{
+ USE_OPLINE
+
+ SAVE_OPLINE();
+ if (UNEXPECTED(Z_TYPE_INFO_P(op_1) == IS_UNDEF)) {
+ op_1 = ZVAL_UNDEFINED_OP1();
+ }
+ if (UNEXPECTED(Z_TYPE_INFO_P(op_2) == IS_UNDEF)) {
+ op_2 = ZVAL_UNDEFINED_OP2();
+ }
+ mod_function(EX_VAR(opline->result.var), op_1, op_2);
+ if (OP1_TYPE & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_nogc(op_1);
+ }
+ if (OP2_TYPE & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_nogc(op_2);
+ }
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+}
+
+ZEND_VM_COLD_CONSTCONST_HANDLER(5, ZEND_MOD, CONST|TMPVARCV, CONST|TMPVARCV)
{
USE_OPLINE
zend_free_op free_op1, free_op2;
@@ -188,7 +260,9 @@ ZEND_VM_COLD_CONSTCONST_HANDLER(5, ZEND_MOD, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
op2 = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
- if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (ZEND_VM_SPEC && OP1_TYPE == IS_CONST && OP2_TYPE == IS_CONST) {
+ /* pass */
+ } else 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)) {
@@ -203,20 +277,31 @@ ZEND_VM_COLD_CONSTCONST_HANDLER(5, ZEND_MOD, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
}
}
+ ZEND_VM_DISPATCH_TO_HELPER(zend_mod_helper, op_1, op1, op_2, op2);
+}
+
+ZEND_VM_HELPER(zend_shift_left_helper, ANY, ANY, zval *op_1, zval *op_2)
+{
+ USE_OPLINE
+
SAVE_OPLINE();
- if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
- op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
+ if (UNEXPECTED(Z_TYPE_INFO_P(op_1) == IS_UNDEF)) {
+ op_1 = ZVAL_UNDEFINED_OP1();
}
- if (OP2_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
- op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
+ if (UNEXPECTED(Z_TYPE_INFO_P(op_2) == IS_UNDEF)) {
+ op_2 = ZVAL_UNDEFINED_OP2();
+ }
+ shift_left_function(EX_VAR(opline->result.var), op_1, op_2);
+ if (OP1_TYPE & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_nogc(op_1);
+ }
+ if (OP2_TYPE & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_nogc(op_2);
}
- mod_function(EX_VAR(opline->result.var), op1, op2);
- FREE_OP1();
- FREE_OP2();
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-ZEND_VM_COLD_CONSTCONST_HANDLER(6, ZEND_SL, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
+ZEND_VM_COLD_CONSTCONST_HANDLER(6, ZEND_SL, CONST|TMPVARCV, CONST|TMPVARCV)
{
USE_OPLINE
zend_free_op free_op1, free_op2;
@@ -224,27 +309,42 @@ ZEND_VM_COLD_CONSTCONST_HANDLER(6, ZEND_SL, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
op2 = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
- if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)
+ if (ZEND_VM_SPEC && OP1_TYPE == IS_CONST && OP2_TYPE == IS_CONST) {
+ /* pass */
+ } else 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));
+ /* Perform shift on unsigned numbers to get well-defined wrap behavior. */
+ ZVAL_LONG(EX_VAR(opline->result.var),
+ (zend_long) ((zend_ulong) Z_LVAL_P(op1) << Z_LVAL_P(op2)));
ZEND_VM_NEXT_OPCODE();
}
+ ZEND_VM_DISPATCH_TO_HELPER(zend_shift_left_helper, op_1, op1, op_2, op2);
+}
+
+ZEND_VM_HELPER(zend_shift_right_helper, ANY, ANY, zval *op_1, zval *op_2)
+{
+ USE_OPLINE
+
SAVE_OPLINE();
- if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
- op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
+ if (UNEXPECTED(Z_TYPE_INFO_P(op_1) == IS_UNDEF)) {
+ op_1 = ZVAL_UNDEFINED_OP1();
}
- if (OP2_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
- op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
+ if (UNEXPECTED(Z_TYPE_INFO_P(op_2) == IS_UNDEF)) {
+ op_2 = ZVAL_UNDEFINED_OP2();
+ }
+ shift_right_function(EX_VAR(opline->result.var), op_1, op_2);
+ if (OP1_TYPE & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_nogc(op_1);
+ }
+ if (OP2_TYPE & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_nogc(op_2);
}
- shift_left_function(EX_VAR(opline->result.var), op1, op2);
- FREE_OP1();
- FREE_OP2();
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-ZEND_VM_COLD_CONSTCONST_HANDLER(7, ZEND_SR, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
+ZEND_VM_COLD_CONSTCONST_HANDLER(7, ZEND_SR, CONST|TMPVARCV, CONST|TMPVARCV)
{
USE_OPLINE
zend_free_op free_op1, free_op2;
@@ -252,27 +352,19 @@ ZEND_VM_COLD_CONSTCONST_HANDLER(7, ZEND_SR, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
op2 = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
- if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)
+ if (ZEND_VM_SPEC && OP1_TYPE == IS_CONST && OP2_TYPE == IS_CONST) {
+ /* pass */
+ } else 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 (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
- op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
- }
- if (OP2_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
- op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
- }
- shift_right_function(EX_VAR(opline->result.var), op1, op2);
- FREE_OP1();
- FREE_OP2();
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+ ZEND_VM_DISPATCH_TO_HELPER(zend_shift_right_helper, op_1, op1, op_2, op2);
}
-ZEND_VM_COLD_CONSTCONST_HANDLER(166, ZEND_POW, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
+ZEND_VM_COLD_CONSTCONST_HANDLER(12, ZEND_POW, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
{
USE_OPLINE
zend_free_op free_op1, free_op2;
@@ -308,14 +400,18 @@ ZEND_VM_HANDLER(8, ZEND_CONCAT, CONST|TMPVAR|CV, CONST|TMPVAR|CV, SPEC(NO_CONST_
} else {
ZVAL_STR(EX_VAR(opline->result.var), op2_str);
}
- FREE_OP1();
+ if (OP1_TYPE & (IS_TMP_VAR|IS_VAR)) {
+ zend_string_release_ex(op1_str, 0);
+ }
} 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 {
ZVAL_STR(EX_VAR(opline->result.var), op1_str);
}
- FREE_OP2();
+ if (OP2_TYPE & (IS_TMP_VAR|IS_VAR)) {
+ zend_string_release_ex(op2_str, 0);
+ }
} 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);
@@ -323,24 +419,30 @@ ZEND_VM_HANDLER(8, ZEND_CONCAT, CONST|TMPVAR|CV, CONST|TMPVAR|CV, SPEC(NO_CONST_
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();
+ if (OP2_TYPE & (IS_TMP_VAR|IS_VAR)) {
+ zend_string_release_ex(op2_str, 0);
+ }
} 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();
- FREE_OP2();
+ if (OP1_TYPE & (IS_TMP_VAR|IS_VAR)) {
+ zend_string_release_ex(op1_str, 0);
+ }
+ if (OP2_TYPE & (IS_TMP_VAR|IS_VAR)) {
+ zend_string_release_ex(op2_str, 0);
+ }
}
ZEND_VM_NEXT_OPCODE();
} else {
SAVE_OPLINE();
if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
- op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
+ op1 = ZVAL_UNDEFINED_OP1();
}
if (OP2_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
- op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
+ op2 = ZVAL_UNDEFINED_OP2();
}
concat_function(EX_VAR(opline->result.var), op1, op2);
FREE_OP1();
@@ -349,12 +451,12 @@ ZEND_VM_HANDLER(8, ZEND_CONCAT, CONST|TMPVAR|CV, CONST|TMPVAR|CV, SPEC(NO_CONST_
}
}
-ZEND_VM_COLD_CONSTCONST_HANDLER(15, ZEND_IS_IDENTICAL, CONST|TMP|VAR|CV, CONST|TMP|VAR|CV, SPEC(COMMUTATIVE))
+ZEND_VM_COLD_CONSTCONST_HANDLER(16, ZEND_IS_IDENTICAL, CONST|TMP|VAR|CV, CONST|TMP|VAR|CV, SPEC(COMMUTATIVE))
{
USE_OPLINE
zend_free_op free_op1, free_op2;
zval *op1, *op2;
- int result;
+ zend_bool result;
SAVE_OPLINE();
op1 = GET_OP1_ZVAL_PTR_DEREF(BP_VAR_R);
@@ -367,12 +469,12 @@ ZEND_VM_COLD_CONSTCONST_HANDLER(15, ZEND_IS_IDENTICAL, CONST|TMP|VAR|CV, CONST|T
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-ZEND_VM_COLD_CONSTCONST_HANDLER(16, ZEND_IS_NOT_IDENTICAL, CONST|TMP|VAR|CV, CONST|TMP|VAR|CV, SPEC(COMMUTATIVE))
+ZEND_VM_COLD_CONSTCONST_HANDLER(17, ZEND_IS_NOT_IDENTICAL, CONST|TMP|VAR|CV, CONST|TMP|VAR|CV, SPEC(COMMUTATIVE))
{
USE_OPLINE
zend_free_op free_op1, free_op2;
zval *op1, *op2;
- int result;
+ zend_bool result;
SAVE_OPLINE();
op1 = GET_OP1_ZVAL_PTR_DEREF(BP_VAR_R);
@@ -385,220 +487,354 @@ ZEND_VM_COLD_CONSTCONST_HANDLER(16, ZEND_IS_NOT_IDENTICAL, CONST|TMP|VAR|CV, CON
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-ZEND_VM_COLD_CONSTCONST_HANDLER(17, ZEND_IS_EQUAL, CONST|TMPVAR|CV, CONST|TMPVAR|CV, SPEC(COMMUTATIVE))
+ZEND_VM_HELPER(zend_is_equal_helper, ANY, ANY, zval *op_1, zval *op_2)
+{
+ USE_OPLINE
+
+ SAVE_OPLINE();
+ if (UNEXPECTED(Z_TYPE_INFO_P(op_1) == IS_UNDEF)) {
+ op_1 = ZVAL_UNDEFINED_OP1();
+ }
+ if (UNEXPECTED(Z_TYPE_INFO_P(op_2) == IS_UNDEF)) {
+ op_2 = ZVAL_UNDEFINED_OP2();
+ }
+ compare_function(EX_VAR(opline->result.var), op_1, op_2);
+ if (OP1_TYPE & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_nogc(op_1);
+ }
+ if (OP2_TYPE & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_nogc(op_2);
+ }
+ if (UNEXPECTED(EG(exception))) {
+ HANDLE_EXCEPTION();
+ }
+ if (Z_LVAL_P(EX_VAR(opline->result.var)) == 0) {
+ ZEND_VM_SMART_BRANCH_TRUE();
+ ZVAL_TRUE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
+ } else {
+ ZEND_VM_SMART_BRANCH_FALSE();
+ ZVAL_FALSE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
+ }
+}
+
+ZEND_VM_COLD_CONSTCONST_HANDLER(18, ZEND_IS_EQUAL, CONST|TMPVAR|CV, CONST|TMPVAR|CV, SPEC(SMART_BRANCH,COMMUTATIVE))
{
USE_OPLINE
zend_free_op free_op1, free_op2;
- zval *op1, *op2, *result;
+ zval *op1, *op2;
+ double d1, d2;
op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
op2 = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
- 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));
+ if (ZEND_VM_SPEC && OP1_TYPE == IS_CONST && OP2_TYPE == IS_CONST) {
+ /* pass */
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_LVAL_P(op1) == Z_LVAL_P(op2))) {
+ZEND_VM_C_LABEL(is_equal_true):
+ ZEND_VM_SMART_BRANCH_TRUE();
+ ZVAL_TRUE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
} else {
- break;
+ZEND_VM_C_LABEL(is_equal_false):
+ ZEND_VM_SMART_BRANCH_FALSE();
+ ZVAL_FALSE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
}
- } 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 if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ d1 = (double)Z_LVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+ ZEND_VM_C_GOTO(is_equal_double);
+ }
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+ZEND_VM_C_LABEL(is_equal_double):
+ if (d1 == d2) {
+ ZEND_VM_C_GOTO(is_equal_true);
} else {
- break;
+ ZEND_VM_C_GOTO(is_equal_false);
}
- } 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));
- FREE_OP1();
- FREE_OP2();
+ } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = (double)Z_LVAL_P(op2);
+ ZEND_VM_C_GOTO(is_equal_double);
+ }
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
+ if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
+ int result = zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2));
+ if (OP1_TYPE & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_str(op1);
+ }
+ if (OP2_TYPE & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_str(op2);
+ }
+ if (result) {
+ ZEND_VM_C_GOTO(is_equal_true);
} else {
- break;
+ ZEND_VM_C_GOTO(is_equal_false);
}
- } else {
- break;
}
- ZEND_VM_SMART_BRANCH(result, 0);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE();
- } while (0);
+ }
+ ZEND_VM_DISPATCH_TO_HELPER(zend_is_equal_helper, op_1, op1, op_2, op2);
+}
+
+ZEND_VM_HELPER(zend_is_not_equal_helper, ANY, ANY, zval *op_1, zval *op_2)
+{
+ USE_OPLINE
SAVE_OPLINE();
- if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
- op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
+ if (UNEXPECTED(Z_TYPE_INFO_P(op_1) == IS_UNDEF)) {
+ op_1 = ZVAL_UNDEFINED_OP1();
}
- if (OP2_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
- op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
+ if (UNEXPECTED(Z_TYPE_INFO_P(op_2) == IS_UNDEF)) {
+ op_2 = ZVAL_UNDEFINED_OP2();
+ }
+ compare_function(EX_VAR(opline->result.var), op_1, op_2);
+ if (OP1_TYPE & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_nogc(op_1);
+ }
+ if (OP2_TYPE & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_nogc(op_2);
+ }
+ if (UNEXPECTED(EG(exception))) {
+ HANDLE_EXCEPTION();
+ }
+ if (Z_LVAL_P(EX_VAR(opline->result.var)) != 0) {
+ ZEND_VM_SMART_BRANCH_TRUE();
+ ZVAL_TRUE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
+ } else {
+ ZEND_VM_SMART_BRANCH_FALSE();
+ ZVAL_FALSE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
}
- result = EX_VAR(opline->result.var);
- compare_function(result, op1, op2);
- ZVAL_BOOL(result, Z_LVAL_P(result) == 0);
- FREE_OP1();
- FREE_OP2();
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-ZEND_VM_COLD_CONSTCONST_HANDLER(18, ZEND_IS_NOT_EQUAL, CONST|TMPVAR|CV, CONST|TMPVAR|CV, SPEC(COMMUTATIVE))
+ZEND_VM_COLD_CONSTCONST_HANDLER(19, ZEND_IS_NOT_EQUAL, CONST|TMPVAR|CV, CONST|TMPVAR|CV, SPEC(SMART_BRANCH,COMMUTATIVE))
{
USE_OPLINE
zend_free_op free_op1, free_op2;
- zval *op1, *op2, *result;
+ zval *op1, *op2;
+ double d1, d2;
op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
op2 = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
- 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));
+ if (ZEND_VM_SPEC && OP1_TYPE == IS_CONST && OP2_TYPE == IS_CONST) {
+ /* pass */
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_LVAL_P(op1) != Z_LVAL_P(op2))) {
+ZEND_VM_C_LABEL(is_not_equal_true):
+ ZEND_VM_SMART_BRANCH_TRUE();
+ ZVAL_TRUE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
} else {
- break;
+ZEND_VM_C_LABEL(is_not_equal_false):
+ ZEND_VM_SMART_BRANCH_FALSE();
+ ZVAL_FALSE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
}
- } 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 if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ d1 = (double)Z_LVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+ ZEND_VM_C_GOTO(is_not_equal_double);
+ }
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+ZEND_VM_C_LABEL(is_not_equal_double):
+ if (d1 != d2) {
+ ZEND_VM_C_GOTO(is_not_equal_true);
} else {
- break;
+ ZEND_VM_C_GOTO(is_not_equal_false);
}
- } 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));
- FREE_OP1();
- FREE_OP2();
+ } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = (double)Z_LVAL_P(op2);
+ ZEND_VM_C_GOTO(is_not_equal_double);
+ }
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
+ if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
+ int result = zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2));
+ if (OP1_TYPE & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_str(op1);
+ }
+ if (OP2_TYPE & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_str(op2);
+ }
+ if (!result) {
+ ZEND_VM_C_GOTO(is_not_equal_true);
} else {
- break;
+ ZEND_VM_C_GOTO(is_not_equal_false);
}
- } else {
- break;
}
- ZEND_VM_SMART_BRANCH(result, 0);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE();
- } while (0);
+ }
+ ZEND_VM_DISPATCH_TO_HELPER(zend_is_not_equal_helper, op_1, op1, op_2, op2);
+}
+
+ZEND_VM_HELPER(zend_is_smaller_helper, ANY, ANY, zval *op_1, zval *op_2)
+{
+ USE_OPLINE
SAVE_OPLINE();
- if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
- op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
+ if (UNEXPECTED(Z_TYPE_INFO_P(op_1) == IS_UNDEF)) {
+ op_1 = ZVAL_UNDEFINED_OP1();
}
- if (OP2_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
- op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
+ if (UNEXPECTED(Z_TYPE_INFO_P(op_2) == IS_UNDEF)) {
+ op_2 = ZVAL_UNDEFINED_OP2();
+ }
+ compare_function(EX_VAR(opline->result.var), op_1, op_2);
+ if (OP1_TYPE & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_nogc(op_1);
+ }
+ if (OP2_TYPE & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_nogc(op_2);
+ }
+ if (UNEXPECTED(EG(exception))) {
+ HANDLE_EXCEPTION();
+ }
+ if (Z_LVAL_P(EX_VAR(opline->result.var)) < 0) {
+ ZEND_VM_SMART_BRANCH_TRUE();
+ ZVAL_TRUE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
+ } else {
+ ZEND_VM_SMART_BRANCH_FALSE();
+ ZVAL_FALSE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
}
- result = EX_VAR(opline->result.var);
- compare_function(result, op1, op2);
- ZVAL_BOOL(result, Z_LVAL_P(result) != 0);
- FREE_OP1();
- FREE_OP2();
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-ZEND_VM_COLD_CONSTCONST_HANDLER(19, ZEND_IS_SMALLER, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
+ZEND_VM_HOT_NOCONSTCONST_HANDLER(20, ZEND_IS_SMALLER, CONST|TMPVARCV, CONST|TMPVARCV, SPEC(SMART_BRANCH))
{
USE_OPLINE
zend_free_op free_op1, free_op2;
- zval *op1, *op2, *result;
+ zval *op1, *op2;
+ double d1, d2;
op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
op2 = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
- 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));
+ if (ZEND_VM_SPEC && OP1_TYPE == IS_CONST && OP2_TYPE == IS_CONST) {
+ /* pass */
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_LVAL_P(op1) < Z_LVAL_P(op2))) {
+ZEND_VM_C_LABEL(is_smaller_true):
+ ZEND_VM_SMART_BRANCH_TRUE();
+ ZVAL_TRUE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
} else {
- break;
+ZEND_VM_C_LABEL(is_smaller_false):
+ ZEND_VM_SMART_BRANCH_FALSE();
+ ZVAL_FALSE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
}
- } 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 if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+ d1 = (double)Z_LVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+ ZEND_VM_C_GOTO(is_smaller_double);
+ }
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+ZEND_VM_C_LABEL(is_smaller_double):
+ if (d1 < d2) {
+ ZEND_VM_C_GOTO(is_smaller_true);
} else {
- break;
+ ZEND_VM_C_GOTO(is_smaller_false);
}
- } else {
- break;
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = (double)Z_LVAL_P(op2);
+ ZEND_VM_C_GOTO(is_smaller_double);
}
- ZEND_VM_SMART_BRANCH(result, 0);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE();
- } while (0);
+ }
+ ZEND_VM_DISPATCH_TO_HELPER(zend_is_smaller_helper, op_1, op1, op_2, op2);
+}
+
+ZEND_VM_HELPER(zend_is_smaller_or_equal_helper, ANY, ANY, zval *op_1, zval *op_2)
+{
+ USE_OPLINE
SAVE_OPLINE();
- if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
- op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
+ if (UNEXPECTED(Z_TYPE_INFO_P(op_1) == IS_UNDEF)) {
+ op_1 = ZVAL_UNDEFINED_OP1();
}
- if (OP2_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
- op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
+ if (UNEXPECTED(Z_TYPE_INFO_P(op_2) == IS_UNDEF)) {
+ op_2 = ZVAL_UNDEFINED_OP2();
+ }
+ compare_function(EX_VAR(opline->result.var), op_1, op_2);
+ if (OP1_TYPE & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_nogc(op_1);
+ }
+ if (OP2_TYPE & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_nogc(op_2);
+ }
+ if (UNEXPECTED(EG(exception))) {
+ HANDLE_EXCEPTION();
+ }
+ if (Z_LVAL_P(EX_VAR(opline->result.var)) <= 0) {
+ ZEND_VM_SMART_BRANCH_TRUE();
+ ZVAL_TRUE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
+ } else {
+ ZEND_VM_SMART_BRANCH_FALSE();
+ ZVAL_FALSE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
}
- result = EX_VAR(opline->result.var);
- compare_function(result, op1, op2);
- ZVAL_BOOL(result, Z_LVAL_P(result) < 0);
- FREE_OP1();
- FREE_OP2();
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-ZEND_VM_COLD_CONSTCONST_HANDLER(20, ZEND_IS_SMALLER_OR_EQUAL, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
+ZEND_VM_HOT_NOCONSTCONST_HANDLER(21, ZEND_IS_SMALLER_OR_EQUAL, CONST|TMPVARCV, CONST|TMPVARCV, SPEC(SMART_BRANCH))
{
USE_OPLINE
zend_free_op free_op1, free_op2;
- zval *op1, *op2, *result;
+ zval *op1, *op2;
+ double d1, d2;
op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
op2 = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
- 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));
+ if (ZEND_VM_SPEC && OP1_TYPE == IS_CONST && OP2_TYPE == IS_CONST) {
+ /* pass */
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_LVAL_P(op1) <= Z_LVAL_P(op2))) {
+ZEND_VM_C_LABEL(is_smaller_or_equal_true):
+ ZEND_VM_SMART_BRANCH_TRUE();
+ ZVAL_TRUE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
} else {
- break;
+ZEND_VM_C_LABEL(is_smaller_or_equal_false):
+ ZEND_VM_SMART_BRANCH_FALSE();
+ ZVAL_FALSE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
}
- } 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 if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+ d1 = (double)Z_LVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+ ZEND_VM_C_GOTO(is_smaller_or_equal_double);
+ }
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+ZEND_VM_C_LABEL(is_smaller_or_equal_double):
+ if (d1 <= d2) {
+ ZEND_VM_C_GOTO(is_smaller_or_equal_true);
} else {
- break;
+ ZEND_VM_C_GOTO(is_smaller_or_equal_false);
}
- } else {
- break;
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = (double)Z_LVAL_P(op2);
+ ZEND_VM_C_GOTO(is_smaller_or_equal_double);
}
- ZEND_VM_SMART_BRANCH(result, 0);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE();
- } while (0);
-
- SAVE_OPLINE();
- if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
- op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if (OP2_TYPE == IS_CV && UNEXPECTED(Z_TYPE_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);
- FREE_OP1();
- FREE_OP2();
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+ ZEND_VM_DISPATCH_TO_HELPER(zend_is_smaller_or_equal_helper, op_1, op1, op_2, op2);
}
ZEND_VM_COLD_CONSTCONST_HANDLER(170, ZEND_SPACESHIP, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
@@ -616,7 +852,28 @@ ZEND_VM_COLD_CONSTCONST_HANDLER(170, ZEND_SPACESHIP, CONST|TMPVAR|CV, CONST|TMPV
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-ZEND_VM_COLD_CONSTCONST_HANDLER(9, ZEND_BW_OR, CONST|TMPVAR|CV, CONST|TMPVAR|CV, SPEC(COMMUTATIVE))
+ZEND_VM_HELPER(zend_bw_or_helper, ANY, ANY, zval *op_1, zval *op_2)
+{
+ USE_OPLINE
+
+ SAVE_OPLINE();
+ if (UNEXPECTED(Z_TYPE_INFO_P(op_1) == IS_UNDEF)) {
+ op_1 = ZVAL_UNDEFINED_OP1();
+ }
+ if (UNEXPECTED(Z_TYPE_INFO_P(op_2) == IS_UNDEF)) {
+ op_2 = ZVAL_UNDEFINED_OP2();
+ }
+ bitwise_or_function(EX_VAR(opline->result.var), op_1, op_2);
+ if (OP1_TYPE & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_nogc(op_1);
+ }
+ if (OP2_TYPE & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_nogc(op_2);
+ }
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+}
+
+ZEND_VM_COLD_CONSTCONST_HANDLER(9, ZEND_BW_OR, CONST|TMPVARCV, CONST|TMPVARCV, SPEC(COMMUTATIVE))
{
USE_OPLINE
zend_free_op free_op1, free_op2;
@@ -624,26 +881,39 @@ ZEND_VM_COLD_CONSTCONST_HANDLER(9, ZEND_BW_OR, CONST|TMPVAR|CV, CONST|TMPVAR|CV,
op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
op2 = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
- if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)
+ if (ZEND_VM_SPEC && OP1_TYPE == IS_CONST && OP2_TYPE == IS_CONST) {
+ /* pass */
+ } else 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_VM_DISPATCH_TO_HELPER(zend_bw_or_helper, op_1, op1, op_2, op2);
+}
+
+ZEND_VM_HELPER(zend_bw_and_helper, ANY, ANY, zval *op_1, zval *op_2)
+{
+ USE_OPLINE
+
SAVE_OPLINE();
- if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
- op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
+ if (UNEXPECTED(Z_TYPE_INFO_P(op_1) == IS_UNDEF)) {
+ op_1 = ZVAL_UNDEFINED_OP1();
}
- if (OP2_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
- op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
+ if (UNEXPECTED(Z_TYPE_INFO_P(op_2) == IS_UNDEF)) {
+ op_2 = ZVAL_UNDEFINED_OP2();
+ }
+ bitwise_and_function(EX_VAR(opline->result.var), op_1, op_2);
+ if (OP1_TYPE & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_nogc(op_1);
+ }
+ if (OP2_TYPE & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_nogc(op_2);
}
- bitwise_or_function(EX_VAR(opline->result.var), op1, op2);
- FREE_OP1();
- FREE_OP2();
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-ZEND_VM_COLD_CONSTCONST_HANDLER(10, ZEND_BW_AND, CONST|TMPVAR|CV, CONST|TMPVAR|CV, SPEC(COMMUTATIVE))
+ZEND_VM_COLD_CONSTCONST_HANDLER(10, ZEND_BW_AND, CONST|TMPVARCV, CONST|TMPVARCV, SPEC(COMMUTATIVE))
{
USE_OPLINE
zend_free_op free_op1, free_op2;
@@ -651,26 +921,39 @@ ZEND_VM_COLD_CONSTCONST_HANDLER(10, ZEND_BW_AND, CONST|TMPVAR|CV, CONST|TMPVAR|C
op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
op2 = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
- if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)
+ if (ZEND_VM_SPEC && OP1_TYPE == IS_CONST && OP2_TYPE == IS_CONST) {
+ /* pass */
+ } else 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_VM_DISPATCH_TO_HELPER(zend_bw_and_helper, op_1, op1, op_2, op2);
+}
+
+ZEND_VM_HELPER(zend_bw_xor_helper, ANY, ANY, zval *op_1, zval *op_2)
+{
+ USE_OPLINE
+
SAVE_OPLINE();
- if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
- op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
+ if (UNEXPECTED(Z_TYPE_INFO_P(op_1) == IS_UNDEF)) {
+ op_1 = ZVAL_UNDEFINED_OP1();
}
- if (OP2_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
- op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
+ if (UNEXPECTED(Z_TYPE_INFO_P(op_2) == IS_UNDEF)) {
+ op_2 = ZVAL_UNDEFINED_OP2();
+ }
+ bitwise_xor_function(EX_VAR(opline->result.var), op_1, op_2);
+ if (OP1_TYPE & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_nogc(op_1);
+ }
+ if (OP2_TYPE & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_nogc(op_2);
}
- bitwise_and_function(EX_VAR(opline->result.var), op1, op2);
- FREE_OP1();
- FREE_OP2();
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-ZEND_VM_COLD_CONSTCONST_HANDLER(11, ZEND_BW_XOR, CONST|TMPVAR|CV, CONST|TMPVAR|CV, SPEC(COMMUTATIVE))
+ZEND_VM_COLD_CONSTCONST_HANDLER(11, ZEND_BW_XOR, CONST|TMPVARCV, CONST|TMPVARCV, SPEC(COMMUTATIVE))
{
USE_OPLINE
zend_free_op free_op1, free_op2;
@@ -678,26 +961,18 @@ ZEND_VM_COLD_CONSTCONST_HANDLER(11, ZEND_BW_XOR, CONST|TMPVAR|CV, CONST|TMPVAR|C
op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
op2 = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
- if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)
+ if (ZEND_VM_SPEC && OP1_TYPE == IS_CONST && OP2_TYPE == IS_CONST) {
+ /* pass */
+ } else 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 (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
- op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
- }
- if (OP2_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
- op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
- }
- bitwise_xor_function(EX_VAR(opline->result.var), op1, op2);
- FREE_OP1();
- FREE_OP2();
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+ ZEND_VM_DISPATCH_TO_HELPER(zend_bw_xor_helper, op_1, op1, op_2, op2);
}
-ZEND_VM_COLD_CONSTCONST_HANDLER(14, ZEND_BOOL_XOR, CONST|TMPVAR|CV, CONST|TMPVAR|CV, SPEC(COMMUTATIVE))
+ZEND_VM_COLD_CONSTCONST_HANDLER(15, ZEND_BOOL_XOR, CONST|TMPVAR|CV, CONST|TMPVAR|CV, SPEC(COMMUTATIVE))
{
USE_OPLINE
zend_free_op free_op1, free_op2;
@@ -712,7 +987,7 @@ ZEND_VM_COLD_CONSTCONST_HANDLER(14, ZEND_BOOL_XOR, CONST|TMPVAR|CV, CONST|TMPVAR
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-ZEND_VM_COLD_CONST_HANDLER(12, ZEND_BW_NOT, CONST|TMPVAR|CV, ANY)
+ZEND_VM_COLD_CONST_HANDLER(13, ZEND_BW_NOT, CONST|TMPVAR|CV, ANY)
{
USE_OPLINE
zend_free_op free_op1;
@@ -725,13 +1000,15 @@ ZEND_VM_COLD_CONST_HANDLER(12, ZEND_BW_NOT, CONST|TMPVAR|CV, ANY)
}
SAVE_OPLINE();
- bitwise_not_function(EX_VAR(opline->result.var),
- GET_OP1_ZVAL_PTR(BP_VAR_R));
+ if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ op1 = ZVAL_UNDEFINED_OP1();
+ }
+ bitwise_not_function(EX_VAR(opline->result.var), op1);
FREE_OP1();
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-ZEND_VM_COLD_CONST_HANDLER(13, ZEND_BOOL_NOT, CONST|TMPVAR|CV, ANY)
+ZEND_VM_COLD_CONST_HANDLER(14, ZEND_BOOL_NOT, CONST|TMPVAR|CV, ANY)
{
USE_OPLINE
zval *val;
@@ -746,7 +1023,7 @@ ZEND_VM_COLD_CONST_HANDLER(13, ZEND_BOOL_NOT, CONST|TMPVAR|CV, ANY)
ZVAL_TRUE(EX_VAR(opline->result.var));
if (OP1_TYPE == IS_CV && UNEXPECTED(orig_val_type == IS_UNDEF)) {
SAVE_OPLINE();
- GET_OP1_UNDEF_CV(val, BP_VAR_R);
+ ZVAL_UNDEFINED_OP1();
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
} else {
@@ -772,34 +1049,30 @@ ZEND_VM_COLD_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)
+ZEND_VM_COLD_HELPER(zend_undefined_function_helper, ANY, ANY)
{
USE_OPLINE
+ zval *function_name;
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();
+ function_name = RT_CONSTANT(opline, opline->op2);
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)
+ZEND_VM_HANDLER(28, ZEND_ASSIGN_OBJ_OP, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, OP)
{
USE_OPLINE
- zend_free_op free_op1, free_op2, free_op_data1;
+ zend_free_op free_op1, free_op2, free_op_data;
zval *object;
zval *property;
zval *value;
zval *zptr;
+ void **cache_slot;
+ zend_property_info *prop_info;
SAVE_OPLINE();
- object = GET_OP1_OBJ_ZVAL_PTR_PTR(BP_VAR_RW);
+ object = GET_OP1_OBJ_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW);
if (OP1_TYPE == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
ZEND_VM_DISPATCH_TO_HELPER(zend_this_not_in_object_context_helper);
@@ -808,49 +1081,124 @@ ZEND_VM_HELPER(zend_binary_assign_op_obj_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV,
property = GET_OP2_ZVAL_PTR(BP_VAR_R);
do {
- value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data1);
+ value = GET_OP_DATA_ZVAL_PTR(BP_VAR_R);
if (OP1_TYPE != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
- if (Z_ISREF_P(object)) {
+ if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) {
object = Z_REFVAL_P(object);
- if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
- ZEND_VM_C_GOTO(assign_op_object);
- }
+ ZEND_VM_C_GOTO(assign_op_object);
}
- if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
+ if (OP1_TYPE == IS_CV
+ && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
+ ZVAL_UNDEFINED_OP1();
+ }
+ object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC);
+ if (UNEXPECTED(!object)) {
break;
}
}
- /* here we are sure we are dealing with an object */
ZEND_VM_C_LABEL(assign_op_object):
- if (EXPECTED(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((opline+1)->extended_value) : NULL))) != NULL)) {
+ /* here we are sure we are dealing with an object */
+ cache_slot = (OP2_TYPE == IS_CONST) ? CACHE_ADDR((opline+1)->extended_value) : NULL;
+ if (EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, cache_slot)) != NULL)) {
if (UNEXPECTED(Z_ISERROR_P(zptr))) {
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_NULL(EX_VAR(opline->result.var));
}
} else {
- ZVAL_DEREF(zptr);
+ zval *orig_zptr = zptr;
+ zend_reference *ref;
+
+ do {
+ if (UNEXPECTED(Z_ISREF_P(zptr))) {
+ ref = Z_REF_P(zptr);
+ zptr = Z_REFVAL_P(zptr);
+ if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) {
+ zend_binary_assign_op_typed_ref(ref, value OPLINE_CC EXECUTE_DATA_CC);
+ break;
+ }
+ }
+
+ if (OP2_TYPE == IS_CONST) {
+ prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2);
+ } else {
+ prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(object), orig_zptr);
+ }
+ if (UNEXPECTED(prop_info)) {
+ /* special case for typed properties */
+ zend_binary_assign_op_typed_prop(prop_info, zptr, value OPLINE_CC EXECUTE_DATA_CC);
+ } else {
+ zend_binary_op(zptr, zptr, value OPLINE_CC);
+ }
+ } while (0);
- binary_op(zptr, zptr, value);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), zptr);
}
}
} else {
- zend_assign_op_overloaded_property(object, property, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR((opline+1)->extended_value) : NULL), value, binary_op OPLINE_CC EXECUTE_DATA_CC);
+ zend_assign_op_overloaded_property(object, property, cache_slot, value OPLINE_CC EXECUTE_DATA_CC);
}
} while (0);
- FREE_OP(free_op_data1);
+ FREE_OP_DATA();
FREE_OP2();
FREE_OP1_VAR_PTR();
/* assign_obj has two opcodes! */
ZEND_VM_NEXT_OPCODE_EX(1, 2);
}
-ZEND_VM_HELPER(zend_binary_assign_op_dim_helper, VAR|CV, CONST|TMPVAR|UNUSED|CV, binary_op_type binary_op)
+/* No specialization for op_types (CONST|TMP|VAR|CV, UNUSED|CONST|TMPVAR) */
+ZEND_VM_HANDLER(29, ZEND_ASSIGN_STATIC_PROP_OP, ANY, ANY, OP)
+{
+ /* This helper actually never will receive IS_VAR as second op, and has the same handling for VAR and TMP in the first op, but for interoperability with the other binary_assign_op helpers, it is necessary to "include" it */
+
+ USE_OPLINE
+ zend_free_op free_op_data;
+ zval *prop, *value;
+ zend_property_info *prop_info;
+ zend_reference *ref;
+
+ SAVE_OPLINE();
+
+ if (UNEXPECTED(zend_fetch_static_property_address(&prop, &prop_info, (opline+1)->extended_value, BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) {
+ ZEND_ASSERT(EG(exception));
+ UNDEF_RESULT();
+ FREE_UNFETCHED_OP_DATA();
+ HANDLE_EXCEPTION();
+ }
+
+ value = GET_OP_DATA_ZVAL_PTR(BP_VAR_R);
+
+ do {
+ if (UNEXPECTED(Z_ISREF_P(prop))) {
+ ref = Z_REF_P(prop);
+ prop = Z_REFVAL_P(prop);
+ if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) {
+ zend_binary_assign_op_typed_ref(ref, value OPLINE_CC EXECUTE_DATA_CC);
+ break;
+ }
+ }
+
+ if (UNEXPECTED(prop_info->type)) {
+ /* special case for typed properties */
+ zend_binary_assign_op_typed_prop(prop_info, prop, value OPLINE_CC EXECUTE_DATA_CC);
+ } else {
+ zend_binary_op(prop, prop, value OPLINE_CC);
+ }
+ } while (0);
+
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+ ZVAL_COPY(EX_VAR(opline->result.var), prop);
+ }
+
+ FREE_OP_DATA();
+ /* assign_static_prop has two opcodes! */
+ ZEND_VM_NEXT_OPCODE_EX(1, 2);
+}
+
+ZEND_VM_HANDLER(27, ZEND_ASSIGN_DIM_OP, VAR|CV, CONST|TMPVAR|UNUSED|NEXT|CV, OP)
{
USE_OPLINE
zend_free_op free_op1, free_op2, free_op_data1;
@@ -880,68 +1228,62 @@ ZEND_VM_C_LABEL(assign_dim_op_new_array):
if (UNEXPECTED(!var_ptr)) {
ZEND_VM_C_GOTO(assign_dim_op_ret_null);
}
- ZVAL_DEREF(var_ptr);
}
value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data1);
- binary_op(var_ptr, var_ptr, value);
+ do {
+ if (OP2_TYPE != IS_UNUSED && UNEXPECTED(Z_ISREF_P(var_ptr))) {
+ zend_reference *ref = Z_REF_P(var_ptr);
+ var_ptr = Z_REFVAL_P(var_ptr);
+ if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) {
+ zend_binary_assign_op_typed_ref(ref, value OPLINE_CC EXECUTE_DATA_CC);
+ break;
+ }
+ }
+ zend_binary_op(var_ptr, var_ptr, value OPLINE_CC);
+ } while (0);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);
}
+ FREE_OP(free_op_data1);
} else {
if (EXPECTED(Z_ISREF_P(container))) {
container = Z_REFVAL_P(container);
if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
ZEND_VM_C_GOTO(assign_dim_op_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_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_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);
+ zend_binary_assign_op_obj_dim(container, dim OPLINE_CC EXECUTE_DATA_CC);
+ } else if (EXPECTED(Z_TYPE_P(container) <= IS_FALSE)) {
+ if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(container) == IS_UNDEF)) {
+ ZVAL_UNDEFINED_OP1();
+ }
+ ZVAL_ARR(container, zend_new_array(8));
+ ZEND_VM_C_GOTO(assign_dim_op_new_array);
} else {
- if (UNEXPECTED(Z_TYPE_P(container) == IS_STRING)) {
- if (OP2_TYPE == 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)) {
- ZEND_VM_C_GOTO(assign_dim_op_convert_to_array);
- } else {
- if (UNEXPECTED(OP1_TYPE != IS_VAR || EXPECTED(!Z_ISERROR_P(container)))) {
- zend_use_scalar_as_array();
- }
+ zend_binary_assign_op_dim_slow(container, dim OPLINE_CC EXECUTE_DATA_CC);
ZEND_VM_C_LABEL(assign_dim_op_ret_null):
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
+ 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);
}
}
FREE_OP2();
- FREE_OP(free_op_data1);
FREE_OP1_VAR_PTR();
ZEND_VM_NEXT_OPCODE_EX(1, 2);
}
-ZEND_VM_HELPER(zend_binary_assign_op_simple_helper, VAR|CV, CONST|TMPVAR|CV, binary_op_type binary_op)
+ZEND_VM_HANDLER(26, ZEND_ASSIGN_OP, VAR|CV, CONST|TMPVAR|CV, OP)
{
USE_OPLINE
zend_free_op free_op1, free_op2;
@@ -957,9 +1299,17 @@ ZEND_VM_HELPER(zend_binary_assign_op_simple_helper, VAR|CV, CONST|TMPVAR|CV, bin
ZVAL_NULL(EX_VAR(opline->result.var));
}
} else {
- ZVAL_DEREF(var_ptr);
-
- binary_op(var_ptr, var_ptr, value);
+ do {
+ if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) {
+ zend_reference *ref = Z_REF_P(var_ptr);
+ var_ptr = Z_REFVAL_P(var_ptr);
+ if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) {
+ zend_binary_assign_op_typed_ref(ref, value OPLINE_CC EXECUTE_DATA_CC);
+ break;
+ }
+ }
+ zend_binary_op(var_ptr, var_ptr, value OPLINE_CC);
+ } while (0);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);
@@ -971,99 +1321,18 @@ ZEND_VM_HELPER(zend_binary_assign_op_simple_helper, VAR|CV, CONST|TMPVAR|CV, bin
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-ZEND_VM_INLINE_HELPER(zend_binary_assign_op_helper, VAR|UNUSED|THIS|CV, CONST|TMPVAR|UNUSED|NEXT|CV, SPEC(DIM_OBJ), binary_op_type binary_op)
-{
-#if defined(ZEND_VM_SPEC) && OP2_TYPE == IS_UNUSED
- 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);
- }
- if (EXPECTED(opline->extended_value == ZEND_ASSIGN_DIM)) {
- ZEND_VM_DISPATCH_TO_HELPER(zend_binary_assign_op_dim_helper, binary_op, binary_op);
- }
-# endif
-
- ZEND_VM_DISPATCH_TO_HELPER(zend_binary_assign_op_obj_helper, binary_op, binary_op);
-#endif
-}
-
-ZEND_VM_HANDLER(23, ZEND_ASSIGN_ADD, VAR|UNUSED|THIS|CV, CONST|TMPVAR|UNUSED|NEXT|CV, DIM_OBJ|CACHE_SLOT, SPEC(DIM_OBJ))
-{
- ZEND_VM_DISPATCH_TO_HELPER(zend_binary_assign_op_helper, binary_op, add_function);
-}
-
-ZEND_VM_HANDLER(24, ZEND_ASSIGN_SUB, VAR|UNUSED|THIS|CV, CONST|TMPVAR|UNUSED|NEXT|CV, DIM_OBJ|CACHE_SLOT, SPEC(DIM_OBJ))
-{
- ZEND_VM_DISPATCH_TO_HELPER(zend_binary_assign_op_helper, binary_op, sub_function);
-}
-
-ZEND_VM_HANDLER(25, ZEND_ASSIGN_MUL, VAR|UNUSED|THIS|CV, CONST|TMPVAR|UNUSED|NEXT|CV, DIM_OBJ|CACHE_SLOT, SPEC(DIM_OBJ))
-{
- ZEND_VM_DISPATCH_TO_HELPER(zend_binary_assign_op_helper, binary_op, mul_function);
-}
-
-ZEND_VM_HANDLER(26, ZEND_ASSIGN_DIV, VAR|UNUSED|THIS|CV, CONST|TMPVAR|UNUSED|NEXT|CV, DIM_OBJ|CACHE_SLOT, SPEC(DIM_OBJ))
-{
- ZEND_VM_DISPATCH_TO_HELPER(zend_binary_assign_op_helper, binary_op, div_function);
-}
-
-ZEND_VM_HANDLER(27, ZEND_ASSIGN_MOD, VAR|UNUSED|THIS|CV, CONST|TMPVAR|UNUSED|NEXT|CV, DIM_OBJ|CACHE_SLOT, SPEC(DIM_OBJ))
-{
- ZEND_VM_DISPATCH_TO_HELPER(zend_binary_assign_op_helper, binary_op, mod_function);
-}
-
-ZEND_VM_HANDLER(28, ZEND_ASSIGN_SL, VAR|UNUSED|THIS|CV, CONST|TMPVAR|UNUSED|NEXT|CV, DIM_OBJ|CACHE_SLOT, SPEC(DIM_OBJ))
-{
- ZEND_VM_DISPATCH_TO_HELPER(zend_binary_assign_op_helper, binary_op, shift_left_function);
-}
-
-ZEND_VM_HANDLER(29, ZEND_ASSIGN_SR, VAR|UNUSED|THIS|CV, CONST|TMPVAR|UNUSED|NEXT|CV, DIM_OBJ|CACHE_SLOT, SPEC(DIM_OBJ))
-{
- ZEND_VM_DISPATCH_TO_HELPER(zend_binary_assign_op_helper, binary_op, shift_right_function);
-}
-
-ZEND_VM_HANDLER(30, ZEND_ASSIGN_CONCAT, VAR|UNUSED|THIS|CV, CONST|TMPVAR|UNUSED|NEXT|CV, DIM_OBJ|CACHE_SLOT, SPEC(DIM_OBJ))
-{
- ZEND_VM_DISPATCH_TO_HELPER(zend_binary_assign_op_helper, binary_op, concat_function);
-}
-
-ZEND_VM_HANDLER(31, ZEND_ASSIGN_BW_OR, VAR|UNUSED|THIS|CV, CONST|TMPVAR|UNUSED|NEXT|CV, DIM_OBJ|CACHE_SLOT, SPEC(DIM_OBJ))
-{
- ZEND_VM_DISPATCH_TO_HELPER(zend_binary_assign_op_helper, binary_op, bitwise_or_function);
-}
-
-ZEND_VM_HANDLER(32, ZEND_ASSIGN_BW_AND, VAR|UNUSED|THIS|CV, CONST|TMPVAR|UNUSED|NEXT|CV, DIM_OBJ|CACHE_SLOT, SPEC(DIM_OBJ))
-{
- ZEND_VM_DISPATCH_TO_HELPER(zend_binary_assign_op_helper, binary_op, bitwise_and_function);
-}
-
-ZEND_VM_HANDLER(33, ZEND_ASSIGN_BW_XOR, VAR|UNUSED|THIS|CV, CONST|TMPVAR|UNUSED|NEXT|CV, DIM_OBJ|CACHE_SLOT, SPEC(DIM_OBJ))
-{
- ZEND_VM_DISPATCH_TO_HELPER(zend_binary_assign_op_helper, binary_op, bitwise_xor_function);
-}
-
-ZEND_VM_HANDLER(167, ZEND_ASSIGN_POW, VAR|UNUSED|THIS|CV, CONST|TMPVAR|UNUSED|NEXT|CV, DIM_OBJ|CACHE_SLOT, SPEC(DIM_OBJ))
-{
- ZEND_VM_DISPATCH_TO_HELPER(zend_binary_assign_op_helper, binary_op, pow_function);
-}
-
-ZEND_VM_HELPER(zend_pre_incdec_property_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV, int inc)
+ZEND_VM_HANDLER(132, ZEND_PRE_INC_OBJ, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, CACHE_SLOT)
{
USE_OPLINE
zend_free_op free_op1, free_op2;
zval *object;
zval *property;
zval *zptr;
+ void **cache_slot;
+ zend_property_info *prop_info;
SAVE_OPLINE();
- object = GET_OP1_OBJ_ZVAL_PTR_PTR(BP_VAR_RW);
+ object = GET_OP1_OBJ_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW);
if (OP1_TYPE == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
ZEND_VM_DISPATCH_TO_HELPER(zend_this_not_in_object_context_helper);
@@ -1073,47 +1342,38 @@ ZEND_VM_HELPER(zend_pre_incdec_property_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV,
do {
if (OP1_TYPE != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
- if (Z_ISREF_P(object)) {
+ if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) {
object = Z_REFVAL_P(object);
- if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
- ZEND_VM_C_GOTO(pre_incdec_object);
- }
+ ZEND_VM_C_GOTO(pre_incdec_object);
+ }
+ if (OP1_TYPE == IS_CV
+ && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
+ ZVAL_UNDEFINED_OP1();
}
- if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
+ object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC);
+ if (UNEXPECTED(!object)) {
break;
}
}
- /* here we are sure we are dealing with an object */
ZEND_VM_C_LABEL(pre_incdec_object):
- if (EXPECTED(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(opline->extended_value) : NULL))) != NULL)) {
+ /* here we are sure we are dealing with an object */
+ cache_slot = (OP2_TYPE == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL;
+ if (EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, cache_slot)) != NULL)) {
if (UNEXPECTED(Z_ISERROR_P(zptr))) {
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_NULL(EX_VAR(opline->result.var));
}
} else {
- if (EXPECTED(Z_TYPE_P(zptr) == IS_LONG)) {
- if (inc) {
- fast_long_increment_function(zptr);
- } else {
- fast_long_decrement_function(zptr);
- }
+ if (OP2_TYPE == IS_CONST) {
+ prop_info = (zend_property_info *) CACHED_PTR_EX(cache_slot + 2);
} else {
- ZVAL_DEREF(zptr);
-
- if (inc) {
- increment_function(zptr);
- } else {
- decrement_function(zptr);
- }
- }
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY(EX_VAR(opline->result.var), zptr);
+ prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(object), zptr);
}
+ zend_pre_incdec_property_zval(zptr, prop_info OPLINE_CC EXECUTE_DATA_CC);
}
} else {
- zend_pre_incdec_overloaded_property(object, property, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), inc OPLINE_CC EXECUTE_DATA_CC);
+ zend_pre_incdec_overloaded_property(object, property, cache_slot OPLINE_CC EXECUTE_DATA_CC);
}
} while (0);
@@ -1122,26 +1382,23 @@ ZEND_VM_C_LABEL(pre_incdec_object):
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-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, CACHE_SLOT)
{
- ZEND_VM_DISPATCH_TO_HELPER(zend_pre_incdec_property_helper, inc, 0);
+ ZEND_VM_DISPATCH_TO_HANDLER(ZEND_PRE_INC_OBJ);
}
-ZEND_VM_HELPER(zend_post_incdec_property_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV, int inc)
+ZEND_VM_HANDLER(134, ZEND_POST_INC_OBJ, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, CACHE_SLOT)
{
USE_OPLINE
zend_free_op free_op1, free_op2;
zval *object;
zval *property;
zval *zptr;
+ void **cache_slot;
+ zend_property_info *prop_info;
SAVE_OPLINE();
- object = GET_OP1_OBJ_ZVAL_PTR_PTR(BP_VAR_RW);
+ object = GET_OP1_OBJ_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW);
if (OP1_TYPE == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
ZEND_VM_DISPATCH_TO_HELPER(zend_this_not_in_object_context_helper);
@@ -1151,43 +1408,37 @@ ZEND_VM_HELPER(zend_post_incdec_property_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV,
do {
if (OP1_TYPE != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
- if (Z_ISREF_P(object)) {
+ if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) {
object = Z_REFVAL_P(object);
- if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
- ZEND_VM_C_GOTO(post_incdec_object);
- }
+ ZEND_VM_C_GOTO(post_incdec_object);
+ }
+ if (OP1_TYPE == IS_CV
+ && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
+ ZVAL_UNDEFINED_OP1();
}
- if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
+ object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC);
+ if (UNEXPECTED(!object)) {
break;
}
}
- /* here we are sure we are dealing with an object */
ZEND_VM_C_LABEL(post_incdec_object):
- if (EXPECTED(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(opline->extended_value) : NULL))) != NULL)) {
+ /* here we are sure we are dealing with an object */
+ cache_slot = (OP2_TYPE == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL;
+ if (EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, cache_slot)) != NULL)) {
if (UNEXPECTED(Z_ISERROR_P(zptr))) {
ZVAL_NULL(EX_VAR(opline->result.var));
} else {
- if (EXPECTED(Z_TYPE_P(zptr) == IS_LONG)) {
- ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(zptr));
- if (inc) {
- fast_long_increment_function(zptr);
- } else {
- fast_long_decrement_function(zptr);
- }
+ if (OP2_TYPE == IS_CONST) {
+ prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2);
} else {
- ZVAL_DEREF(zptr);
- ZVAL_COPY(EX_VAR(opline->result.var), zptr);
- if (inc) {
- increment_function(zptr);
- } else {
- decrement_function(zptr);
- }
+ prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(object), zptr);
}
+
+ zend_post_incdec_property_zval(zptr, prop_info OPLINE_CC EXECUTE_DATA_CC);
}
} else {
- zend_post_incdec_overloaded_property(object, property, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), inc OPLINE_CC EXECUTE_DATA_CC);
+ zend_post_incdec_overloaded_property(object, property, cache_slot OPLINE_CC EXECUTE_DATA_CC);
}
} while (0);
@@ -1196,17 +1447,62 @@ ZEND_VM_C_LABEL(post_incdec_object):
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-ZEND_VM_HANDLER(134, ZEND_POST_INC_OBJ, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, CACHE_SLOT)
+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, 1);
+ ZEND_VM_DISPATCH_TO_HANDLER(ZEND_POST_INC_OBJ);
}
-ZEND_VM_HANDLER(135, ZEND_POST_DEC_OBJ, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, CACHE_SLOT)
+/* No specialization for op_types (CONST|TMPVAR|CV, UNUSED|CONST|VAR) */
+ZEND_VM_HANDLER(38, ZEND_PRE_INC_STATIC_PROP, ANY, ANY, CACHE_SLOT)
+{
+ USE_OPLINE
+ zval *prop;
+ zend_property_info *prop_info;
+
+ SAVE_OPLINE();
+
+ if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) {
+ UNDEF_RESULT();
+ HANDLE_EXCEPTION();
+ }
+
+ zend_pre_incdec_property_zval(prop, prop_info->type ? prop_info : NULL OPLINE_CC EXECUTE_DATA_CC);
+
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+}
+
+/* No specialization for op_types (CONST|TMPVAR|CV, UNUSED|CONST|VAR) */
+ZEND_VM_HANDLER(39, ZEND_PRE_DEC_STATIC_PROP, ANY, ANY, CACHE_SLOT)
+{
+ ZEND_VM_DISPATCH_TO_HANDLER(ZEND_PRE_INC_STATIC_PROP);
+}
+
+/* No specialization for op_types (CONST|TMPVAR|CV, UNUSED|CONST|VAR) */
+ZEND_VM_HANDLER(40, ZEND_POST_INC_STATIC_PROP, ANY, ANY, CACHE_SLOT)
+{
+ USE_OPLINE
+ zval *prop;
+ zend_property_info *prop_info;
+
+ SAVE_OPLINE();
+
+ if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) {
+ UNDEF_RESULT();
+ HANDLE_EXCEPTION();
+ }
+
+ zend_post_incdec_property_zval(prop, prop_info->type ? prop_info : NULL OPLINE_CC EXECUTE_DATA_CC);
+
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+}
+
+/* No specialization for op_types (CONST|TMPVAR|CV, UNUSED|CONST|VAR) */
+ZEND_VM_HANDLER(41, ZEND_POST_DEC_STATIC_PROP, ANY, ANY, CACHE_SLOT)
{
- ZEND_VM_DISPATCH_TO_HELPER(zend_post_incdec_property_helper, inc, 0);
+ ZEND_VM_DISPATCH_TO_HANDLER(ZEND_POST_INC_STATIC_PROP);
}
-ZEND_VM_HANDLER(34, ZEND_PRE_INC, VAR|CV, ANY, SPEC(RETVAL))
+ZEND_VM_HELPER(zend_pre_inc_helper, VAR|CV, ANY)
{
USE_OPLINE
zend_free_op free_op1;
@@ -1214,14 +1510,6 @@ ZEND_VM_HANDLER(34, ZEND_PRE_INC, VAR|CV, ANY, SPEC(RETVAL))
var_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW);
- if (EXPECTED(Z_TYPE_P(var_ptr) == IS_LONG)) {
- fast_long_increment_function(var_ptr);
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY_VALUE(EX_VAR(opline->result.var), var_ptr);
- }
- ZEND_VM_NEXT_OPCODE();
- }
-
if (OP1_TYPE == IS_VAR && UNEXPECTED(Z_ISERROR_P(var_ptr))) {
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_NULL(EX_VAR(opline->result.var));
@@ -1231,11 +1519,21 @@ ZEND_VM_HANDLER(34, ZEND_PRE_INC, VAR|CV, ANY, SPEC(RETVAL))
SAVE_OPLINE();
if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(var_ptr) == IS_UNDEF)) {
- var_ptr = GET_OP1_UNDEF_CV(var_ptr, BP_VAR_RW);
+ ZVAL_NULL(var_ptr);
+ ZVAL_UNDEFINED_OP1();
}
- ZVAL_DEREF(var_ptr);
- increment_function(var_ptr);
+ do {
+ if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) {
+ zend_reference *ref = Z_REF_P(var_ptr);
+ var_ptr = Z_REFVAL_P(var_ptr);
+ if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) {
+ zend_incdec_typed_ref(ref, NULL OPLINE_CC EXECUTE_DATA_CC);
+ break;
+ }
+ }
+ increment_function(var_ptr);
+ } while (0);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);
@@ -1245,7 +1543,7 @@ ZEND_VM_HANDLER(34, ZEND_PRE_INC, VAR|CV, ANY, SPEC(RETVAL))
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-ZEND_VM_HANDLER(35, ZEND_PRE_DEC, VAR|CV, ANY, SPEC(RETVAL))
+ZEND_VM_HOT_HANDLER(34, ZEND_PRE_INC, VAR|CV, ANY, SPEC(RETVAL))
{
USE_OPLINE
zend_free_op free_op1;
@@ -1254,13 +1552,24 @@ ZEND_VM_HANDLER(35, ZEND_PRE_DEC, VAR|CV, ANY, SPEC(RETVAL))
var_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW);
if (EXPECTED(Z_TYPE_P(var_ptr) == IS_LONG)) {
- fast_long_decrement_function(var_ptr);
+ fast_long_increment_function(var_ptr);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY_VALUE(EX_VAR(opline->result.var), var_ptr);
}
ZEND_VM_NEXT_OPCODE();
}
+ ZEND_VM_DISPATCH_TO_HELPER(zend_pre_inc_helper);
+}
+
+ZEND_VM_HELPER(zend_pre_dec_helper, VAR|CV, ANY)
+{
+ USE_OPLINE
+ zend_free_op free_op1;
+ zval *var_ptr;
+
+ var_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW);
+
if (OP1_TYPE == IS_VAR && UNEXPECTED(Z_ISERROR_P(var_ptr))) {
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_NULL(EX_VAR(opline->result.var));
@@ -1270,11 +1579,22 @@ ZEND_VM_HANDLER(35, ZEND_PRE_DEC, VAR|CV, ANY, SPEC(RETVAL))
SAVE_OPLINE();
if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(var_ptr) == IS_UNDEF)) {
- var_ptr = GET_OP1_UNDEF_CV(var_ptr, BP_VAR_RW);
+ ZVAL_NULL(var_ptr);
+ ZVAL_UNDEFINED_OP1();
}
- ZVAL_DEREF(var_ptr);
- decrement_function(var_ptr);
+ do {
+ if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) {
+ zend_reference *ref = Z_REF_P(var_ptr);
+ var_ptr = Z_REFVAL_P(var_ptr);
+
+ if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) {
+ zend_incdec_typed_ref(ref, NULL OPLINE_CC EXECUTE_DATA_CC);
+ break;
+ }
+ }
+ decrement_function(var_ptr);
+ } while (0);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);
@@ -1284,7 +1604,7 @@ ZEND_VM_HANDLER(35, ZEND_PRE_DEC, VAR|CV, ANY, SPEC(RETVAL))
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-ZEND_VM_HANDLER(36, ZEND_POST_INC, VAR|CV, ANY)
+ZEND_VM_HOT_HANDLER(35, ZEND_PRE_DEC, VAR|CV, ANY, SPEC(RETVAL))
{
USE_OPLINE
zend_free_op free_op1;
@@ -1293,11 +1613,24 @@ 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_LONG(EX_VAR(opline->result.var), Z_LVAL_P(var_ptr));
- fast_long_increment_function(var_ptr);
+ fast_long_decrement_function(var_ptr);
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+ ZVAL_COPY_VALUE(EX_VAR(opline->result.var), var_ptr);
+ }
ZEND_VM_NEXT_OPCODE();
}
+ ZEND_VM_DISPATCH_TO_HELPER(zend_pre_dec_helper);
+}
+
+ZEND_VM_HELPER(zend_post_inc_helper, VAR|CV, ANY)
+{
+ USE_OPLINE
+ zend_free_op free_op1;
+ zval *var_ptr;
+
+ var_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW);
+
if (OP1_TYPE == IS_VAR && UNEXPECTED(Z_ISERROR_P(var_ptr))) {
ZVAL_NULL(EX_VAR(opline->result.var));
ZEND_VM_NEXT_OPCODE();
@@ -1305,18 +1638,30 @@ ZEND_VM_HANDLER(36, ZEND_POST_INC, VAR|CV, ANY)
SAVE_OPLINE();
if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(var_ptr) == IS_UNDEF)) {
- var_ptr = GET_OP1_UNDEF_CV(var_ptr, BP_VAR_RW);
+ ZVAL_NULL(var_ptr);
+ ZVAL_UNDEFINED_OP1();
}
- ZVAL_DEREF(var_ptr);
- ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);
- increment_function(var_ptr);
+ do {
+ if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) {
+ zend_reference *ref = Z_REF_P(var_ptr);
+ var_ptr = Z_REFVAL_P(var_ptr);
+
+ if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) {
+ zend_incdec_typed_ref(ref, EX_VAR(opline->result.var) OPLINE_CC EXECUTE_DATA_CC);
+ break;
+ }
+ }
+ ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);
+
+ increment_function(var_ptr);
+ } while (0);
FREE_OP1_VAR_PTR();
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-ZEND_VM_HANDLER(37, ZEND_POST_DEC, VAR|CV, ANY)
+ZEND_VM_HOT_HANDLER(36, ZEND_POST_INC, VAR|CV, ANY)
{
USE_OPLINE
zend_free_op free_op1;
@@ -1326,10 +1671,21 @@ ZEND_VM_HANDLER(37, ZEND_POST_DEC, VAR|CV, ANY)
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);
+ fast_long_increment_function(var_ptr);
ZEND_VM_NEXT_OPCODE();
}
+ ZEND_VM_DISPATCH_TO_HELPER(zend_post_inc_helper);
+}
+
+ZEND_VM_HELPER(zend_post_dec_helper, VAR|CV, ANY)
+{
+ USE_OPLINE
+ zend_free_op free_op1;
+ zval *var_ptr;
+
+ var_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW);
+
if (OP1_TYPE == IS_VAR && UNEXPECTED(Z_ISERROR_P(var_ptr))) {
ZVAL_NULL(EX_VAR(opline->result.var));
ZEND_VM_NEXT_OPCODE();
@@ -1337,18 +1693,47 @@ ZEND_VM_HANDLER(37, ZEND_POST_DEC, VAR|CV, ANY)
SAVE_OPLINE();
if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(var_ptr) == IS_UNDEF)) {
- var_ptr = GET_OP1_UNDEF_CV(var_ptr, BP_VAR_RW);
+ ZVAL_NULL(var_ptr);
+ ZVAL_UNDEFINED_OP1();
}
- ZVAL_DEREF(var_ptr);
- ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);
- decrement_function(var_ptr);
+ do {
+ if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) {
+ zend_reference *ref = Z_REF_P(var_ptr);
+ var_ptr = Z_REFVAL_P(var_ptr);
+
+ if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) {
+ zend_incdec_typed_ref(ref, EX_VAR(opline->result.var) OPLINE_CC EXECUTE_DATA_CC);
+ break;
+ }
+ }
+ ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);
+
+ decrement_function(var_ptr);
+ } while (0);
FREE_OP1_VAR_PTR();
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-ZEND_VM_HANDLER(40, ZEND_ECHO, CONST|TMPVAR|CV, ANY)
+ZEND_VM_HOT_HANDLER(37, ZEND_POST_DEC, VAR|CV, ANY)
+{
+ USE_OPLINE
+ zend_free_op free_op1;
+ zval *var_ptr;
+
+ var_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW);
+
+ 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);
+ ZEND_VM_NEXT_OPCODE();
+ }
+
+ ZEND_VM_DISPATCH_TO_HELPER(zend_post_dec_helper);
+}
+
+ZEND_VM_HANDLER(136, ZEND_ECHO, CONST|TMPVAR|CV, ANY)
{
USE_OPLINE
zend_free_op free_op1;
@@ -1369,7 +1754,7 @@ ZEND_VM_HANDLER(40, ZEND_ECHO, CONST|TMPVAR|CV, ANY)
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);
+ ZVAL_UNDEFINED_OP1();
}
zend_string_release_ex(str, 0);
}
@@ -1397,9 +1782,14 @@ ZEND_VM_HELPER(zend_fetch_var_address_helper, CONST|TMPVAR|CV, UNUSED, int type)
tmp_name = NULL;
} else {
if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(varname) == IS_UNDEF)) {
- GET_OP1_UNDEF_CV(varname, BP_VAR_R);
+ ZVAL_UNDEFINED_OP1();
+ }
+ name = zval_try_get_tmp_string(varname, &tmp_name);
+ if (UNEXPECTED(!name)) {
+ FREE_OP1();
+ ZVAL_UNDEF(EX_VAR(opline->result.var));
+ HANDLE_EXCEPTION();
}
- name = zval_get_tmp_string(varname, &tmp_name);
}
target_symbol_table = zend_get_target_symbol_table(opline->extended_value EXECUTE_DATA_CC);
@@ -1497,115 +1887,47 @@ ZEND_VM_HANDLER(89, ZEND_FETCH_IS, CONST|TMPVAR|CV, UNUSED, VAR_FETCH)
ZEND_VM_DISPATCH_TO_HELPER(zend_fetch_var_address_helper, type, BP_VAR_IS);
}
-ZEND_VM_HELPER(zend_fetch_static_prop_helper, CONST|TMPVAR|CV, UNUSED|CONST|VAR, int type)
+/* No specialization for op_types (CONST|TMPVAR|CV, UNUSED|CONST|VAR) */
+ZEND_VM_HELPER(zend_fetch_static_prop_helper, ANY, ANY, int type)
{
USE_OPLINE
- zend_free_op free_op1;
- zval *varname;
- zval *retval;
- zend_string *name, *tmp_name;
- zend_class_entry *ce;
+ zval *prop;
SAVE_OPLINE();
- do {
- if (OP2_TYPE == IS_CONST) {
- if (OP1_TYPE == IS_CONST && EXPECTED((ce = CACHED_PTR(opline->extended_value)) != NULL)) {
- retval = CACHED_PTR(opline->extended_value + sizeof(void*));
- break;
- } else {
- zval *class_name = RT_CONSTANT(opline, opline->op2);
-
- if (UNEXPECTED((ce = CACHED_PTR(opline->extended_value)) == NULL)) {
- ce = zend_fetch_class_by_name(Z_STR_P(class_name), 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)) {
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
- } else {
- ZEND_ASSERT(type == BP_VAR_IS);
- retval = &EG(uninitialized_zval);
- }
+ if (UNEXPECTED(zend_fetch_static_property_address(&prop, NULL, opline->extended_value & ~ZEND_FETCH_OBJ_FLAGS, type, opline->extended_value & ZEND_FETCH_OBJ_FLAGS OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) {
+ ZEND_ASSERT(EG(exception) || (type == BP_VAR_IS));
+ prop = &EG(uninitialized_zval);
}
if (type == BP_VAR_R || type == BP_VAR_IS) {
- ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), prop);
} else {
- ZVAL_INDIRECT(EX_VAR(opline->result.var), retval);
+ ZVAL_INDIRECT(EX_VAR(opline->result.var), prop);
}
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-ZEND_VM_HANDLER(173, ZEND_FETCH_STATIC_PROP_R, CONST|TMPVAR|CV, UNUSED|CLASS_FETCH|CONST|VAR, CACHE_SLOT)
+/* No specialization for op_types (CONST|TMPVAR|CV, UNUSED|CLASS_FETCH|CONST|VAR) */
+ZEND_VM_HANDLER(173, ZEND_FETCH_STATIC_PROP_R, ANY, CLASS_FETCH, 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, CACHE_SLOT)
+/* No specialization for op_types (CONST|TMPVAR|CV, UNUSED|CLASS_FETCH|CONST|VAR) */
+ZEND_VM_HANDLER(174, ZEND_FETCH_STATIC_PROP_W, ANY, CLASS_FETCH, FETCH_REF|DIM_OBJ_WRITE|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, CACHE_SLOT)
+/* No specialization for op_types (CONST|TMPVAR|CV, UNUSED|CLASS_FETCH|CONST|VAR) */
+ZEND_VM_HANDLER(175, ZEND_FETCH_STATIC_PROP_RW, ANY, CLASS_FETCH, 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, CACHE_SLOT)
+/* No specialization for op_types (CONST|TMPVAR|CV, UNUSED|CLASS_FETCH|CONST|VAR) */
+ZEND_VM_HANDLER(177, ZEND_FETCH_STATIC_PROP_FUNC_ARG, ANY, CLASS_FETCH, FETCH_REF|CACHE_SLOT)
{
int fetch_type =
(UNEXPECTED(ZEND_CALL_INFO(EX(call)) & ZEND_CALL_SEND_ARG_BY_REF)) ?
@@ -1613,12 +1935,14 @@ ZEND_VM_HANDLER(177, ZEND_FETCH_STATIC_PROP_FUNC_ARG, CONST|TMPVAR|CV, UNUSED|CL
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, CACHE_SLOT)
+/* No specialization for op_types (CONST|TMPVAR|CV, UNUSED|CLASS_FETCH|CONST|VAR) */
+ZEND_VM_HANDLER(178, ZEND_FETCH_STATIC_PROP_UNSET, ANY, CLASS_FETCH, 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, CACHE_SLOT)
+/* No specialization for op_types (CONST|TMPVAR|CV, UNUSED|CLASS_FETCH|CONST|VAR) */
+ZEND_VM_HANDLER(176, ZEND_FETCH_STATIC_PROP_IS, ANY, CLASS_FETCH, CACHE_SLOT)
{
ZEND_VM_DISPATCH_TO_HELPER(zend_fetch_static_prop_helper, type, BP_VAR_IS);
}
@@ -1627,7 +1951,7 @@ ZEND_VM_COLD_CONSTCONST_HANDLER(81, ZEND_FETCH_DIM_R, CONST|TMPVAR|CV, CONST|TMP
{
USE_OPLINE
zend_free_op free_op1, free_op2;
- zval *container, *dim, *value, *result;
+ zval *container, *dim, *value;
SAVE_OPLINE();
container = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
@@ -1636,8 +1960,7 @@ ZEND_VM_COLD_CONSTCONST_HANDLER(81, ZEND_FETCH_DIM_R, CONST|TMPVAR|CV, CONST|TMP
if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
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_DEREF(result, value);
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value);
} else if (EXPECTED(Z_TYPE_P(container) == IS_REFERENCE)) {
container = Z_REFVAL_P(container);
if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
@@ -1734,6 +2057,10 @@ ZEND_VM_COLD_HELPER(zend_use_undef_in_read_context_helper, ANY, ANY)
ZEND_VM_COLD_CONSTCONST_HANDLER(93, ZEND_FETCH_DIM_FUNC_ARG, CONST|TMP|VAR|CV, CONST|TMPVAR|UNUSED|NEXT|CV)
{
+#if !ZEND_VM_SPEC
+ USE_OPLINE
+#endif
+
if (UNEXPECTED(ZEND_CALL_INFO(EX(call)) & ZEND_CALL_SEND_ARG_BY_REF)) {
if ((OP1_TYPE & (IS_CONST|IS_TMP_VAR))) {
ZEND_VM_DISPATCH_TO_HELPER(zend_use_tmp_in_write_context_helper);
@@ -1792,12 +2119,14 @@ ZEND_VM_HOT_OBJ_HANDLER(82, ZEND_FETCH_OBJ_R, CONST|TMPVAR|UNUSED|THIS|CV, CONST
}
}
if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
- GET_OP1_UNDEF_CV(container, BP_VAR_R);
+ ZVAL_UNDEFINED_OP1();
}
if (OP2_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(offset) == IS_UNDEF)) {
- GET_OP2_UNDEF_CV(offset, BP_VAR_R);
+ ZVAL_UNDEFINED_OP2();
}
- ZEND_VM_C_GOTO(fetch_obj_r_no_object);
+ zend_wrong_property_read(offset);
+ ZVAL_NULL(EX_VAR(opline->result.var));
+ ZEND_VM_C_GOTO(fetch_obj_r_finish);
} while (0);
}
@@ -1807,7 +2136,7 @@ ZEND_VM_HOT_OBJ_HANDLER(82, ZEND_FETCH_OBJ_R, CONST|TMPVAR|UNUSED|THIS|CV, CONST
zval *retval;
if (OP2_TYPE == IS_CONST) {
- cache_slot = CACHE_ADDR(opline->extended_value);
+ cache_slot = CACHE_ADDR(opline->extended_value & ~ZEND_FETCH_REF /* FUNC_ARG fetch may contain it */);
if (EXPECTED(zobj->ce == CACHED_PTR_EX(cache_slot))) {
uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1);
@@ -1815,8 +2144,13 @@ ZEND_VM_HOT_OBJ_HANDLER(82, ZEND_FETCH_OBJ_R, CONST|TMPVAR|UNUSED|THIS|CV, CONST
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;
+ if (!ZEND_VM_SPEC || (OP1_TYPE & (IS_TMP_VAR|IS_VAR)) != 0) {
+ ZEND_VM_C_GOTO(fetch_obj_r_copy);
+ } else {
+ZEND_VM_C_LABEL(fetch_obj_r_fast_copy):
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
+ ZEND_VM_NEXT_OPCODE();
+ }
}
} else if (EXPECTED(zobj->properties != NULL)) {
if (!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET(prop_offset)) {
@@ -1830,8 +2164,12 @@ ZEND_VM_HOT_OBJ_HANDLER(82, ZEND_FETCH_OBJ_R, CONST|TMPVAR|UNUSED|THIS|CV, CONST
(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;
+ retval = &p->val;
+ if (!ZEND_VM_SPEC || (OP1_TYPE & (IS_TMP_VAR|IS_VAR)) != 0) {
+ ZEND_VM_C_GOTO(fetch_obj_r_copy);
+ } else {
+ ZEND_VM_C_GOTO(fetch_obj_r_fast_copy);
+ }
}
}
CACHE_PTR_EX(cache_slot + 1, (void*)ZEND_DYNAMIC_PROPERTY_OFFSET);
@@ -1840,36 +2178,35 @@ ZEND_VM_HOT_OBJ_HANDLER(82, ZEND_FETCH_OBJ_R, CONST|TMPVAR|UNUSED|THIS|CV, CONST
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;
+ if (!ZEND_VM_SPEC || (OP1_TYPE & (IS_TMP_VAR|IS_VAR)) != 0) {
+ ZEND_VM_C_GOTO(fetch_obj_r_copy);
+ } else {
+ ZEND_VM_C_GOTO(fetch_obj_r_fast_copy);
+ }
}
}
}
} else if (OP2_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(offset) == IS_UNDEF)) {
- GET_OP2_UNDEF_CV(offset, BP_VAR_R);
+ ZVAL_UNDEFINED_OP2();
}
- if (UNEXPECTED(zobj->handlers->read_property == NULL)) {
-ZEND_VM_C_LABEL(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));
+ 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);
- }
+ if (retval != EX_VAR(opline->result.var)) {
+ZEND_VM_C_LABEL(fetch_obj_r_copy):
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
+ } else if (UNEXPECTED(Z_ISREF_P(retval))) {
+ zend_unwrap_reference(retval);
}
} while (0);
+ZEND_VM_C_LABEL(fetch_obj_r_finish):
FREE_OP2();
FREE_OP1();
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-ZEND_VM_HANDLER(85, ZEND_FETCH_OBJ_W, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, CACHE_SLOT)
+ZEND_VM_HANDLER(85, ZEND_FETCH_OBJ_W, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, FETCH_REF|DIM_OBJ_WRITE|CACHE_SLOT)
{
USE_OPLINE
zend_free_op free_op1, free_op2;
@@ -1884,7 +2221,10 @@ ZEND_VM_HANDLER(85, ZEND_FETCH_OBJ_W, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, CACHE
property = GET_OP2_ZVAL_PTR(BP_VAR_R);
result = EX_VAR(opline->result.var);
- zend_fetch_property_address(result, container, OP1_TYPE, property, OP2_TYPE, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_W OPLINE_CC);
+ zend_fetch_property_address(
+ result, container, OP1_TYPE, property, OP2_TYPE,
+ ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_FETCH_OBJ_FLAGS) : NULL),
+ BP_VAR_W, opline->extended_value & ZEND_FETCH_OBJ_FLAGS, 1 OPLINE_CC EXECUTE_DATA_CC);
FREE_OP2();
if (OP1_TYPE == IS_VAR) {
FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result);
@@ -1899,14 +2239,14 @@ ZEND_VM_HANDLER(88, ZEND_FETCH_OBJ_RW, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, CACH
zval *property, *container, *result;
SAVE_OPLINE();
- container = GET_OP1_OBJ_ZVAL_PTR_PTR(BP_VAR_RW);
+ container = GET_OP1_OBJ_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW);
if (OP1_TYPE == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
ZEND_VM_DISPATCH_TO_HELPER(zend_this_not_in_object_context_helper);
}
property = GET_OP2_ZVAL_PTR(BP_VAR_R);
result = EX_VAR(opline->result.var);
- zend_fetch_property_address(result, container, OP1_TYPE, property, OP2_TYPE, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_RW OPLINE_CC);
+ zend_fetch_property_address(result, container, OP1_TYPE, property, OP2_TYPE, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_RW, 0, 1 OPLINE_CC EXECUTE_DATA_CC);
FREE_OP2();
if (OP1_TYPE == IS_VAR) {
FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result);
@@ -1941,7 +2281,8 @@ ZEND_VM_COLD_CONST_HANDLER(91, ZEND_FETCH_OBJ_IS, CONST|TMPVAR|UNUSED|THIS|CV, C
break;
}
}
- ZEND_VM_C_GOTO(fetch_obj_is_no_object);
+ ZVAL_NULL(EX_VAR(opline->result.var));
+ ZEND_VM_C_GOTO(fetch_obj_is_finish);
} while (0);
}
@@ -1959,8 +2300,13 @@ ZEND_VM_COLD_CONST_HANDLER(91, ZEND_FETCH_OBJ_IS, CONST|TMPVAR|UNUSED|THIS|CV, C
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;
+ if (!ZEND_VM_SPEC || (OP1_TYPE & (IS_TMP_VAR|IS_VAR)) != 0) {
+ ZEND_VM_C_GOTO(fetch_obj_is_copy);
+ } else {
+ZEND_VM_C_LABEL(fetch_obj_is_fast_copy):
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
+ ZEND_VM_NEXT_OPCODE();
+ }
}
} else if (EXPECTED(zobj->properties != NULL)) {
if (!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET(prop_offset)) {
@@ -1974,8 +2320,12 @@ ZEND_VM_COLD_CONST_HANDLER(91, ZEND_FETCH_OBJ_IS, CONST|TMPVAR|UNUSED|THIS|CV, C
(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;
+ retval = &p->val;
+ if (!ZEND_VM_SPEC || (OP1_TYPE & (IS_TMP_VAR|IS_VAR)) != 0) {
+ ZEND_VM_C_GOTO(fetch_obj_is_copy);
+ } else {
+ ZEND_VM_C_GOTO(fetch_obj_is_fast_copy);
+ }
}
}
CACHE_PTR_EX(cache_slot + 1, (void*)ZEND_DYNAMIC_PROPERTY_OFFSET);
@@ -1984,39 +2334,43 @@ ZEND_VM_COLD_CONST_HANDLER(91, ZEND_FETCH_OBJ_IS, CONST|TMPVAR|UNUSED|THIS|CV, C
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 (!ZEND_VM_SPEC || (OP1_TYPE & (IS_TMP_VAR|IS_VAR)) != 0) {
+ ZEND_VM_C_GOTO(fetch_obj_is_copy);
+ } else {
+ ZEND_VM_C_GOTO(fetch_obj_is_fast_copy);
+ }
}
}
}
}
- if (UNEXPECTED(zobj->handlers->read_property == NULL)) {
-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, cache_slot, 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);
- }
+ if (retval != EX_VAR(opline->result.var)) {
+ZEND_VM_C_LABEL(fetch_obj_is_copy):
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
+ } else if (UNEXPECTED(Z_ISREF_P(retval))) {
+ zend_unwrap_reference(retval);
}
} while (0);
+ZEND_VM_C_LABEL(fetch_obj_is_finish):
FREE_OP2();
FREE_OP1();
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-ZEND_VM_COLD_CONST_HANDLER(94, ZEND_FETCH_OBJ_FUNC_ARG, CONST|TMP|VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, CACHE_SLOT)
+ZEND_VM_COLD_CONST_HANDLER(94, ZEND_FETCH_OBJ_FUNC_ARG, CONST|TMP|VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, FETCH_REF|CACHE_SLOT)
{
+#if !ZEND_VM_SPEC
+ USE_OPLINE
+#endif
+
if (UNEXPECTED(ZEND_CALL_INFO(EX(call)) & ZEND_CALL_SEND_ARG_BY_REF)) {
/* Behave like FETCH_OBJ_W */
if ((OP1_TYPE & (IS_CONST|IS_TMP_VAR))) {
ZEND_VM_DISPATCH_TO_HELPER(zend_use_tmp_in_write_context_helper);
}
-
ZEND_VM_DISPATCH_TO_HANDLER(ZEND_FETCH_OBJ_W);
} else {
ZEND_VM_DISPATCH_TO_HANDLER(ZEND_FETCH_OBJ_R);
@@ -2030,7 +2384,7 @@ ZEND_VM_HANDLER(97, ZEND_FETCH_OBJ_UNSET, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, C
zval *container, *property, *result;
SAVE_OPLINE();
- container = GET_OP1_OBJ_ZVAL_PTR_PTR(BP_VAR_UNSET);
+ container = GET_OP1_OBJ_ZVAL_PTR_PTR_UNDEF(BP_VAR_UNSET);
if (OP1_TYPE == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
ZEND_VM_DISPATCH_TO_HELPER(zend_this_not_in_object_context_helper);
@@ -2038,7 +2392,7 @@ ZEND_VM_HANDLER(97, ZEND_FETCH_OBJ_UNSET, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, C
property = GET_OP2_ZVAL_PTR(BP_VAR_R);
result = EX_VAR(opline->result.var);
- zend_fetch_property_address(result, container, OP1_TYPE, property, OP2_TYPE, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_UNSET OPLINE_CC);
+ zend_fetch_property_address(result, container, OP1_TYPE, property, OP2_TYPE, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_UNSET, 0, 1 OPLINE_CC EXECUTE_DATA_CC);
FREE_OP2();
if (OP1_TYPE == IS_VAR) {
FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result);
@@ -2059,7 +2413,7 @@ ZEND_VM_HANDLER(98, ZEND_FETCH_LIST_R, CONST|TMPVARCV, CONST|TMPVAR|CV)
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-ZEND_VM_HANDLER(198, ZEND_FETCH_LIST_W, VAR, CONST|TMPVAR|CV)
+ZEND_VM_HANDLER(155, ZEND_FETCH_LIST_W, VAR, CONST|TMPVAR|CV)
{
USE_OPLINE
zend_free_op free_op1, free_op2;
@@ -2083,7 +2437,7 @@ ZEND_VM_HANDLER(198, ZEND_FETCH_LIST_W, VAR, CONST|TMPVAR|CV)
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-ZEND_VM_HANDLER(136, ZEND_ASSIGN_OBJ, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, CACHE_SLOT, SPEC(OP_DATA=CONST|TMP|VAR|CV))
+ZEND_VM_HANDLER(24, 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;
@@ -2100,34 +2454,52 @@ ZEND_VM_HANDLER(136, ZEND_ASSIGN_OBJ, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, CACHE
value = GET_OP_DATA_ZVAL_PTR(BP_VAR_R);
if (OP1_TYPE != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
- if (Z_ISREF_P(object)) {
+ if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) {
object = Z_REFVAL_P(object);
- if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
- ZEND_VM_C_GOTO(assign_object);
- }
+ ZEND_VM_C_GOTO(assign_object);
}
- if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
- FREE_OP_DATA();
- ZEND_VM_C_GOTO(exit_assign_obj);
+ object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC);
+ if (UNEXPECTED(!object)) {
+ value = &EG(uninitialized_zval);
+ ZEND_VM_C_GOTO(free_and_exit_assign_obj);
}
}
ZEND_VM_C_LABEL(assign_object):
if (OP2_TYPE == IS_CONST &&
EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(opline->extended_value))) {
- uintptr_t prop_offset = (uintptr_t)CACHED_PTR(opline->extended_value + sizeof(void*));
+ void **cache_slot = CACHE_ADDR(opline->extended_value);
+ uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1);
zend_object *zobj = Z_OBJ_P(object);
zval *property_val;
if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
property_val = OBJ_PROP(zobj, prop_offset);
if (Z_TYPE_P(property_val) != IS_UNDEF) {
+ zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2);
+
+ if (UNEXPECTED(prop_info != NULL)) {
+ zend_uchar orig_type = IS_UNDEF;
+
+ if (OP_DATA_TYPE == IS_CONST) {
+ orig_type = Z_TYPE_P(value);
+ }
+
+ value = zend_assign_to_typed_prop(prop_info, property_val, value EXECUTE_DATA_CC);
+
+ /* will remain valid, thus no need to check prop_info in future here */
+ if (OP_DATA_TYPE == IS_CONST && Z_TYPE_P(value) == orig_type) {
+ CACHE_PTR_EX(cache_slot + 2, NULL);
+ }
+ ZEND_VM_C_GOTO(free_and_exit_assign_obj);
+ } else {
ZEND_VM_C_LABEL(fast_assign_obj):
- value = zend_assign_to_variable(property_val, value, OP_DATA_TYPE);
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY(EX_VAR(opline->result.var), value);
+ value = zend_assign_to_variable(property_val, value, OP_DATA_TYPE, EX_USES_STRICT_TYPES());
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+ ZVAL_COPY(EX_VAR(opline->result.var), value);
+ }
+ ZEND_VM_C_GOTO(exit_assign_obj);
}
- ZEND_VM_C_GOTO(exit_assign_obj);
}
} else {
if (EXPECTED(zobj->properties != NULL)) {
@@ -2181,18 +2553,13 @@ ZEND_VM_C_LABEL(fast_assign_obj):
}
}
- if (!Z_OBJ_HT_P(object)->write_property) {
- zend_wrong_property_assignment(property OPLINE_CC EXECUTE_DATA_CC);
- FREE_OP_DATA();
- ZEND_VM_C_GOTO(exit_assign_obj);
- }
-
if (OP_DATA_TYPE == IS_CV || OP_DATA_TYPE == IS_VAR) {
ZVAL_DEREF(value);
}
- Z_OBJ_HT_P(object)->write_property(object, property, value, (OP2_TYPE == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL);
+ value = Z_OBJ_HT_P(object)->write_property(object, property, value, (OP2_TYPE == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL);
+ZEND_VM_C_LABEL(free_and_exit_assign_obj):
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
}
@@ -2204,30 +2571,62 @@ ZEND_VM_C_LABEL(exit_assign_obj):
ZEND_VM_NEXT_OPCODE_EX(1, 2);
}
-ZEND_VM_HANDLER(147, ZEND_ASSIGN_DIM, VAR|CV, CONST|TMPVAR|UNUSED|NEXT|CV, SPEC(OP_DATA=CONST|TMP|VAR|CV))
+/* No specialization for op_types (CONST|TMPVAR|CV, UNUSED|CONST|VAR) */
+ZEND_VM_HANDLER(25, ZEND_ASSIGN_STATIC_PROP, ANY, ANY, CACHE_SLOT, SPEC(OP_DATA=CONST|TMP|VAR|CV))
+{
+ USE_OPLINE
+ zend_free_op free_op_data;
+ zval *prop, *value;
+ zend_property_info *prop_info;
+
+ SAVE_OPLINE();
+
+ if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) {
+ FREE_UNFETCHED_OP_DATA();
+ UNDEF_RESULT();
+ HANDLE_EXCEPTION();
+ }
+
+ value = GET_OP_DATA_ZVAL_PTR(BP_VAR_R);
+
+ if (UNEXPECTED(prop_info->type)) {
+ value = zend_assign_to_typed_prop(prop_info, prop, value EXECUTE_DATA_CC);
+ FREE_OP_DATA();
+ } else {
+ value = zend_assign_to_variable(prop, value, OP_DATA_TYPE, EX_USES_STRICT_TYPES());
+ }
+
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+ ZVAL_COPY(EX_VAR(opline->result.var), value);
+ }
+
+ /* assign_static_prop has two opcodes! */
+ ZEND_VM_NEXT_OPCODE_EX(1, 2);
+}
+
+ZEND_VM_HANDLER(23, ZEND_ASSIGN_DIM, VAR|CV, CONST|TMPVAR|UNUSED|NEXT|CV, SPEC(OP_DATA=CONST|TMP|VAR|CV))
{
USE_OPLINE
zend_free_op free_op1;
- zval *object_ptr;
+ zval *object_ptr, *orig_object_ptr;
zend_free_op free_op2, free_op_data;
zval *value;
zval *variable_ptr;
zval *dim;
SAVE_OPLINE();
- object_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_W);
+ orig_object_ptr = object_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_W);
if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) {
ZEND_VM_C_LABEL(try_assign_dim_array):
+ value = GET_OP_DATA_ZVAL_PTR(BP_VAR_R);
SEPARATE_ARRAY(object_ptr);
if (OP2_TYPE == IS_UNUSED) {
- 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)) {
- FREE_OP_DATA();
zend_cannot_add_element();
ZEND_VM_C_GOTO(assign_dim_error);
} else if (OP_DATA_TYPE == IS_CV) {
@@ -2256,8 +2655,7 @@ 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 = zend_assign_to_variable(variable_ptr, value, OP_DATA_TYPE, EX_USES_STRICT_TYPES());
}
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
@@ -2283,9 +2681,7 @@ ZEND_VM_C_LABEL(try_assign_dim_array):
if (OP2_TYPE == IS_UNUSED) {
zend_use_new_element_for_string();
FREE_UNFETCHED_OP_DATA();
- FREE_OP1_VAR_PTR();
UNDEF_RESULT();
- HANDLE_EXCEPTION();
} else {
dim = GET_OP2_ZVAL_PTR(BP_VAR_R);
value = GET_OP_DATA_ZVAL_PTR_DEREF(BP_VAR_R);
@@ -2293,8 +2689,16 @@ ZEND_VM_C_LABEL(try_assign_dim_array):
FREE_OP_DATA();
}
} else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) {
- ZVAL_ARR(object_ptr, zend_new_array(8));
- ZEND_VM_C_GOTO(try_assign_dim_array);
+ if (Z_ISREF_P(orig_object_ptr)
+ && ZEND_REF_HAS_TYPE_SOURCES(Z_REF_P(orig_object_ptr))
+ && !zend_verify_ref_array_assignable(Z_REF_P(orig_object_ptr))) {
+ dim = GET_OP2_ZVAL_PTR(BP_VAR_R);
+ FREE_UNFETCHED_OP_DATA();
+ UNDEF_RESULT();
+ } else {
+ 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_use_scalar_as_array();
@@ -2315,7 +2719,7 @@ ZEND_VM_C_LABEL(assign_dim_error):
ZEND_VM_NEXT_OPCODE_EX(1, 2);
}
-ZEND_VM_HANDLER(38, ZEND_ASSIGN, VAR|CV, CONST|TMP|VAR|CV, SPEC(RETVAL))
+ZEND_VM_HANDLER(22, ZEND_ASSIGN, VAR|CV, CONST|TMP|VAR|CV, SPEC(RETVAL))
{
USE_OPLINE
zend_free_op free_op1, free_op2;
@@ -2332,7 +2736,7 @@ ZEND_VM_HANDLER(38, ZEND_ASSIGN, VAR|CV, CONST|TMP|VAR|CV, SPEC(RETVAL))
ZVAL_NULL(EX_VAR(opline->result.var));
}
} else {
- value = zend_assign_to_variable(variable_ptr, value, OP2_TYPE);
+ value = zend_assign_to_variable(variable_ptr, value, OP2_TYPE, EX_USES_STRICT_TYPES());
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
}
@@ -2343,7 +2747,7 @@ ZEND_VM_HANDLER(38, ZEND_ASSIGN, VAR|CV, CONST|TMP|VAR|CV, SPEC(RETVAL))
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-ZEND_VM_HANDLER(39, ZEND_ASSIGN_REF, VAR|CV, VAR|CV, SRC)
+ZEND_VM_HANDLER(30, ZEND_ASSIGN_REF, VAR|CV, VAR|CV, SRC)
{
USE_OPLINE
zend_free_op free_op1, free_op2;
@@ -2359,26 +2763,17 @@ ZEND_VM_HANDLER(39, ZEND_ASSIGN_REF, VAR|CV, VAR|CV, SRC)
} else if (OP1_TYPE == IS_VAR &&
UNEXPECTED(Z_TYPE_P(EX_VAR(opline->op1.var)) != IS_INDIRECT)) {
- zend_throw_error(NULL, "Cannot assign by reference to overloaded object");
- FREE_OP1_VAR_PTR();
- FREE_OP2_VAR_PTR();
- UNDEF_RESULT();
- HANDLE_EXCEPTION();
+ zend_throw_error(NULL, "Cannot assign by reference to an array dimension of an object");
+ variable_ptr = &EG(uninitialized_zval);
} 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))) {
- 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();
+ if (UNEXPECTED(!zend_wrong_assign_to_variable_reference(variable_ptr, value_ptr OPLINE_CC EXECUTE_DATA_CC))) {
+ variable_ptr = &EG(uninitialized_zval);
}
-
- /* op2 freed by assign_to_variable */
- FREE_OP1_VAR_PTR();
- ZEND_VM_NEXT_OPCODE();
} else {
zend_assign_to_variable_reference(variable_ptr, value_ptr);
}
@@ -2392,26 +2787,101 @@ ZEND_VM_HANDLER(39, ZEND_ASSIGN_REF, VAR|CV, VAR|CV, SRC)
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
+ZEND_VM_HANDLER(32, ZEND_ASSIGN_OBJ_REF, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, CACHE_SLOT|SRC, SPEC(OP_DATA=VAR|CV))
+{
+ USE_OPLINE
+ zend_free_op free_op1, free_op2, free_op_data;
+ zval *property, *container, *value_ptr;
+
+ SAVE_OPLINE();
+
+ container = GET_OP1_OBJ_ZVAL_PTR_PTR_UNDEF(BP_VAR_W);
+
+ if (OP1_TYPE == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
+ ZEND_VM_DISPATCH_TO_HELPER(zend_this_not_in_object_context_helper);
+ }
+
+ property = GET_OP2_ZVAL_PTR(BP_VAR_R);
+
+ value_ptr = GET_OP_DATA_ZVAL_PTR_PTR(BP_VAR_W);
+
+ if (ZEND_VM_SPEC) {
+ if (OP1_TYPE == IS_UNUSED) {
+ if (OP2_TYPE == IS_CONST) {
+ zend_assign_to_property_reference_this_const(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ } else {
+ zend_assign_to_property_reference_this_var(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ }
+ } else {
+ if (OP2_TYPE == IS_CONST) {
+ zend_assign_to_property_reference_var_const(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ } else {
+ zend_assign_to_property_reference_var_var(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ }
+ }
+ } else {
+ zend_assign_to_property_reference(container, OP1_TYPE, property, OP2_TYPE, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ }
+
+ FREE_OP1_VAR_PTR();
+ FREE_OP2();
+ FREE_OP_DATA_VAR_PTR();
+ ZEND_VM_NEXT_OPCODE_EX(1, 2);
+}
+
+/* No specialization for op_types (CONST|TMPVAR|CV, UNUSED|CONST|VAR) */
+ZEND_VM_HANDLER(33, ZEND_ASSIGN_STATIC_PROP_REF, ANY, ANY, CACHE_SLOT|SRC)
+{
+ USE_OPLINE
+ zend_free_op free_op_data;
+ zval *prop, *value_ptr;
+ zend_property_info *prop_info;
+
+ SAVE_OPLINE();
+
+ if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value & ~ZEND_RETURNS_FUNCTION, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) {
+ FREE_UNFETCHED_OP_DATA();
+ UNDEF_RESULT();
+ HANDLE_EXCEPTION();
+ }
+
+ value_ptr = GET_OP_DATA_ZVAL_PTR_PTR(BP_VAR_W);
+
+ if (OP_DATA_TYPE == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) {
+ prop = &EG(uninitialized_zval);
+ } else if (OP_DATA_TYPE == IS_VAR && (opline->extended_value & ZEND_RETURNS_FUNCTION) && UNEXPECTED(!Z_ISREF_P(value_ptr))) {
+ if (UNEXPECTED(!zend_wrong_assign_to_variable_reference(prop, value_ptr OPLINE_CC EXECUTE_DATA_CC))) {
+ prop = &EG(uninitialized_zval);
+ }
+ } else if (UNEXPECTED(prop_info->type)) {
+ prop = zend_assign_to_typed_property_reference(prop_info, prop, value_ptr EXECUTE_DATA_CC);
+ } else {
+ zend_assign_to_variable_reference(prop, value_ptr);
+ }
+
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+ ZVAL_COPY(EX_VAR(opline->result.var), prop);
+ }
+
+ FREE_OP_DATA_VAR_PTR();
+ ZEND_VM_NEXT_OPCODE_EX(1, 2);
+}
+
ZEND_VM_HOT_HELPER(zend_leave_helper, ANY, ANY)
{
zend_execute_data *old_execute_data;
uint32_t call_info = EX_CALL_INFO();
+ SAVE_OPLINE();
if (EXPECTED((call_info & (ZEND_CALL_CODE|ZEND_CALL_TOP|ZEND_CALL_HAS_SYMBOL_TABLE|ZEND_CALL_FREE_EXTRA_ARGS|ZEND_CALL_ALLOCATED)) == 0)) {
EG(current_execute_data) = EX(prev_execute_data);
i_free_compiled_variables(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)) {
+#ifdef ZEND_PREFER_RELOAD
+ call_info = EX_CALL_INFO();
#endif
- GC_DELREF(object);
- zend_object_store_ctor_failed(object);
- }
- OBJ_RELEASE(object);
+ if (UNEXPECTED(call_info & ZEND_CALL_RELEASE_THIS)) {
+ OBJ_RELEASE(Z_OBJ(execute_data->This));
} else if (UNEXPECTED(call_info & ZEND_CALL_CLOSURE)) {
OBJ_RELEASE(ZEND_CLOSURE_OBJECT(EX(func)));
}
@@ -2429,6 +2899,9 @@ ZEND_VM_HOT_HELPER(zend_leave_helper, ANY, ANY)
EG(current_execute_data) = EX(prev_execute_data);
i_free_compiled_variables(execute_data);
+#ifdef ZEND_PREFER_RELOAD
+ call_info = EX_CALL_INFO();
+#endif
if (UNEXPECTED(call_info & ZEND_CALL_HAS_SYMBOL_TABLE)) {
zend_clean_and_cache_symbol_table(EX(symbol_table));
}
@@ -2438,16 +2911,7 @@ ZEND_VM_HOT_HELPER(zend_leave_helper, ANY, ANY)
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);
+ OBJ_RELEASE(Z_OBJ(execute_data->This));
} else if (UNEXPECTED(call_info & ZEND_CALL_CLOSURE)) {
OBJ_RELEASE(ZEND_CLOSURE_OBJECT(EX(func)));
}
@@ -2467,6 +2931,9 @@ ZEND_VM_HOT_HELPER(zend_leave_helper, ANY, ANY)
zend_detach_symbol_table(execute_data);
destroy_op_array(&EX(func)->op_array);
efree_size(EX(func), sizeof(zend_op_array));
+#ifdef ZEND_PREFER_RELOAD
+ call_info = EX_CALL_INFO();
+#endif
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);
@@ -2483,6 +2950,9 @@ ZEND_VM_HOT_HELPER(zend_leave_helper, ANY, ANY)
if (EXPECTED((call_info & ZEND_CALL_CODE) == 0)) {
EG(current_execute_data) = EX(prev_execute_data);
i_free_compiled_variables(execute_data);
+#ifdef ZEND_PREFER_RELOAD
+ call_info = EX_CALL_INFO();
+#endif
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));
@@ -2533,7 +3003,7 @@ ZEND_VM_HOT_NOCONST_HANDLER(43, ZEND_JMPZ, CONST|TMPVAR|CV, JMP_ADDR)
} 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);
+ ZVAL_UNDEFINED_OP1();
if (UNEXPECTED(EG(exception))) {
HANDLE_EXCEPTION();
}
@@ -2564,7 +3034,7 @@ ZEND_VM_HOT_NOCONST_HANDLER(44, ZEND_JMPNZ, CONST|TMPVAR|CV, JMP_ADDR)
} 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);
+ ZVAL_UNDEFINED_OP1();
if (UNEXPECTED(EG(exception))) {
HANDLE_EXCEPTION();
}
@@ -2582,7 +3052,7 @@ ZEND_VM_HOT_NOCONST_HANDLER(44, ZEND_JMPNZ, CONST|TMPVAR|CV, JMP_ADDR)
ZEND_VM_JMP(opline);
}
-ZEND_VM_HOT_NOCONST_HANDLER(45, ZEND_JMPZNZ, CONST|TMPVAR|CV, JMP_ADDR, JMP_ADDR)
+ZEND_VM_HANDLER(45, ZEND_JMPZNZ, CONST|TMPVAR|CV, JMP_ADDR, JMP_ADDR)
{
USE_OPLINE
zend_free_op free_op1;
@@ -2596,7 +3066,7 @@ ZEND_VM_HOT_NOCONST_HANDLER(45, ZEND_JMPZNZ, CONST|TMPVAR|CV, JMP_ADDR, JMP_ADDR
} 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);
+ ZVAL_UNDEFINED_OP1();
if (UNEXPECTED(EG(exception))) {
HANDLE_EXCEPTION();
}
@@ -2630,7 +3100,7 @@ ZEND_VM_COLD_CONST_HANDLER(46, ZEND_JMPZ_EX, CONST|TMPVAR|CV, JMP_ADDR)
ZVAL_FALSE(EX_VAR(opline->result.var));
if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(val) == IS_UNDEF)) {
SAVE_OPLINE();
- GET_OP1_UNDEF_CV(val, BP_VAR_R);
+ ZVAL_UNDEFINED_OP1();
if (UNEXPECTED(EG(exception))) {
HANDLE_EXCEPTION();
}
@@ -2667,7 +3137,7 @@ ZEND_VM_COLD_CONST_HANDLER(47, ZEND_JMPNZ_EX, CONST|TMPVAR|CV, JMP_ADDR)
ZVAL_FALSE(EX_VAR(opline->result.var));
if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(val) == IS_UNDEF)) {
SAVE_OPLINE();
- GET_OP1_UNDEF_CV(val, BP_VAR_R);
+ ZVAL_UNDEFINED_OP1();
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
} else {
ZEND_VM_NEXT_OPCODE();
@@ -2732,14 +3202,18 @@ ZEND_VM_COLD_CONSTCONST_HANDLER(53, ZEND_FAST_CONCAT, CONST|TMPVAR|CV, CONST|TMP
} else {
ZVAL_STR(EX_VAR(opline->result.var), op2_str);
}
- FREE_OP1();
+ if (OP1_TYPE & (IS_TMP_VAR|IS_VAR)) {
+ zend_string_release_ex(op1_str, 0);
+ }
} 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 {
ZVAL_STR(EX_VAR(opline->result.var), op1_str);
}
- FREE_OP2();
+ if (OP2_TYPE & (IS_TMP_VAR|IS_VAR)) {
+ zend_string_release_ex(op2_str, 0);
+ }
} 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);
@@ -2747,14 +3221,20 @@ ZEND_VM_COLD_CONSTCONST_HANDLER(53, ZEND_FAST_CONCAT, CONST|TMPVAR|CV, CONST|TMP
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();
+ if (OP2_TYPE & (IS_TMP_VAR|IS_VAR)) {
+ zend_string_release_ex(op2_str, 0);
+ }
} 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();
- FREE_OP2();
+ if (OP1_TYPE & (IS_TMP_VAR|IS_VAR)) {
+ zend_string_release_ex(op1_str, 0);
+ }
+ if (OP2_TYPE & (IS_TMP_VAR|IS_VAR)) {
+ zend_string_release_ex(op2_str, 0);
+ }
}
ZEND_VM_NEXT_OPCODE();
}
@@ -2766,7 +3246,7 @@ ZEND_VM_COLD_CONSTCONST_HANDLER(53, ZEND_FAST_CONCAT, CONST|TMPVAR|CV, CONST|TMP
op1_str = zend_string_copy(Z_STR_P(op1));
} else {
if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
- GET_OP1_UNDEF_CV(op1, BP_VAR_R);
+ ZVAL_UNDEFINED_OP1();
}
op1_str = zval_get_string_func(op1);
}
@@ -2776,7 +3256,7 @@ ZEND_VM_COLD_CONSTCONST_HANDLER(53, ZEND_FAST_CONCAT, CONST|TMPVAR|CV, CONST|TMP
op2_str = zend_string_copy(Z_STR_P(op2));
} else {
if (OP2_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
- GET_OP2_UNDEF_CV(op2, BP_VAR_R);
+ ZVAL_UNDEFINED_OP2();
}
op2_str = zval_get_string_func(op2);
}
@@ -2847,7 +3327,7 @@ ZEND_VM_HANDLER(54, ZEND_ROPE_INIT, UNUSED, CONST|TMPVAR|CV, NUM)
} else {
SAVE_OPLINE();
if (OP2_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(var) == IS_UNDEF)) {
- GET_OP2_UNDEF_CV(var, BP_VAR_R);
+ ZVAL_UNDEFINED_OP2();
}
rope[0] = zval_get_string_func(var);
FREE_OP2();
@@ -2883,7 +3363,7 @@ ZEND_VM_HANDLER(55, ZEND_ROPE_ADD, TMP, CONST|TMPVAR|CV, NUM)
} else {
SAVE_OPLINE();
if (OP2_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(var) == IS_UNDEF)) {
- GET_OP2_UNDEF_CV(var, BP_VAR_R);
+ ZVAL_UNDEFINED_OP2();
}
rope[opline->extended_value] = zval_get_string_func(var);
FREE_OP2();
@@ -2921,7 +3401,7 @@ ZEND_VM_HANDLER(56, ZEND_ROPE_END, TMP, CONST|TMPVAR|CV, NUM)
} else {
SAVE_OPLINE();
if (OP2_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(var) == IS_UNDEF)) {
- GET_OP2_UNDEF_CV(var, BP_VAR_R);
+ ZVAL_UNDEFINED_OP2();
}
rope[opline->extended_value] = zval_get_string_func(var);
FREE_OP2();
@@ -2965,7 +3445,7 @@ ZEND_VM_HANDLER(109, ZEND_FETCH_CLASS, UNUSED|CLASS_FETCH, CONST|TMPVAR|UNUSED|C
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);
+ ce = zend_fetch_class_by_name(Z_STR_P(class_name), Z_STR_P(class_name + 1), opline->op1.num);
CACHE_PTR(opline->extended_value, ce);
}
Z_CE_P(EX_VAR(opline->result.var)) = ce;
@@ -2981,7 +3461,7 @@ ZEND_VM_C_LABEL(try_class_name):
ZEND_VM_C_GOTO(try_class_name);
} else {
if (OP2_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(class_name) == IS_UNDEF)) {
- GET_OP2_UNDEF_CV(class_name, BP_VAR_R);
+ ZVAL_UNDEFINED_OP2();
if (UNEXPECTED(EG(exception) != NULL)) {
HANDLE_EXCEPTION();
}
@@ -3027,7 +3507,7 @@ ZEND_VM_HOT_OBJ_HANDLER(112, ZEND_INIT_METHOD_CALL, CONST|TMPVAR|UNUSED|THIS|CV,
break;
}
} else if (OP2_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(function_name) == IS_UNDEF)) {
- GET_OP2_UNDEF_CV(function_name, BP_VAR_R);
+ ZVAL_UNDEFINED_OP2();
if (UNEXPECTED(EG(exception) != NULL)) {
FREE_OP1();
HANDLE_EXCEPTION();
@@ -3050,7 +3530,7 @@ ZEND_VM_HOT_OBJ_HANDLER(112, ZEND_INIT_METHOD_CALL, CONST|TMPVAR|UNUSED|THIS|CV,
}
}
if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
- object = GET_OP1_UNDEF_CV(object, BP_VAR_R);
+ object = ZVAL_UNDEFINED_OP1();
if (UNEXPECTED(EG(exception) != NULL)) {
if (OP2_TYPE != IS_CONST) {
FREE_OP2();
@@ -3078,13 +3558,6 @@ ZEND_VM_HOT_OBJ_HANDLER(112, ZEND_INIT_METHOD_CALL, CONST|TMPVAR|UNUSED|THIS|CV,
} else {
zend_object *orig_obj = obj;
- if (UNEXPECTED(obj->handlers->get_method == NULL)) {
- zend_throw_error(NULL, "Object does not support method calls");
- FREE_OP2();
- FREE_OP1();
- HANDLE_EXCEPTION();
- }
-
if (OP2_TYPE == IS_CONST) {
function_name = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
}
@@ -3109,7 +3582,7 @@ ZEND_VM_HOT_OBJ_HANDLER(112, ZEND_INIT_METHOD_CALL, CONST|TMPVAR|UNUSED|THIS|CV,
/* Reset "object" to trigger reference counting */
object = NULL;
}
- if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
+ if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!RUN_TIME_CACHE(&fbc->op_array))) {
init_func_run_time_cache(&fbc->op_array);
}
}
@@ -3118,27 +3591,29 @@ ZEND_VM_HOT_OBJ_HANDLER(112, ZEND_INIT_METHOD_CALL, CONST|TMPVAR|UNUSED|THIS|CV,
FREE_OP2();
}
- call_info = ZEND_CALL_NESTED_FUNCTION;
+ call_info = ZEND_CALL_NESTED_FUNCTION | ZEND_CALL_HAS_THIS;
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();
}
+ /* call static method */
+ obj = (zend_object*)called_scope;
+ call_info = ZEND_CALL_NESTED_FUNCTION;
} 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;
if (OP1_TYPE == IS_CV) {
GC_ADDREF(obj); /* For $this pointer */
} else if (free_op1 != object) {
GC_ADDREF(obj); /* For $this pointer */
FREE_OP1();
}
+ /* CV may be changed indirectly (e.g. when it's a reference) */
+ call_info = ZEND_CALL_NESTED_FUNCTION | ZEND_CALL_HAS_THIS | ZEND_CALL_RELEASE_THIS;
}
call = zend_vm_stack_push_call_frame(call_info,
- fbc, opline->extended_value, called_scope, obj);
+ fbc, opline->extended_value, obj);
call->prev_execute_data = EX(call);
EX(call) = call;
@@ -3150,7 +3625,7 @@ ZEND_VM_HANDLER(113, ZEND_INIT_STATIC_METHOD_CALL, UNUSED|CLASS_FETCH|CONST|VAR,
USE_OPLINE
zval *function_name;
zend_class_entry *ce;
- zend_object *object;
+ uint32_t call_info;
zend_function *fbc;
zend_execute_data *call;
@@ -3160,7 +3635,7 @@ ZEND_VM_HANDLER(113, ZEND_INIT_STATIC_METHOD_CALL, UNUSED|CLASS_FETCH|CONST|VAR,
/* 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);
+ ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op1)), Z_STR_P(RT_CONSTANT(opline, opline->op1) + 1), ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
if (UNEXPECTED(ce == NULL)) {
ZEND_ASSERT(EG(exception));
FREE_UNFETCHED_OP2();
@@ -3202,7 +3677,7 @@ ZEND_VM_HANDLER(113, ZEND_INIT_STATIC_METHOD_CALL, UNUSED|CLASS_FETCH|CONST|VAR,
break;
}
} else if (OP2_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(function_name) == IS_UNDEF)) {
- GET_OP2_UNDEF_CV(function_name, BP_VAR_R);
+ ZVAL_UNDEFINED_OP2();
if (UNEXPECTED(EG(exception) != NULL)) {
HANDLE_EXCEPTION();
}
@@ -3231,7 +3706,7 @@ ZEND_VM_HANDLER(113, ZEND_INIT_STATIC_METHOD_CALL, UNUSED|CLASS_FETCH|CONST|VAR,
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)) {
+ if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!RUN_TIME_CACHE(&fbc->op_array))) {
init_func_run_time_cache(&fbc->op_array);
}
if (OP2_TYPE != IS_CONST) {
@@ -3247,38 +3722,39 @@ ZEND_VM_HANDLER(113, ZEND_INIT_STATIC_METHOD_CALL, UNUSED|CLASS_FETCH|CONST|VAR,
HANDLE_EXCEPTION();
}
fbc = ce->constructor;
- if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
+ if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!RUN_TIME_CACHE(&fbc->op_array))) {
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;
+ ce = (zend_class_entry*)Z_OBJ(EX(This));
+ call_info = ZEND_CALL_NESTED_FUNCTION | ZEND_CALL_HAS_THIS;
} else {
zend_non_static_method_call(fbc);
if (UNEXPECTED(EG(exception) != NULL)) {
HANDLE_EXCEPTION();
}
+ ZEND_VM_C_GOTO(check_parent_and_self);
}
- }
-
- if (OP1_TYPE == IS_UNUSED) {
+ } else {
+ZEND_VM_C_LABEL(check_parent_and_self):
/* 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 (OP1_TYPE == IS_UNUSED
+ && ((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_info = ZEND_CALL_NESTED_FUNCTION;
}
- call = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
- fbc, opline->extended_value, ce, object);
+ call = zend_vm_stack_push_call_frame(call_info,
+ fbc, opline->extended_value, ce);
call->prev_execute_data = EX(call);
EX(call) = call;
@@ -3297,16 +3773,16 @@ ZEND_VM_HOT_HANDLER(59, ZEND_INIT_FCALL_BY_NAME, ANY, CONST, NUM|CACHE_SLOT)
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)) {
- ZEND_VM_DISPATCH_TO_HELPER(zend_undefined_function_helper, function_name, function_name);
+ ZEND_VM_DISPATCH_TO_HELPER(zend_undefined_function_helper);
}
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);
+ if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!RUN_TIME_CACHE(&fbc->op_array))) {
+ init_func_run_time_cache(&fbc->op_array);
}
CACHE_PTR(opline->result.num, fbc);
}
- call = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
- fbc, opline->extended_value, NULL, NULL);
+ call = _zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
+ fbc, opline->extended_value, NULL);
call->prev_execute_data = EX(call);
EX(call) = call;
@@ -3335,7 +3811,7 @@ ZEND_VM_C_LABEL(try_function_name):
ZEND_VM_C_GOTO(try_function_name);
} else {
if (OP2_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(function_name) == IS_UNDEF)) {
- GET_OP2_UNDEF_CV(function_name, BP_VAR_R);
+ ZVAL_UNDEFINED_OP2();
if (UNEXPECTED(EG(exception) != NULL)) {
HANDLE_EXCEPTION();
}
@@ -3376,8 +3852,7 @@ ZEND_VM_HANDLER(118, ZEND_INIT_USER_CALL, CONST, CONST|TMPVAR|CV, NUM)
zend_fcall_info_cache fcc;
char *error = NULL;
zend_function *func;
- zend_class_entry *called_scope;
- zend_object *object;
+ void *object_or_called_scope;
zend_execute_data *call;
uint32_t call_info = ZEND_CALL_NESTED_FUNCTION | ZEND_CALL_DYNAMIC;
@@ -3385,8 +3860,6 @@ ZEND_VM_HANDLER(118, ZEND_INIT_USER_CALL, CONST, CONST|TMPVAR|CV, NUM)
function_name = GET_OP2_ZVAL_PTR(BP_VAR_R);
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 */
@@ -3396,6 +3869,7 @@ ZEND_VM_HANDLER(118, ZEND_INIT_USER_CALL, CONST, CONST|TMPVAR|CV, NUM)
HANDLE_EXCEPTION();
}
}
+ object_or_called_scope = fcc.called_scope;
if (func->common.fn_flags & ZEND_ACC_CLOSURE) {
/* Delay closure destruction until its invocation */
GC_ADDREF(ZEND_CLOSURE_OBJECT(func));
@@ -3403,23 +3877,27 @@ ZEND_VM_HANDLER(118, ZEND_INIT_USER_CALL, CONST, CONST|TMPVAR|CV, NUM)
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 */
+ if (fcc.object) {
+ object_or_called_scope = fcc.object;
+ call_info |= ZEND_CALL_HAS_THIS;
+ }
+ } else if (fcc.object) {
+ GC_ADDREF(fcc.object); /* For $this pointer */
+ object_or_called_scope = fcc.object;
+ call_info |= ZEND_CALL_RELEASE_THIS | ZEND_CALL_HAS_THIS;
}
FREE_OP2();
if ((OP2_TYPE & (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);
+ } else if (call_info & ZEND_CALL_RELEASE_THIS) {
+ zend_object_release(fcc.object);
}
HANDLE_EXCEPTION();
}
- if (EXPECTED(func->type == ZEND_USER_FUNCTION) && UNEXPECTED(!func->op_array.run_time_cache)) {
+ if (EXPECTED(func->type == ZEND_USER_FUNCTION) && UNEXPECTED(!RUN_TIME_CACHE(&func->op_array))) {
init_func_run_time_cache(&func->op_array);
}
} else {
@@ -3430,12 +3908,11 @@ ZEND_VM_HANDLER(118, ZEND_INIT_USER_CALL, CONST, CONST|TMPVAR|CV, NUM)
HANDLE_EXCEPTION();
}
func = (zend_function*)&zend_pass_function;
- called_scope = NULL;
- object = NULL;
+ object_or_called_scope = NULL;
}
call = zend_vm_stack_push_call_frame(call_info,
- func, opline->extended_value, called_scope, object);
+ func, opline->extended_value, object_or_called_scope);
call->prev_execute_data = EX(call);
EX(call) = call;
@@ -3457,18 +3934,18 @@ ZEND_VM_HOT_HANDLER(69, ZEND_INIT_NS_FCALL_BY_NAME, ANY, CONST, NUM|CACHE_SLOT)
if (func == NULL) {
func = zend_hash_find_ex(EG(function_table), Z_STR_P(func_name + 2), 1);
if (UNEXPECTED(func == NULL)) {
- ZEND_VM_DISPATCH_TO_HELPER(zend_undefined_function_helper, function_name, func_name);
+ ZEND_VM_DISPATCH_TO_HELPER(zend_undefined_function_helper);
}
}
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);
+ if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!RUN_TIME_CACHE(&fbc->op_array))) {
+ init_func_run_time_cache(&fbc->op_array);
}
CACHE_PTR(opline->result.num, fbc);
}
- call = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
- fbc, opline->extended_value, NULL, NULL);
+ call = _zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
+ fbc, opline->extended_value, NULL);
call->prev_execute_data = EX(call);
EX(call) = call;
@@ -3478,7 +3955,6 @@ ZEND_VM_HOT_HANDLER(69, ZEND_INIT_NS_FCALL_BY_NAME, ANY, CONST, NUM|CACHE_SLOT)
ZEND_VM_HOT_HANDLER(61, ZEND_INIT_FCALL, NUM, CONST, NUM|CACHE_SLOT)
{
USE_OPLINE
- zend_free_op free_op2;
zval *fname;
zval *func;
zend_function *fbc;
@@ -3486,21 +3962,21 @@ ZEND_VM_HOT_HANDLER(61, ZEND_INIT_FCALL, NUM, CONST, NUM|CACHE_SLOT)
fbc = CACHED_PTR(opline->result.num);
if (UNEXPECTED(fbc == NULL)) {
- fname = GET_OP2_ZVAL_PTR(BP_VAR_R);
+ fname = (zval*)RT_CONSTANT(opline, opline->op2);
func = zend_hash_find_ex(EG(function_table), Z_STR_P(fname), 1);
if (UNEXPECTED(func == NULL)) {
- ZEND_VM_DISPATCH_TO_HELPER(zend_undefined_function_helper, function_name, fname);
+ ZEND_VM_DISPATCH_TO_HELPER(zend_undefined_function_helper);
}
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);
+ if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!RUN_TIME_CACHE(&fbc->op_array))) {
+ init_func_run_time_cache(&fbc->op_array);
}
CACHE_PTR(opline->result.num, fbc);
}
- call = zend_vm_stack_push_call_frame_ex(
+ call = _zend_vm_stack_push_call_frame_ex(
opline->op1.num, ZEND_CALL_NESTED_FUNCTION,
- fbc, opline->extended_value, NULL, NULL);
+ fbc, opline->extended_value, NULL);
call->prev_execute_data = EX(call);
EX(call) = call;
@@ -3540,7 +4016,7 @@ ZEND_VM_HOT_HANDLER(129, ZEND_DO_ICALL, ANY, ANY, SPEC(RETVAL))
zend_vm_stack_free_call_frame(call);
if (!RETURN_VALUE_USED(opline)) {
- zval_ptr_dtor(ret);
+ i_zval_ptr_dtor(ret);
}
if (UNEXPECTED(EG(exception) != NULL)) {
@@ -3565,13 +4041,12 @@ ZEND_VM_HOT_HANDLER(130, ZEND_DO_UCALL, ANY, ANY, SPEC(RETVAL))
ret = NULL;
if (RETURN_VALUE_USED(opline)) {
ret = EX_VAR(opline->result.var);
- ZVAL_NULL(ret);
}
call->prev_execute_data = execute_data;
execute_data = call;
i_init_func_execute_data(&fbc->op_array, ret, 0 EXECUTE_DATA_CC);
- LOAD_OPLINE();
+ LOAD_OPLINE_EX();
ZEND_VM_ENTER_EX();
}
@@ -3590,13 +4065,12 @@ ZEND_VM_HOT_HANDLER(131, ZEND_DO_FCALL_BY_NAME, ANY, ANY, SPEC(RETVAL))
ret = NULL;
if (RETURN_VALUE_USED(opline)) {
ret = EX_VAR(opline->result.var);
- ZVAL_NULL(ret);
}
call->prev_execute_data = execute_data;
execute_data = call;
i_init_func_execute_data(&fbc->op_array, ret, 0 EXECUTE_DATA_CC);
- LOAD_OPLINE();
+ LOAD_OPLINE_EX();
ZEND_VM_ENTER_EX();
} else {
@@ -3606,8 +4080,12 @@ ZEND_VM_HOT_HANDLER(131, ZEND_DO_FCALL_BY_NAME, ANY, ANY, SPEC(RETVAL))
if (UNEXPECTED((fbc->common.fn_flags & ZEND_ACC_DEPRECATED) != 0)) {
zend_deprecated_function(fbc);
if (UNEXPECTED(EG(exception) != NULL)) {
- UNDEF_RESULT();
- HANDLE_EXCEPTION();
+ UNDEF_RESULT();
+ if (!RETURN_VALUE_USED(opline)) {
+ ret = &retval;
+ ZVAL_UNDEF(ret);
+ }
+ ZEND_VM_C_GOTO(fcall_by_name_end);
}
}
@@ -3616,10 +4094,12 @@ ZEND_VM_HOT_HANDLER(131, ZEND_DO_FCALL_BY_NAME, ANY, ANY, SPEC(RETVAL))
if (UNEXPECTED(fbc->common.fn_flags & ZEND_ACC_HAS_TYPE_HINTS)
&& UNEXPECTED(!zend_verify_internal_arg_types(fbc, call))) {
- zend_vm_stack_free_call_frame(call);
- zend_rethrow_exception(execute_data);
- UNDEF_RESULT();
- HANDLE_EXCEPTION();
+ UNDEF_RESULT();
+ if (!RETURN_VALUE_USED(opline)) {
+ ret = &retval;
+ ZVAL_UNDEF(ret);
+ }
+ ZEND_VM_C_GOTO(fcall_by_name_end);
}
ret = RETURN_VALUE_USED(opline) ? EX_VAR(opline->result.var) : &retval;
@@ -3637,11 +4117,13 @@ ZEND_VM_HOT_HANDLER(131, ZEND_DO_FCALL_BY_NAME, ANY, ANY, SPEC(RETVAL))
#endif
EG(current_execute_data) = execute_data;
+
+ZEND_VM_C_LABEL(fcall_by_name_end):
zend_vm_stack_free_args(call);
zend_vm_stack_free_call_frame(call);
if (!RETURN_VALUE_USED(opline)) {
- zval_ptr_dtor(ret);
+ i_zval_ptr_dtor(ret);
}
}
@@ -3658,20 +4140,25 @@ ZEND_VM_HOT_HANDLER(60, ZEND_DO_FCALL, ANY, ANY, SPEC(RETVAL))
USE_OPLINE
zend_execute_data *call = EX(call);
zend_function *fbc = call->func;
- zend_object *object;
zval *ret;
+ zval retval;
SAVE_OPLINE();
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_VM_DISPATCH_TO_HELPER(zend_abstract_method_helper, fbc, fbc);
- }
- if (UNEXPECTED((fbc->common.fn_flags & ZEND_ACC_DEPRECATED) != 0)) {
+ zend_abstract_method(fbc);
+ZEND_VM_C_LABEL(fcall_except):
+ UNDEF_RESULT();
+ if (!RETURN_VALUE_USED(opline)) {
+ ret = &retval;
+ ZVAL_UNDEF(ret);
+ }
+ ZEND_VM_C_GOTO(fcall_end);
+ } else {
zend_deprecated_function(fbc);
if (UNEXPECTED(EG(exception) != NULL)) {
- UNDEF_RESULT();
- HANDLE_EXCEPTION();
+ ZEND_VM_C_GOTO(fcall_except);
}
}
}
@@ -3680,7 +4167,6 @@ ZEND_VM_HOT_HANDLER(60, ZEND_DO_FCALL, ANY, ANY, SPEC(RETVAL))
ret = NULL;
if (RETURN_VALUE_USED(opline)) {
ret = EX_VAR(opline->result.var);
- ZVAL_NULL(ret);
}
call->prev_execute_data = execute_data;
@@ -3688,24 +4174,22 @@ ZEND_VM_HOT_HANDLER(60, ZEND_DO_FCALL, ANY, ANY, SPEC(RETVAL))
i_init_func_execute_data(&fbc->op_array, ret, 1 EXECUTE_DATA_CC);
if (EXPECTED(zend_execute_ex == execute_ex)) {
- LOAD_OPLINE();
+ LOAD_OPLINE_EX();
ZEND_VM_ENTER_EX();
} else {
+ SAVE_OPLINE_EX();
execute_data = EX(prev_execute_data);
LOAD_OPLINE();
ZEND_ADD_CALL_FLAG(call, ZEND_CALL_TOP);
zend_execute_ex(call);
}
} else if (EXPECTED(fbc->type < ZEND_USER_FUNCTION)) {
- zval retval;
-
call->prev_execute_data = execute_data;
EG(current_execute_data) = call;
if (UNEXPECTED(fbc->common.fn_flags & ZEND_ACC_HAS_TYPE_HINTS)
&& UNEXPECTED(!zend_verify_internal_arg_types(fbc, call))) {
- UNDEF_RESULT();
- ZEND_VM_C_GOTO(fcall_end);
+ ZEND_VM_C_GOTO(fcall_except);
}
ret = RETURN_VALUE_USED(opline) ? EX_VAR(opline->result.var) : &retval;
@@ -3728,15 +4212,13 @@ ZEND_VM_HOT_HANDLER(60, ZEND_DO_FCALL, ANY, ANY, SPEC(RETVAL))
#endif
EG(current_execute_data) = execute_data;
- zend_vm_stack_free_args(call);
+ZEND_VM_C_LABEL(fcall_end):
+ zend_vm_stack_free_args(call);
if (!RETURN_VALUE_USED(opline)) {
- zval_ptr_dtor(ret);
+ i_zval_ptr_dtor(ret);
}
-
} else { /* ZEND_OVERLOADED_FUNCTION */
- zval retval;
-
ret = RETURN_VALUE_USED(opline) ? EX_VAR(opline->result.var) : &retval;
call->prev_execute_data = execute_data;
@@ -3751,18 +4233,8 @@ ZEND_VM_HOT_HANDLER(60, ZEND_DO_FCALL, ANY, ANY, SPEC(RETVAL))
}
}
-ZEND_VM_C_LABEL(fcall_end):
if (UNEXPECTED(ZEND_CALL_INFO(call) & ZEND_CALL_RELEASE_THIS)) {
- object = Z_OBJ(call->This);
-#if 0
- if (UNEXPECTED(EG(exception) != NULL) && (opline->op1.num & ZEND_CALL_CTOR)) {
-#else
- if (UNEXPECTED(EG(exception) != NULL) && (ZEND_CALL_INFO(call) & ZEND_CALL_CTOR)) {
-#endif
- GC_DELREF(object);
- zend_object_store_ctor_failed(object);
- }
- OBJ_RELEASE(object);
+ OBJ_RELEASE(Z_OBJ(call->This));
}
zend_vm_stack_free_call_frame(call);
@@ -3784,7 +4256,7 @@ ZEND_VM_COLD_CONST_HANDLER(124, ZEND_VERIFY_RETURN_TYPE, CONST|TMP|VAR|UNUSED|CV
zend_verify_missing_return_type(EX(func), CACHE_ADDR(opline->op2.num));
} else {
/* prevents "undefined variable opline" errors */
-#if !defined(ZEND_VM_SPEC) || (OP1_TYPE != IS_UNUSED)
+#if !ZEND_VM_SPEC || (OP1_TYPE != IS_UNUSED)
zval *retval_ref, *retval_ptr;
zend_free_op free_op1;
zend_arg_info *ret_info = EX(func)->common.arg_info - 1;
@@ -3825,7 +4297,7 @@ ZEND_VM_COLD_CONST_HANDLER(124, ZEND_VERIFY_RETURN_TYPE, CONST|TMP|VAR|UNUSED|CV
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-ZEND_VM_HOT_HANDLER(62, ZEND_RETURN, CONST|TMP|VAR|CV, ANY)
+ZEND_VM_INLINE_HANDLER(62, ZEND_RETURN, CONST|TMP|VAR|CV, ANY)
{
USE_OPLINE
zval *retval_ptr;
@@ -3836,7 +4308,7 @@ ZEND_VM_HOT_HANDLER(62, ZEND_RETURN, CONST|TMP|VAR|CV, ANY)
return_value = EX(return_value);
if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(retval_ptr) == IS_UNDEF)) {
SAVE_OPLINE();
- retval_ptr = GET_OP1_UNDEF_CV(retval_ptr, BP_VAR_R);
+ retval_ptr = ZVAL_UNDEFINED_OP1();
if (return_value) {
ZVAL_NULL(return_value);
}
@@ -3856,25 +4328,29 @@ ZEND_VM_HOT_HANDLER(62, ZEND_RETURN, CONST|TMP|VAR|CV, ANY)
}
}
} else if (OP1_TYPE == 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))) {
- zend_refcounted *ref = Z_COUNTED_P(retval_ptr);
- if (GC_MAY_LEAK(ref)) {
- gc_possible_root(ref);
+ do {
+ if (Z_OPT_REFCOUNTED_P(retval_ptr)) {
+ if (EXPECTED(!Z_OPT_ISREF_P(retval_ptr))) {
+ if (EXPECTED(!(EX_CALL_INFO() & ZEND_CALL_CODE))) {
+ zend_refcounted *ref = Z_COUNTED_P(retval_ptr);
+ ZVAL_COPY_VALUE(return_value, retval_ptr);
+ if (GC_MAY_LEAK(ref)) {
+ gc_possible_root(ref);
+ }
+ ZVAL_NULL(retval_ptr);
+ break;
+ } else {
+ Z_ADDREF_P(retval_ptr);
}
- ZVAL_NULL(retval_ptr);
} else {
- Z_ADDREF_P(return_value);
+ retval_ptr = Z_REFVAL_P(retval_ptr);
+ if (Z_OPT_REFCOUNTED_P(retval_ptr)) {
+ Z_ADDREF_P(retval_ptr);
+ }
}
- } else {
- retval_ptr = Z_REFVAL_P(retval_ptr);
- ZVAL_COPY(return_value, retval_ptr);
}
- } else {
ZVAL_COPY_VALUE(return_value, retval_ptr);
- }
+ } while (0);
} else /* if (OP1_TYPE == IS_VAR) */ {
if (UNEXPECTED(Z_ISREF_P(retval_ptr))) {
zend_refcounted *ref = Z_COUNTED_P(retval_ptr);
@@ -3928,8 +4404,8 @@ ZEND_VM_COLD_CONST_HANDLER(111, ZEND_RETURN_BY_REF, CONST|TMP|VAR|CV, ANY, SRC)
retval_ptr = GET_OP1_ZVAL_PTR_PTR(BP_VAR_W);
if (OP1_TYPE == IS_VAR) {
- if (retval_ptr == &EG(uninitialized_zval) ||
- (opline->extended_value == ZEND_RETURNS_FUNCTION && !Z_ISREF_P(retval_ptr))) {
+ ZEND_ASSERT(retval_ptr != &EG(uninitialized_zval));
+ if (opline->extended_value == ZEND_RETURNS_FUNCTION && !Z_ISREF_P(retval_ptr)) {
zend_error(E_NOTICE, "Only variable references should be returned by reference");
if (EX(return_value)) {
ZVAL_NEW_REF(EX(return_value), retval_ptr);
@@ -3955,7 +4431,7 @@ ZEND_VM_COLD_CONST_HANDLER(111, ZEND_RETURN_BY_REF, CONST|TMP|VAR|CV, ANY, SRC)
ZEND_VM_DISPATCH_TO_HELPER(zend_leave_helper);
}
-ZEND_VM_HANDLER(41, ZEND_GENERATOR_CREATE, ANY, ANY)
+ZEND_VM_HANDLER(139, ZEND_GENERATOR_CREATE, ANY, ANY)
{
zval *return_value = EX(return_value);
@@ -4000,7 +4476,7 @@ ZEND_VM_HANDLER(41, ZEND_GENERATOR_CREATE, ANY, ANY)
gen_execute_data->return_value = (zval*)generator;
call_info = Z_TYPE_INFO(EX(This));
if ((call_info & Z_TYPE_MASK) == IS_OBJECT
- && (!(call_info & ((ZEND_CALL_CLOSURE|ZEND_CALL_RELEASE_THIS) << ZEND_CALL_INFO_SHIFT))
+ && (!(call_info & (ZEND_CALL_CLOSURE|ZEND_CALL_RELEASE_THIS))
/* Bug #72523 */
|| UNEXPECTED(zend_execute_ex != execute_ex))) {
ZEND_ADD_CALL_FLAG_EX(call_info, ZEND_CALL_RELEASE_THIS);
@@ -4093,7 +4569,7 @@ ZEND_VM_COLD_CONST_HANDLER(108, ZEND_THROW, CONST|TMP|VAR|CV, ANY)
}
}
if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(value) == IS_UNDEF)) {
- GET_OP1_UNDEF_CV(value, BP_VAR_R);
+ ZVAL_UNDEFINED_OP1();
if (UNEXPECTED(EG(exception) != NULL)) {
HANDLE_EXCEPTION();
}
@@ -4130,7 +4606,7 @@ ZEND_VM_HANDLER(107, ZEND_CATCH, CONST, JMP_ADDR, LAST_CATCH|CACHE_SLOT)
}
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);
+ catch_ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op1)), Z_STR_P(RT_CONSTANT(opline, opline->op1) + 1), ZEND_FETCH_CLASS_NO_AUTOLOAD);
CACHE_PTR(opline->extended_value & ~ZEND_LAST_CATCH, catch_ce);
}
@@ -4154,17 +4630,15 @@ ZEND_VM_HANDLER(107, ZEND_CATCH, CONST, JMP_ADDR, LAST_CATCH|CACHE_SLOT)
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 {
+ {
+ /* Always perform a strict assignment. There is a reasonable expectation that if you
+ * write "catch (Exception $e)" then $e will actually be instanceof Exception. As such,
+ * we should not permit coercion to string here. */
+ zval tmp;
+ ZVAL_OBJ(&tmp, exception);
EG(exception) = NULL;
- ZEND_VM_NEXT_OPCODE();
+ zend_assign_to_variable(ex, &tmp, IS_TMP_VAR, /* strict */ 1);
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
}
@@ -4234,7 +4708,7 @@ ZEND_VM_HOT_HANDLER(117, ZEND_SEND_VAR, VAR|CV, NUM)
varptr = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(varptr) == IS_UNDEF)) {
SAVE_OPLINE();
- GET_OP1_UNDEF_CV(varptr, BP_VAR_R);
+ ZVAL_UNDEFINED_OP1();
arg = ZEND_CALL_VAR(EX(call), opline->result.var);
ZVAL_NULL(arg);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
@@ -4278,6 +4752,7 @@ ZEND_VM_HANDLER(106, ZEND_SEND_VAR_NO_REF, VAR, NUM)
}
SAVE_OPLINE();
+ ZVAL_NEW_REF(arg, arg);
zend_error(E_NOTICE, "Only variables should be passed by reference");
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
@@ -4318,6 +4793,7 @@ ZEND_VM_HOT_SEND_HANDLER(50, ZEND_SEND_VAR_NO_REF_EX, VAR, NUM, SPEC(QUICK_ARG))
}
SAVE_OPLINE();
+ ZVAL_NEW_REF(arg, arg);
zend_error(E_NOTICE, "Only variables should be passed by reference");
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
@@ -4368,7 +4844,7 @@ ZEND_VM_C_LABEL(send_var_by_ref):
varptr = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(varptr) == IS_UNDEF)) {
SAVE_OPLINE();
- GET_OP1_UNDEF_CV(varptr, BP_VAR_R);
+ ZVAL_UNDEFINED_OP1();
arg = ZEND_CALL_VAR(EX(call), opline->result.var);
ZVAL_NULL(arg);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
@@ -4590,7 +5066,7 @@ ZEND_VM_C_LABEL(send_again):
ZEND_VM_C_GOTO(send_again);
} else {
if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(args) == IS_UNDEF)) {
- GET_OP1_UNDEF_CV(args, BP_VAR_R);
+ ZVAL_UNDEFINED_OP1();
}
zend_error(E_WARNING, "Only arrays and Traversables can be unpacked");
}
@@ -4618,13 +5094,12 @@ 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_CLOSURE_OBJECT(EX(call)->func));
- }
- if (Z_TYPE(EX(call)->This) == IS_OBJECT) {
+ } else if (ZEND_CALL_INFO(EX(call)) & ZEND_CALL_RELEASE_THIS) {
OBJ_RELEASE(Z_OBJ(EX(call)->This));
}
EX(call)->func = (zend_function*)&zend_pass_function;
Z_OBJ(EX(call)->This) = NULL;
- ZEND_SET_CALL_INFO(EX(call), 0, ZEND_CALL_INFO(EX(call)) & ~ZEND_CALL_RELEASE_THIS);
+ ZEND_CALL_INFO(EX(call)) &= ~(ZEND_CALL_RELEASE_THIS | ZEND_CALL_HAS_THIS);
FREE_UNFETCHED_OP2();
} else {
uint32_t arg_num;
@@ -4636,7 +5111,7 @@ ZEND_VM_C_LABEL(send_array):
ht = Z_ARRVAL_P(args);
if (OP2_TYPE != IS_UNUSED) {
zend_free_op free_op2;
- zval *op2 = GET_OP2_ZVAL_PTR_DEREF(BP_VAR_R);
+ zval *op2 = GET_OP2_ZVAL_PTR(BP_VAR_R);
uint32_t skip = opline->extended_value;
uint32_t count = zend_hash_num_elements(ht);
zend_long len = zval_get_long(op2);
@@ -4717,15 +5192,14 @@ ZEND_VM_HANDLER(120, ZEND_SEND_USER, CONST|TMP|VAR|CV, NUM)
zend_free_op free_op1;
SAVE_OPLINE();
- arg = GET_OP1_ZVAL_PTR_DEREF(BP_VAR_R);
- param = ZEND_CALL_VAR(EX(call), opline->result.var);
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);
}
+ arg = GET_OP1_ZVAL_PTR_DEREF(BP_VAR_R);
+ param = ZEND_CALL_VAR(EX(call), opline->result.var);
ZVAL_COPY(param, arg);
-
FREE_OP1();
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
@@ -4739,11 +5213,11 @@ ZEND_VM_HOT_HANDLER(63, ZEND_RECV, NUM, UNUSED|CACHE_SLOT)
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)) {
+ } else {
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))) {
+ if (UNEXPECTED(!zend_verify_recv_arg_type(EX(func), arg_num, param, NULL, CACHE_ADDR(opline->op2.num)))) {
HANDLE_EXCEPTION();
}
}
@@ -4782,17 +5256,19 @@ ZEND_VM_HOT_HANDLER(64, ZEND_RECV_INIT, NUM, CONST, CACHE_SLOT)
ZVAL_COPY_VALUE(cache_val, param);
}
}
+ ZEND_VM_C_GOTO(recv_init_check_type);
} else {
ZVAL_COPY(param, default_value);
}
- }
-
- if (UNEXPECTED((EX(func)->op_array.fn_flags & ZEND_ACC_HAS_TYPE_HINTS) != 0)) {
- zval *default_value = RT_CONSTANT(opline, opline->op2);
+ } else {
+ZEND_VM_C_LABEL(recv_init_check_type):
+ if (UNEXPECTED((EX(func)->op_array.fn_flags & ZEND_ACC_HAS_TYPE_HINTS) != 0)) {
+ 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(opline->extended_value)) || EG(exception))) {
- HANDLE_EXCEPTION();
+ SAVE_OPLINE();
+ if (UNEXPECTED(!zend_verify_recv_arg_type(EX(func), arg_num, param, default_value, CACHE_ADDR(opline->extended_value)))) {
+ HANDLE_EXCEPTION();
+ }
}
}
@@ -4820,7 +5296,7 @@ ZEND_VM_HANDLER(164, ZEND_RECV_VARIADIC, NUM, UNUSED|CACHE_SLOT)
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));
+ zend_verify_variadic_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++;
@@ -4855,7 +5331,7 @@ ZEND_VM_COLD_CONST_HANDLER(52, ZEND_BOOL, CONST|TMPVAR|CV, ANY)
ZVAL_FALSE(EX_VAR(opline->result.var));
if (OP1_TYPE == IS_CV && UNEXPECTED(orig_val_type == IS_UNDEF)) {
SAVE_OPLINE();
- GET_OP1_UNDEF_CV(val, BP_VAR_R);
+ ZVAL_UNDEFINED_OP1();
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
} else {
@@ -4867,60 +5343,89 @@ ZEND_VM_COLD_CONST_HANDLER(52, ZEND_BOOL, CONST|TMPVAR|CV, ANY)
ZEND_VM_NEXT_OPCODE();
}
+ZEND_VM_HELPER(zend_case_helper, ANY, ANY, zval *op_1, zval *op_2)
+{
+ USE_OPLINE
+
+ SAVE_OPLINE();
+ if (UNEXPECTED(Z_TYPE_INFO_P(op_1) == IS_UNDEF)) {
+ op_1 = ZVAL_UNDEFINED_OP1();
+ }
+ if (UNEXPECTED(Z_TYPE_INFO_P(op_2) == IS_UNDEF)) {
+ op_2 = ZVAL_UNDEFINED_OP2();
+ }
+ compare_function(EX_VAR(opline->result.var), op_1, op_2);
+ if (OP2_TYPE & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_nogc(op_2);
+ }
+ if (UNEXPECTED(EG(exception))) {
+ HANDLE_EXCEPTION();
+ }
+ if (Z_LVAL_P(EX_VAR(opline->result.var)) == 0) {
+ ZEND_VM_SMART_BRANCH_TRUE();
+ ZVAL_TRUE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
+ } else {
+ ZEND_VM_SMART_BRANCH_FALSE();
+ ZVAL_FALSE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
+ }
+}
+
ZEND_VM_HANDLER(48, ZEND_CASE, TMPVAR, CONST|TMPVAR|CV)
{
USE_OPLINE
zend_free_op free_op1, free_op2;
- zval *op1, *op2, *result;
+ zval *op1, *op2;
+ double d1, d2;
op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
op2 = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
- 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));
+ if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_LVAL_P(op1) == Z_LVAL_P(op2))) {
+ZEND_VM_C_LABEL(case_true):
+ ZEND_VM_SMART_BRANCH_TRUE();
+ ZVAL_TRUE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
} else {
- break;
+ZEND_VM_C_LABEL(case_false):
+ ZEND_VM_SMART_BRANCH_FALSE();
+ ZVAL_FALSE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
}
- } 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 if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ d1 = (double)Z_LVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+ ZEND_VM_C_GOTO(case_double);
+ }
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+ZEND_VM_C_LABEL(case_double):
+ if (d1 == d2) {
+ ZEND_VM_C_GOTO(case_true);
} else {
- break;
+ ZEND_VM_C_GOTO(case_false);
}
- } 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));
- FREE_OP2();
+ } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = (double)Z_LVAL_P(op2);
+ ZEND_VM_C_GOTO(case_double);
+ }
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
+ if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
+ int result = zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2));
+ FREE_OP2();
+ if (result) {
+ ZEND_VM_C_GOTO(case_true);
} else {
- break;
+ ZEND_VM_C_GOTO(case_false);
}
- } 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 (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
- op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
- if (OP2_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
- 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);
- FREE_OP2();
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+ ZEND_VM_DISPATCH_TO_HELPER(zend_case_helper, op_1, op1, op_2, op2);
}
ZEND_VM_HANDLER(68, ZEND_NEW, UNUSED|CLASS_FETCH|CONST|VAR, UNUSED|CACHE_SLOT, NUM)
@@ -4935,7 +5440,7 @@ ZEND_VM_HANDLER(68, ZEND_NEW, UNUSED|CLASS_FETCH|CONST|VAR, UNUSED|CACHE_SLOT, N
if (OP1_TYPE == 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);
+ ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op1)), Z_STR_P(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));
@@ -4975,17 +5480,16 @@ ZEND_VM_HANDLER(68, ZEND_NEW, UNUSED|CLASS_FETCH|CONST|VAR, UNUSED|CACHE_SLOT, N
/* 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);
+ opline->extended_value, NULL);
} else {
- if (EXPECTED(constructor->type == ZEND_USER_FUNCTION) && UNEXPECTED(!constructor->op_array.run_time_cache)) {
+ if (EXPECTED(constructor->type == ZEND_USER_FUNCTION) && UNEXPECTED(!RUN_TIME_CACHE(&constructor->op_array))) {
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,
+ ZEND_CALL_FUNCTION | ZEND_CALL_RELEASE_THIS | ZEND_CALL_HAS_THIS,
constructor,
opline->extended_value,
- ce,
Z_OBJ_P(result));
Z_ADDREF_P(result);
}
@@ -5022,7 +5526,7 @@ ZEND_VM_COLD_CONST_HANDLER(110, ZEND_CLONE, CONST|TMPVAR|UNUSED|THIS|CV, ANY)
}
ZVAL_UNDEF(EX_VAR(opline->result.var));
if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(obj) == IS_UNDEF)) {
- GET_OP1_UNDEF_CV(obj, BP_VAR_R);
+ ZVAL_UNDEFINED_OP1();
if (UNEXPECTED(EG(exception) != NULL)) {
HANDLE_EXCEPTION();
}
@@ -5043,23 +5547,12 @@ ZEND_VM_COLD_CONST_HANDLER(110, ZEND_CLONE, CONST|TMPVAR|UNUSED|THIS|CV, ANY)
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) : "");
- 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) : "");
+ if (clone && !(clone->common.fn_flags & ZEND_ACC_PUBLIC)) {
+ scope = EX(func)->op_array.scope;
+ if (clone->common.scope != scope) {
+ if (UNEXPECTED(clone->common.fn_flags & ZEND_ACC_PRIVATE)
+ || UNEXPECTED(!zend_check_protected(zend_get_function_root_class(clone), scope))) {
+ zend_wrong_clone_call(clone, scope);
FREE_OP1();
ZVAL_UNDEF(EX_VAR(opline->result.var));
HANDLE_EXCEPTION();
@@ -5106,7 +5599,7 @@ ZEND_VM_HANDLER(181, ZEND_FETCH_CLASS_CONSTANT, VAR|CONST|UNUSED|CLASS_FETCH, CO
} 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);
+ ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op1)), Z_STR_P(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));
@@ -5236,8 +5729,12 @@ ZEND_VM_C_LABEL(num_index):
} else if (Z_TYPE_P(offset) == IS_TRUE) {
hval = 1;
ZEND_VM_C_GOTO(num_index);
+ } else if (Z_TYPE_P(offset) == IS_RESOURCE) {
+ zend_use_resource_as_offset(offset);
+ hval = Z_RES_HANDLE_P(offset);
+ ZEND_VM_C_GOTO(num_index);
} else if (OP2_TYPE == IS_CV && Z_TYPE_P(offset) == IS_UNDEF) {
- GET_OP2_UNDEF_CV(offset, BP_VAR_R);
+ ZVAL_UNDEFINED_OP2();
str = ZSTR_EMPTY_ALLOC();
ZEND_VM_C_GOTO(str_index);
} else {
@@ -5254,7 +5751,114 @@ ZEND_VM_C_LABEL(num_index):
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-ZEND_VM_HANDLER(71, ZEND_INIT_ARRAY, CONST|TMP|VAR|CV, CONST|TMPVAR|UNUSED|NEXT|CV, ARRAY_INIT|REF)
+ZEND_VM_HANDLER(147, ZEND_ADD_ARRAY_UNPACK, ANY, ANY)
+{
+ USE_OPLINE
+ zend_free_op free_op1;
+ zval *op1;
+
+ SAVE_OPLINE();
+ op1 = GET_OP1_ZVAL_PTR(BP_VAR_R);
+
+ZEND_VM_C_LABEL(add_unpack_again):
+ if (EXPECTED(Z_TYPE_P(op1) == IS_ARRAY)) {
+ HashTable *ht = Z_ARRVAL_P(op1);
+ zval *val;
+ zend_string *key;
+
+ ZEND_HASH_FOREACH_STR_KEY_VAL(ht, key, val) {
+ if (key) {
+ zend_throw_error(NULL, "Cannot unpack array with string keys");
+ FREE_OP1();
+ HANDLE_EXCEPTION();
+ } else {
+ if (Z_ISREF_P(val) && Z_REFCOUNT_P(val) == 1) {
+ val = Z_REFVAL_P(val);
+ }
+ Z_TRY_ADDREF_P(val);
+ if (!zend_hash_next_index_insert(Z_ARRVAL_P(EX_VAR(opline->result.var)), val)) {
+ zend_cannot_add_element();
+ zval_ptr_dtor_nogc(val);
+ break;
+ }
+ }
+ } ZEND_HASH_FOREACH_END();
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_OBJECT)) {
+ zend_class_entry *ce = Z_OBJCE_P(op1);
+ zend_object_iterator *iter;
+
+ if (!ce || !ce->get_iterator) {
+ zend_throw_error(NULL, "Only arrays and Traversables can be unpacked");
+ } else {
+ iter = ce->get_iterator(ce, op1, 0);
+ if (UNEXPECTED(!iter)) {
+ FREE_OP1();
+ if (!EG(exception)) {
+ zend_throw_exception_ex(
+ NULL, 0, "Object of type %s did not create an Iterator", ZSTR_VAL(ce->name)
+ );
+ }
+ HANDLE_EXCEPTION();
+ }
+
+ if (iter->funcs->rewind) {
+ iter->funcs->rewind(iter);
+ }
+
+ for (; iter->funcs->valid(iter) == SUCCESS; ) {
+ zval *val;
+
+ if (UNEXPECTED(EG(exception) != NULL)) {
+ break;
+ }
+
+ val = iter->funcs->get_current_data(iter);
+ if (UNEXPECTED(EG(exception) != NULL)) {
+ break;
+ }
+
+ if (iter->funcs->get_current_key) {
+ zval key;
+ iter->funcs->get_current_key(iter, &key);
+ if (UNEXPECTED(EG(exception) != NULL)) {
+ break;
+ }
+
+ if (UNEXPECTED(Z_TYPE(key) != IS_LONG)) {
+ zend_throw_error(NULL,
+ (Z_TYPE(key) == IS_STRING) ?
+ "Cannot unpack Traversable with string keys" :
+ "Cannot unpack Traversable with non-integer keys");
+ zval_ptr_dtor(&key);
+ break;
+ }
+ }
+
+ ZVAL_DEREF(val);
+ Z_TRY_ADDREF_P(val);
+
+ if (!zend_hash_next_index_insert(Z_ARRVAL_P(EX_VAR(opline->result.var)), val)) {
+ zend_cannot_add_element();
+ zval_ptr_dtor_nogc(val);
+ }
+
+ iter->funcs->move_forward(iter);
+ }
+
+ zend_iterator_dtor(iter);
+ }
+ } else if (EXPECTED(Z_ISREF_P(op1))) {
+ op1 = Z_REFVAL_P(op1);
+ ZEND_VM_C_GOTO(add_unpack_again);
+ } else {
+ zend_throw_error(NULL, "Only arrays and Traversables can be unpacked");
+ }
+
+ FREE_OP1();
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+}
+
+ZEND_VM_HANDLER(71, ZEND_INIT_ARRAY, CONST|TMP|VAR|CV|UNUSED, CONST|TMPVAR|UNUSED|NEXT|CV, ARRAY_INIT|REF)
{
zval *array;
uint32_t size;
@@ -5270,12 +5874,12 @@ ZEND_VM_HANDLER(71, ZEND_INIT_ARRAY, CONST|TMP|VAR|CV, CONST|TMPVAR|UNUSED|NEXT|
}
ZEND_VM_DISPATCH_TO_HANDLER(ZEND_ADD_ARRAY_ELEMENT);
} else {
- ZVAL_EMPTY_ARRAY(array);
+ ZVAL_ARR(array, zend_new_array(0));
ZEND_VM_NEXT_OPCODE();
}
}
-ZEND_VM_COLD_CONST_HANDLER(21, ZEND_CAST, CONST|TMP|VAR|CV, ANY, TYPE)
+ZEND_VM_COLD_CONST_HANDLER(51, ZEND_CAST, CONST|TMP|VAR|CV, ANY, TYPE)
{
USE_OPLINE
zend_free_op free_op1;
@@ -5332,22 +5936,18 @@ ZEND_VM_COLD_CONST_HANDLER(21, ZEND_CAST, CONST|TMP|VAR|CV, ANY, TYPE)
} 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);
+ } else {
+ HashTable *obj_ht = zend_get_properties_for(expr, ZEND_PROP_PURPOSE_ARRAY_CAST);
if (obj_ht) {
/* fast copy */
- obj_ht = zend_proptable_to_symtable(obj_ht,
+ ZVAL_ARR(result, 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);
+ GC_IS_RECURSIVE(obj_ht))));
+ zend_release_properties(obj_ht);
} else {
ZVAL_EMPTY_ARRAY(result);
}
- } else {
- ZVAL_COPY_VALUE(result, expr);
- Z_ADDREF_P(result);
- convert_to_array(result);
}
} else {
ZVAL_OBJ(result, zend_objects_new(zend_standard_class_def));
@@ -5402,15 +6002,14 @@ ZEND_VM_HANDLER(73, ZEND_INCLUDE_OR_EVAL, CONST|TMPVAR|CV, ANY, EVAL)
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,
+ call = zend_vm_stack_push_call_frame(
+ (Z_TYPE_INFO(EX(This)) & ZEND_CALL_HAS_THIS) | 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);
+ Z_PTR(EX(This)));
if (EX_CALL_INFO() & ZEND_CALL_HAS_SYMBOL_TABLE) {
call->symbol_table = EX(symbol_table);
@@ -5441,7 +6040,7 @@ ZEND_VM_HANDLER(73, ZEND_INCLUDE_OR_EVAL, CONST|TMPVAR|CV, ANY, EVAL)
ZEND_VM_NEXT_OPCODE();
}
-ZEND_VM_HANDLER(196, ZEND_UNSET_CV, CV, UNUSED)
+ZEND_VM_HANDLER(153, ZEND_UNSET_CV, CV, UNUSED)
{
USE_OPLINE
zval *var = EX_VAR(opline->op1.var);
@@ -5482,9 +6081,13 @@ ZEND_VM_HANDLER(74, ZEND_UNSET_VAR, CONST|TMPVAR|CV, UNUSED, VAR_FETCH)
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);
+ varname = ZVAL_UNDEFINED_OP1();
+ }
+ name = zval_try_get_tmp_string(varname, &tmp_name);
+ if (UNEXPECTED(!name)) {
+ FREE_OP1();
+ HANDLE_EXCEPTION();
}
- name = zval_get_tmp_string(varname, &tmp_name);
}
target_symbol_table = zend_get_target_symbol_table(opline->extended_value EXECUTE_DATA_CC);
@@ -5497,11 +6100,12 @@ ZEND_VM_HANDLER(74, ZEND_UNSET_VAR, CONST|TMPVAR|CV, UNUSED, VAR_FETCH)
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-ZEND_VM_COLD_HANDLER(179, ZEND_UNSET_STATIC_PROP, CONST|TMPVAR|CV, UNUSED|CLASS_FETCH|CONST|VAR, CACHE_SLOT)
+/* No specialization for op_types (CONST|TMPVAR|CV, UNUSED|CLASS_FETCH|CONST|VAR) */
+ZEND_VM_COLD_HANDLER(179, ZEND_UNSET_STATIC_PROP, ANY, ANY, CACHE_SLOT)
{
USE_OPLINE
zval *varname;
- zend_string *name, *tmp_name;
+ zend_string *name, *tmp_name = NULL;
zend_class_entry *ce;
zend_free_op free_op1;
@@ -5510,7 +6114,7 @@ ZEND_VM_COLD_HANDLER(179, ZEND_UNSET_STATIC_PROP, CONST|TMPVAR|CV, UNUSED|CLASS_
if (OP2_TYPE == 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);
+ ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op2)), Z_STR_P(RT_CONSTANT(opline, opline->op2) + 1), ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
if (UNEXPECTED(ce == NULL)) {
ZEND_ASSERT(EG(exception));
FREE_UNFETCHED_OP1();
@@ -5534,19 +6138,16 @@ ZEND_VM_COLD_HANDLER(179, ZEND_UNSET_STATIC_PROP, CONST|TMPVAR|CV, UNUSED|CLASS_
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);
+ varname = ZVAL_UNDEFINED_OP1();
}
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);
- }
+ zend_tmp_string_release(tmp_name);
FREE_OP1();
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
@@ -5608,7 +6209,7 @@ ZEND_VM_C_LABEL(num_index_dim):
hval = Z_RES_HANDLE_P(offset);
ZEND_VM_C_GOTO(num_index_dim);
} else if (OP2_TYPE == IS_CV && Z_TYPE_P(offset) == IS_UNDEF) {
- GET_OP2_UNDEF_CV(offset, BP_VAR_R);
+ ZVAL_UNDEFINED_OP2();
key = ZSTR_EMPTY_ALLOC();
ZEND_VM_C_GOTO(str_index_dim);
} else {
@@ -5622,20 +6223,16 @@ ZEND_VM_C_LABEL(num_index_dim):
}
}
if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
- container = GET_OP1_UNDEF_CV(container, BP_VAR_R);
+ container = ZVAL_UNDEFINED_OP1();
}
if (OP2_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(offset) == IS_UNDEF)) {
- offset = GET_OP2_UNDEF_CV(offset, BP_VAR_R);
+ offset = ZVAL_UNDEFINED_OP2();
}
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 (OP2_TYPE == IS_CONST && Z_EXTRA_P(offset) == ZEND_EXTRA_VALUE) {
- offset++;
- }
- Z_OBJ_HT_P(container)->unset_dimension(container, offset);
+ 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)) {
zend_throw_error(NULL, "Cannot unset string offsets");
}
@@ -5654,7 +6251,7 @@ ZEND_VM_HANDLER(76, ZEND_UNSET_OBJ, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, CACHE_S
zval *offset;
SAVE_OPLINE();
- container = GET_OP1_OBJ_ZVAL_PTR_PTR(BP_VAR_UNSET);
+ container = GET_OP1_OBJ_ZVAL_PTR_PTR_UNDEF(BP_VAR_UNSET);
if (OP1_TYPE == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
ZEND_VM_DISPATCH_TO_HELPER(zend_this_not_in_object_context_helper);
}
@@ -5665,17 +6262,17 @@ ZEND_VM_HANDLER(76, ZEND_UNSET_OBJ, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, CACHE_S
if (Z_ISREF_P(container)) {
container = Z_REFVAL_P(container);
if (Z_TYPE_P(container) != IS_OBJECT) {
+ if (OP1_TYPE == IS_CV
+ && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
+ ZVAL_UNDEFINED_OP1();
+ }
break;
}
} else {
break;
}
}
- if (Z_OBJ_HT_P(container)->unset_property) {
- Z_OBJ_HT_P(container)->unset_property(container, offset, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL));
- } else {
- zend_wrong_property_unset(offset);
- }
+ Z_OBJ_HT_P(container)->unset_property(container, offset, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL));
} while (0);
FREE_OP2();
@@ -5905,10 +6502,12 @@ ZEND_VM_C_LABEL(fe_fetch_r_exit):
value = Z_INDIRECT_P(value);
value_type = Z_TYPE_INFO_P(value);
if (EXPECTED(value_type != IS_UNDEF)
- && EXPECTED(zend_check_property_access(Z_OBJ_P(array), p->key) == SUCCESS)) {
+ && EXPECTED(zend_check_property_access(Z_OBJ_P(array), p->key, 0) == SUCCESS)) {
break;
}
- } else {
+ } else if (EXPECTED(Z_OBJCE_P(array)->default_properties_count == 0)
+ || !p->key
+ || zend_check_property_access(Z_OBJ_P(array), p->key, 1) == SUCCESS) {
break;
}
}
@@ -5973,7 +6572,7 @@ ZEND_VM_C_LABEL(fe_fetch_r_exit):
if (EXPECTED(OP2_TYPE == IS_CV)) {
zval *variable_ptr = EX_VAR(opline->op2.var);
- zend_assign_to_variable(variable_ptr, value, IS_CV);
+ zend_assign_to_variable(variable_ptr, value, IS_CV, EX_USES_STRICT_TYPES());
} else {
zval *res = EX_VAR(opline->op2.var);
zend_refcounted *gc = Z_COUNTED_P(value);
@@ -6055,10 +6654,21 @@ ZEND_VM_HANDLER(126, ZEND_FE_FETCH_RW, VAR, ANY, JMP_ADDR)
value = Z_INDIRECT_P(value);
value_type = Z_TYPE_INFO_P(value);
if (EXPECTED(value_type != IS_UNDEF)
- && EXPECTED(zend_check_property_access(Z_OBJ_P(array), p->key) == SUCCESS)) {
+ && EXPECTED(zend_check_property_access(Z_OBJ_P(array), p->key, 0) == SUCCESS)) {
+ if ((value_type & Z_TYPE_MASK) != IS_REFERENCE) {
+ zend_property_info *prop_info =
+ zend_get_typed_property_info_for_slot(Z_OBJ_P(array), value);
+ if (UNEXPECTED(prop_info)) {
+ ZVAL_NEW_REF(value, value);
+ ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(value), prop_info);
+ value_type = IS_REFERENCE_EX;
+ }
+ }
break;
}
- } else {
+ } else if (EXPECTED(Z_OBJCE_P(array)->default_properties_count == 0)
+ || !p->key
+ || zend_check_property_access(Z_OBJ_P(array), p->key, 1) == SUCCESS) {
break;
}
}
@@ -6144,7 +6754,7 @@ ZEND_VM_C_LABEL(fe_fetch_w_exit):
ref = Z_REF_P(value);
GC_ADDREF(ref);
- zval_ptr_dtor(variable_ptr);
+ i_zval_ptr_dtor(variable_ptr);
ZVAL_REF(variable_ptr, ref);
}
} else {
@@ -6154,28 +6764,36 @@ ZEND_VM_C_LABEL(fe_fetch_w_exit):
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-ZEND_VM_HOT_HANDLER(197, ZEND_ISSET_ISEMPTY_CV, CV, UNUSED, ISSET, SPEC(ISSET))
+ZEND_VM_HOT_HANDLER(154, 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_ISEMPTY)) {
- result =
- Z_TYPE_P(value) > IS_NULL &&
- (!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL);
+ if (Z_TYPE_P(value) > IS_NULL &&
+ (!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL)) {
+ ZEND_VM_SMART_BRANCH_TRUE();
+ ZVAL_TRUE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
+ } else {
+ ZEND_VM_SMART_BRANCH_FALSE();
+ ZVAL_FALSE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
+ }
} else {
+ int result;
+
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();
}
- ZEND_VM_SMART_BRANCH(result, 0);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE();
}
ZEND_VM_HANDLER(114, ZEND_ISSET_ISEMPTY_VAR, CONST|TMPVAR|CV, UNUSED, VAR_FETCH|ISSET)
@@ -6225,76 +6843,22 @@ 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|CACHE_SLOT)
+/* No specialization for op_types (CONST|TMPVAR|CV, UNUSED|CLASS_FETCH|CONST|VAR) */
+ZEND_VM_HANDLER(180, ZEND_ISSET_ISEMPTY_STATIC_PROP, ANY, CLASS_FETCH, ISSET|CACHE_SLOT)
{
USE_OPLINE
zval *value;
int result;
- zend_free_op free_op1;
- zval *varname;
- zend_string *name, *tmp_name;
- zend_class_entry *ce;
SAVE_OPLINE();
- if (OP2_TYPE == IS_CONST) {
- if (OP1_TYPE == IS_CONST && EXPECTED((ce = CACHED_PTR(opline->extended_value & ~ZEND_ISEMPTY)) != NULL)) {
- value = CACHED_PTR((opline->extended_value & ~ZEND_ISEMPTY) + sizeof(void*));
- ZEND_VM_C_GOTO(is_static_prop_return);
- } else if (UNEXPECTED((ce = CACHED_PTR(opline->extended_value & ~ZEND_ISEMPTY)) == NULL)) {
- ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op2)), RT_CONSTANT(opline, opline->op2) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
- if (UNEXPECTED(ce == NULL)) {
- ZEND_ASSERT(EG(exception));
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
- }
- if (OP1_TYPE != IS_CONST) {
- CACHE_PTR(opline->extended_value & ~ZEND_ISEMPTY, ce);
- }
- }
- } else {
- if (OP2_TYPE == IS_UNUSED) {
- ce = zend_fetch_class(NULL, opline->op2.num);
- if (UNEXPECTED(ce == NULL)) {
- ZEND_ASSERT(EG(exception));
- FREE_UNFETCHED_OP1();
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
- }
- } else {
- ce = Z_CE_P(EX_VAR(opline->op2.var));
- }
- if (OP1_TYPE == IS_CONST &&
- EXPECTED(CACHED_PTR(opline->extended_value & ~ZEND_ISEMPTY) == ce)) {
- value = CACHED_PTR((opline->extended_value & ~ZEND_ISEMPTY) + sizeof(void*));
- ZEND_VM_C_GOTO(is_static_prop_return);
- }
- }
-
- varname = GET_OP1_ZVAL_PTR(BP_VAR_IS);
- if (OP1_TYPE == IS_CONST) {
- name = Z_STR_P(varname);
- } else {
- name = zval_get_tmp_string(varname, &tmp_name);
- }
-
- value = zend_std_get_static_property(ce, name, 1);
-
- if (OP1_TYPE == IS_CONST && value) {
- CACHE_POLYMORPHIC_PTR(opline->extended_value & ~ZEND_ISEMPTY, ce, value);
- }
+ result = zend_fetch_static_property_address(&value, NULL, opline->extended_value & ~ZEND_ISEMPTY, BP_VAR_IS, 0 OPLINE_CC EXECUTE_DATA_CC);
- if (OP1_TYPE != IS_CONST) {
- zend_tmp_string_release(tmp_name);
- }
- FREE_OP1();
-
-ZEND_VM_C_LABEL(is_static_prop_return):
if (!(opline->extended_value & ZEND_ISEMPTY)) {
- result = value && Z_TYPE_P(value) > IS_NULL &&
+ result = result == SUCCESS && Z_TYPE_P(value) > IS_NULL &&
(!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL);
} else {
- result = !value || !i_zend_is_true(value);
+ result = result != SUCCESS || !i_zend_is_true(value);
}
ZEND_VM_SMART_BRANCH(result, 1);
@@ -6346,6 +6910,14 @@ ZEND_VM_C_LABEL(num_index_prop):
/* > 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);
+
+ if (OP1_TYPE & (IS_CONST|IS_CV)) {
+ /* avoid exception check */
+ FREE_OP2();
+ ZEND_VM_SMART_BRANCH(result, 0);
+ ZVAL_BOOL(EX_VAR(opline->result.var), result);
+ ZEND_VM_NEXT_OPCODE();
+ }
} else {
result = (value == NULL || !i_zend_is_true(value));
}
@@ -6396,22 +6968,20 @@ ZEND_VM_COLD_CONST_HANDLER(148, ZEND_ISSET_ISEMPTY_PROP_OBJ, CONST|TMPVAR|UNUSED
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(isset_no_object);
+ result = (opline->extended_value & ZEND_ISEMPTY);
+ ZEND_VM_C_GOTO(isset_object_finish);
}
} else {
- ZEND_VM_C_GOTO(isset_no_object);
+ result = (opline->extended_value & ZEND_ISEMPTY);
+ ZEND_VM_C_GOTO(isset_object_finish);
}
}
- if (UNEXPECTED(!Z_OBJ_HT_P(container)->has_property)) {
- zend_wrong_property_check(offset);
-ZEND_VM_C_LABEL(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), ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_ISEMPTY) : NULL));
- }
+ result =
+ (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));
+
+ZEND_VM_C_LABEL(isset_object_finish):
FREE_OP2();
FREE_OP1();
ZEND_VM_SMART_BRANCH(result, 1);
@@ -6419,7 +6989,43 @@ ZEND_VM_C_LABEL(isset_no_object):
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-ZEND_VM_COLD_HANDLER(79, ZEND_EXIT, CONST|TMPVAR|UNUSED|CV, ANY)
+ZEND_VM_HANDLER(194, ZEND_ARRAY_KEY_EXISTS, CV|TMPVAR|CONST, CV|TMPVAR|CONST)
+{
+ USE_OPLINE
+
+ zend_free_op free_op1, free_op2;
+ zval *key, *subject;
+ HashTable *ht;
+ uint32_t result;
+
+ SAVE_OPLINE();
+
+ key = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
+ subject = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
+
+ if (EXPECTED(Z_TYPE_P(subject) == IS_ARRAY)) {
+ZEND_VM_C_LABEL(array_key_exists_array):
+ ht = Z_ARRVAL_P(subject);
+ result = zend_array_key_exists_fast(ht, key OPLINE_CC EXECUTE_DATA_CC);
+ } else {
+ if ((OP2_TYPE & (IS_VAR|IS_CV)) && EXPECTED(Z_ISREF_P(subject))) {
+ subject = Z_REFVAL_P(subject);
+ if (EXPECTED(Z_TYPE_P(subject) == IS_ARRAY)) {
+ ZEND_VM_C_GOTO(array_key_exists_array);
+ }
+ }
+ result = zend_array_key_exists_slow(subject, key OPLINE_CC EXECUTE_DATA_CC);
+ }
+
+ FREE_OP2();
+ FREE_OP1();
+ ZEND_VM_SMART_BRANCH(result == IS_TRUE, 1);
+ Z_TYPE_INFO_P(EX_VAR(opline->result.var)) = result;
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+}
+
+/* No specialization for op_types (CONST|TMPVAR|UNUSED|CV, ANY) */
+ZEND_VM_COLD_HANDLER(79, ZEND_EXIT, ANY, ANY)
{
USE_OPLINE
@@ -6541,7 +7147,7 @@ ZEND_VM_COLD_CONST_HANDLER(152, ZEND_JMP_SET, CONST|TMP|VAR|CV, JMP_ADDR)
ZEND_VM_NEXT_OPCODE();
}
-ZEND_VM_COLD_CONST_HANDLER(169, ZEND_COALESCE, CONST|TMPVAR|CV, JMP_ADDR)
+ZEND_VM_COLD_CONST_HANDLER(169, ZEND_COALESCE, CONST|TMP|VAR|CV, JMP_ADDR)
{
USE_OPLINE
zend_free_op free_op1;
@@ -6581,7 +7187,7 @@ ZEND_VM_COLD_CONST_HANDLER(169, ZEND_COALESCE, CONST|TMPVAR|CV, JMP_ADDR)
ZEND_VM_NEXT_OPCODE();
}
-ZEND_VM_HOT_HANDLER(22, ZEND_QM_ASSIGN, CONST|TMP|VAR|CV, ANY)
+ZEND_VM_HOT_HANDLER(31, ZEND_QM_ASSIGN, CONST|TMP|VAR|CV, ANY)
{
USE_OPLINE
zend_free_op free_op1;
@@ -6591,7 +7197,7 @@ ZEND_VM_HOT_HANDLER(22, ZEND_QM_ASSIGN, CONST|TMP|VAR|CV, ANY)
value = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(value) == IS_UNDEF)) {
SAVE_OPLINE();
- GET_OP1_UNDEF_CV(value, BP_VAR_R);
+ ZVAL_UNDEFINED_OP1();
ZVAL_NULL(result);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
@@ -6656,106 +7262,81 @@ ZEND_VM_COLD_HANDLER(103, ZEND_EXT_FCALL_END, ANY, ANY)
ZEND_VM_NEXT_OPCODE();
}
-ZEND_VM_HANDLER(139, ZEND_DECLARE_CLASS, CONST, ANY)
+ZEND_VM_HANDLER(144, ZEND_DECLARE_CLASS, CONST, ANY)
{
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();
-}
-
-ZEND_VM_HANDLER(140, ZEND_DECLARE_INHERITED_CLASS, CONST, CONST)
-{
- 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);
+ do_bind_class(RT_CONSTANT(opline, opline->op1), (OP2_TYPE == IS_CONST) ? Z_STR_P(RT_CONSTANT(opline, opline->op2)) : NULL);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-ZEND_VM_HANDLER(145, ZEND_DECLARE_INHERITED_CLASS_DELAYED, CONST, CONST)
+ZEND_VM_HANDLER(145, ZEND_DECLARE_CLASS_DELAYED, CONST, CONST)
{
USE_OPLINE
- zval *zce, *orig_zce;
- zend_class_entry *parent;
+ zval *lcname, *zv;
+ zend_class_entry *ce;
- 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();
+ ce = CACHED_PTR(opline->extended_value);
+ if (ce == NULL) {
+ lcname = RT_CONSTANT(opline, opline->op1);
+ zv = zend_hash_find_ex(EG(class_table), Z_STR_P(lcname + 1), 1);
+ if (zv) {
+ SAVE_OPLINE();
+ ce = Z_CE_P(zv);
+ zv = zend_hash_set_bucket_key(EG(class_table), (Bucket*)zv, Z_STR_P(lcname));
+ if (UNEXPECTED(!zv)) {
+ 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));
+ } else {
+ if (zend_do_link_class(ce, Z_STR_P(RT_CONSTANT(opline, opline->op2))) == FAILURE) {
+ /* Reload bucket pointer, the hash table may have been reallocated */
+ zv = zend_hash_find(EG(class_table), Z_STR_P(lcname));
+ zend_hash_set_bucket_key(EG(class_table), (Bucket *) zv, Z_STR_P(lcname + 1));
+ HANDLE_EXCEPTION();
+ }
+ }
}
- do_bind_inherited_class(&EX(func)->op_array, opline, EG(class_table), parent, 0);
+ CACHE_PTR(opline->extended_value, ce);
}
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+ ZEND_VM_NEXT_OPCODE();
}
-ZEND_VM_HANDLER(171, ZEND_DECLARE_ANON_CLASS, ANY, ANY, JMP_ADDR)
+ZEND_VM_HANDLER(146, ZEND_DECLARE_ANON_CLASS, ANY, ANY, CACHE_SLOT)
{
zval *zv;
zend_class_entry *ce;
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();
- }
-
- if (!(ce->ce_flags & (ZEND_ACC_INTERFACE|ZEND_ACC_IMPLEMENT_INTERFACES|ZEND_ACC_IMPLEMENT_TRAITS))) {
- zend_verify_abstract_class(ce);
+ ce = CACHED_PTR(opline->extended_value);
+ if (UNEXPECTED(ce == NULL)) {
+ zend_string *rtd_key = Z_STR_P(RT_CONSTANT(opline, opline->op1));
+ zv = zend_hash_find_ex(EG(class_table), rtd_key, 1);
+ if (UNEXPECTED(zv == NULL)) {
+ SAVE_OPLINE();
+ do {
+ ZEND_ASSERT(EX(func)->op_array.fn_flags & ZEND_ACC_PRELOADED);
+ if (zend_preload_autoload
+ && zend_preload_autoload(EX(func)->op_array.filename) == SUCCESS) {
+ zv = zend_hash_find_ex(EG(class_table), rtd_key, 1);
+ if (EXPECTED(zv != NULL)) {
+ break;
+ }
+ }
+ zend_error_noreturn(E_ERROR, "Anonymous class wasn't preloaded");
+ } while (0);
+ }
+ ZEND_ASSERT(zv != NULL);
+ ce = Z_CE_P(zv);
+ if (!(ce->ce_flags & ZEND_ACC_LINKED)) {
+ SAVE_OPLINE();
+ if (zend_do_link_class(ce, (OP2_TYPE == IS_CONST) ? Z_STR_P(RT_CONSTANT(opline, opline->op2)) : NULL) == FAILURE) {
+ HANDLE_EXCEPTION();
+ }
+ }
+ CACHE_PTR(opline->extended_value, ce);
}
- ce->ce_flags |= ZEND_ACC_ANON_BOUND;
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
-ZEND_VM_HANDLER(172, ZEND_DECLARE_ANON_INHERITED_CLASS, CONST, CONST, JMP_ADDR)
-{
- 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();
+ ZEND_VM_NEXT_OPCODE();
}
ZEND_VM_HANDLER(141, ZEND_DECLARE_FUNCTION, ANY, ANY)
@@ -6763,7 +7344,7 @@ ZEND_VM_HANDLER(141, ZEND_DECLARE_FUNCTION, ANY, ANY)
USE_OPLINE
SAVE_OPLINE();
- do_bind_function(&EX(func)->op_array, opline, EG(function_table), 0);
+ do_bind_function(RT_CONSTANT(opline, opline->op1));
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
@@ -6799,7 +7380,7 @@ ZEND_VM_C_LABEL(try_instanceof):
if (OP2_TYPE == 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);
+ ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op2)), Z_STR_P(RT_CONSTANT(opline, opline->op2) + 1), ZEND_FETCH_CLASS_NO_AUTOLOAD);
if (EXPECTED(ce)) {
CACHE_PTR(opline->extended_value, ce);
}
@@ -6821,7 +7402,7 @@ ZEND_VM_C_LABEL(try_instanceof):
ZEND_VM_C_GOTO(try_instanceof);
} else {
if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(expr) == IS_UNDEF)) {
- GET_OP1_UNDEF_CV(expr, BP_VAR_R);
+ ZVAL_UNDEFINED_OP1();
}
result = 0;
}
@@ -6845,60 +7426,6 @@ ZEND_VM_HOT_HANDLER(0, ZEND_NOP, ANY, ANY)
ZEND_VM_NEXT_OPCODE();
}
-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 = 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)) {
- ZEND_ASSERT(EG(exception));
- HANDLE_EXCEPTION();
- }
-
- if (UNEXPECTED((iface->ce_flags & ZEND_ACC_INTERFACE) == 0)) {
- zend_error_noreturn(E_ERROR, "%s cannot implement %s - it is not an interface", ZSTR_VAL(ce->name), ZSTR_VAL(iface->name));
- }
- zend_do_implement_interface(ce, iface);
-
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
-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 = 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)) {
- 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);
-
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
-ZEND_VM_HANDLER(155, ZEND_BIND_TRAITS, ANY, ANY)
-{
- USE_OPLINE
- zend_class_entry *ce = Z_CE_P(EX_VAR(opline->op1.var));
-
- SAVE_OPLINE();
- zend_do_bind_traits(ce);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
ZEND_VM_HELPER(zend_dispatch_try_catch_finally_helper, ANY, ANY, uint32_t try_catch_offset, uint32_t op_num)
{
/* May be NULL during generator closing (only finally blocks are executed) */
@@ -6955,6 +7482,10 @@ ZEND_VM_HELPER(zend_dispatch_try_catch_finally_helper, ANY, ANY, uint32_t try_ca
zend_generator_close(generator, 1);
ZEND_VM_RETURN();
} else {
+ /* We didn't execute RETURN, and have to initialize return_value */
+ if (EX(return_value)) {
+ ZVAL_UNDEF(EX(return_value));
+ }
ZEND_VM_DISPATCH_TO_HELPER(zend_leave_helper);
}
}
@@ -6993,15 +7524,13 @@ ZEND_VM_HANDLER(149, ZEND_HANDLE_EXCEPTION, ANY, ANY)
if (throw_op->result_type & (IS_VAR | IS_TMP_VAR)) {
switch (throw_op->opcode) {
case ZEND_ADD_ARRAY_ELEMENT:
+ case ZEND_ADD_ARRAY_UNPACK:
case ZEND_ROPE_INIT:
case ZEND_ROPE_ADD:
break; /* exception while building structures, live range handling will free those */
case ZEND_FETCH_CLASS:
- case ZEND_DECLARE_CLASS:
- case ZEND_DECLARE_INHERITED_CLASS:
case ZEND_DECLARE_ANON_CLASS:
- case ZEND_DECLARE_ANON_INHERITED_CLASS:
break; /* return value is zend_class_entry pointer */
default:
@@ -7012,15 +7541,6 @@ ZEND_VM_HANDLER(149, ZEND_HANDLE_EXCEPTION, ANY, ANY)
ZEND_VM_DISPATCH_TO_HELPER(zend_dispatch_try_catch_finally_helper, try_catch_offset, current_try_catch_offset, op_num, throw_op_num);
}
-ZEND_VM_HANDLER(146, ZEND_VERIFY_ABSTRACT_CLASS, ANY, ANY)
-{
- USE_OPLINE
-
- SAVE_OPLINE();
- zend_verify_abstract_class(Z_CE_P(EX_VAR(opline->op1.var)));
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
ZEND_VM_HANDLER(150, ZEND_USER_OPCODE, ANY, ANY)
{
USE_OPLINE
@@ -7085,29 +7605,26 @@ ZEND_VM_HANDLER(143, ZEND_DECLARE_CONST, CONST, CONST)
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-ZEND_VM_HANDLER(153, ZEND_DECLARE_LAMBDA_FUNCTION, CONST, UNUSED)
+ZEND_VM_HANDLER(142, ZEND_DECLARE_LAMBDA_FUNCTION, CONST, UNUSED, CACHE_SLOT)
{
USE_OPLINE
+ zend_function *func;
zval *zfunc;
zval *object;
zend_class_entry *called_scope;
- zend_function *fbc;
-
- 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;
+ func = CACHED_PTR(opline->extended_value);
+ if (UNEXPECTED(func == NULL)) {
+ zfunc = zend_hash_find_ex(EG(function_table), Z_STR_P(RT_CONSTANT(opline, opline->op1)), 1);
+ ZEND_ASSERT(zfunc != NULL);
+ func = Z_FUNC_P(zfunc);
+ ZEND_ASSERT(func->type == ZEND_USER_FUNCTION);
+ CACHE_PTR(opline->extended_value, 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) ||
+ if (UNEXPECTED((func->common.fn_flags & ZEND_ACC_STATIC) ||
(EX(func)->common.fn_flags & ZEND_ACC_STATIC))) {
object = NULL;
} else {
@@ -7117,7 +7634,7 @@ ZEND_VM_HANDLER(153, ZEND_DECLARE_LAMBDA_FUNCTION, CONST, UNUSED)
called_scope = Z_CE(EX(This));
object = NULL;
}
- zend_create_closure(EX_VAR(opline->result.var), Z_FUNC_P(zfunc),
+ zend_create_closure(EX_VAR(opline->result.var), func,
EX(func)->op_array.scope, called_scope, object);
ZEND_VM_NEXT_OPCODE();
@@ -7191,20 +7708,23 @@ ZEND_VM_HANDLER(160, ZEND_YIELD, CONST|TMP|VAR|CV|UNUSED, CONST|TMP|VAR|CV|UNUSE
/* If a function call result is yielded and the function did
* not return by reference we throw a notice. */
- if (OP1_TYPE == 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 {
+ do {
+ if (OP1_TYPE == IS_VAR) {
+ ZEND_ASSERT(value_ptr != &EG(uninitialized_zval));
+ if (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);
+ break;
+ }
+ }
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));
- }
+ } while (0);
FREE_OP1_VAR_PTR();
}
@@ -7288,7 +7808,7 @@ ZEND_VM_HANDLER(160, ZEND_YIELD, CONST|TMP|VAR|CV|UNUSED, CONST|TMP|VAR|CV|UNUSE
ZEND_VM_RETURN();
}
-ZEND_VM_HANDLER(142, ZEND_YIELD_FROM, CONST|TMP|VAR|CV, ANY)
+ZEND_VM_HANDLER(166, ZEND_YIELD_FROM, CONST|TMP|VAR|CV, ANY)
{
USE_OPLINE
@@ -7454,7 +7974,7 @@ ZEND_VM_HOT_HANDLER(168, ZEND_BIND_GLOBAL, CV, CONST, CACHE_SLOT)
{
USE_OPLINE
zend_free_op free_op1, free_op2;
- zval *varname;
+ zend_string *varname;
zval *value;
zval *variable_ptr;
uintptr_t idx;
@@ -7462,7 +7982,7 @@ ZEND_VM_HOT_HANDLER(168, ZEND_BIND_GLOBAL, CV, CONST, CACHE_SLOT)
ZEND_VM_REPEATABLE_OPCODE
- varname = GET_OP2_ZVAL_PTR(BP_VAR_R);
+ varname = Z_STR_P(GET_OP2_ZVAL_PTR(BP_VAR_R));
/* We store "hash slot index" + 1 (NULL is a mark of uninitialized cache slot) */
idx = (uintptr_t)CACHED_PTR(opline->extended_value) - 1;
@@ -7470,19 +7990,19 @@ ZEND_VM_HOT_HANDLER(168, ZEND_BIND_GLOBAL, CV, CONST, CACHE_SLOT)
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 == varname) ||
+ (EXPECTED(p->h == ZSTR_H(varname)) &&
EXPECTED(p->key != NULL) &&
- EXPECTED(zend_string_equal_content(p->key, Z_STR_P(varname)))))) {
+ EXPECTED(zend_string_equal_content(p->key, varname))))) {
value = (zval*)p; /* value = &p->val; */
ZEND_VM_C_GOTO(check_indirect);
}
}
- value = zend_hash_find_ex(&EG(symbol_table), Z_STR_P(varname), 1);
+ value = zend_hash_find_ex(&EG(symbol_table), varname, 1);
if (UNEXPECTED(value == NULL)) {
- value = zend_hash_add_new(&EG(symbol_table), Z_STR_P(varname), &EG(uninitialized_zval));
+ value = zend_hash_add_new(&EG(symbol_table), varname, &EG(uninitialized_zval));
idx = (char*)value - (char*)EG(symbol_table).arData;
/* Store "hash slot index" + 1 (NULL is a mark of uninitialized cache slot) */
CACHE_PTR(opline->extended_value, (void*)(idx + 1));
@@ -7558,7 +8078,7 @@ ZEND_VM_COLD_CONST_HANDLER(121, ZEND_STRLEN, CONST|TMPVAR|CV, ANY)
SAVE_OPLINE();
if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(value) == IS_UNDEF)) {
- value = GET_OP1_UNDEF_CV(value, BP_VAR_R);
+ value = ZVAL_UNDEFINED_OP1();
}
strict = EX_USES_STRICT_TYPES();
do {
@@ -7574,7 +8094,9 @@ ZEND_VM_COLD_CONST_HANDLER(121, ZEND_STRLEN, CONST|TMPVAR|CV, ANY)
}
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)));
+ if (!EG(exception)) {
+ 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);
}
@@ -7604,10 +8126,11 @@ ZEND_VM_C_LABEL(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();
+ ZVAL_UNDEFINED_OP1();
+ if (UNEXPECTED(EG(exception))) {
+ ZVAL_UNDEF(EX_VAR(opline->result.var));
+ HANDLE_EXCEPTION();
+ }
}
if (OP1_TYPE & (IS_TMP_VAR|IS_VAR)) {
SAVE_OPLINE();
@@ -7626,29 +8149,27 @@ ZEND_VM_HOT_HANDLER(122, ZEND_DEFINED, CONST, ANY, CACHE_SLOT)
{
USE_OPLINE
zend_constant *c;
- int result;
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;
+ if (EXPECTED(c != NULL)) {
+ if (!IS_SPECIAL_CACHE_VAL(c)) {
+ZEND_VM_C_LABEL(defined_true):
+ ZEND_VM_SMART_BRANCH_TRUE();
+ ZVAL_TRUE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
+ } else if (EXPECTED(zend_hash_num_elements(EG(zend_constants)) == DECODE_SPECIAL_CACHE_NUM(c))) {
+ZEND_VM_C_LABEL(defined_false):
+ ZEND_VM_SMART_BRANCH_FALSE();
+ ZVAL_FALSE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
}
- } while (0);
- ZEND_VM_SMART_BRANCH(result, 0);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
- ZEND_VM_NEXT_OPCODE();
+ }
+ 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))));
+ ZEND_VM_C_GOTO(defined_false);
+ } else {
+ ZEND_VM_C_GOTO(defined_true);
+ }
}
ZEND_VM_HANDLER(151, ZEND_ASSERT_CHECK, ANY, JMP_ADDR)
@@ -7713,7 +8234,7 @@ ZEND_VM_HANDLER(157, ZEND_FETCH_CLASS_NAME, UNUSED|CLASS_FETCH, ANY)
ZEND_VM_HANDLER(158, ZEND_CALL_TRAMPOLINE, ANY, ANY)
{
- zend_array *args;
+ zend_array *args = NULL;
zend_function *fbc = EX(func);
zval *ret = EX(return_value);
uint32_t call_info = EX_CALL_INFO() & (ZEND_CALL_NESTED | ZEND_CALL_TOP | ZEND_CALL_RELEASE_THIS);
@@ -7744,7 +8265,7 @@ ZEND_VM_HANDLER(158, ZEND_CALL_TRAMPOLINE, ANY, ANY)
ZEND_CALL_NUM_ARGS(call) = 2;
ZVAL_STR(ZEND_CALL_ARG(call, 1), fbc->common.function_name);
- if (num_args) {
+ if (args) {
ZVAL_ARR(ZEND_CALL_ARG(call, 2), args);
} else {
ZVAL_EMPTY_ARRAY(ZEND_CALL_ARG(call, 2));
@@ -7753,15 +8274,16 @@ ZEND_VM_HANDLER(158, ZEND_CALL_TRAMPOLINE, ANY, ANY)
fbc = call->func;
if (EXPECTED(fbc->type == ZEND_USER_FUNCTION)) {
- if (UNEXPECTED(!fbc->op_array.run_time_cache)) {
+ if (UNEXPECTED(!RUN_TIME_CACHE(&fbc->op_array))) {
init_func_run_time_cache(&fbc->op_array);
}
execute_data = call;
i_init_func_execute_data(&fbc->op_array, ret, 0 EXECUTE_DATA_CC);
if (EXPECTED(zend_execute_ex == execute_ex)) {
- LOAD_OPLINE();
+ LOAD_OPLINE_EX();
ZEND_VM_ENTER_EX();
} else {
+ SAVE_OPLINE_EX();
execute_data = EX(prev_execute_data);
LOAD_OPLINE();
ZEND_ADD_CALL_FLAG(call, ZEND_CALL_TOP);
@@ -7784,10 +8306,10 @@ ZEND_VM_HANDLER(158, ZEND_CALL_TRAMPOLINE, ANY, ANY)
}
if (ret == NULL) {
- ZVAL_NULL(&retval);
ret = &retval;
}
+ ZVAL_NULL(ret);
if (!zend_execute_internal) {
/* saves one function call if zend_execute_internal is not used */
fbc->internal_function.handler(call, ret);
@@ -7806,14 +8328,13 @@ ZEND_VM_HANDLER(158, ZEND_CALL_TRAMPOLINE, ANY, ANY)
EG(current_execute_data) = call->prev_execute_data;
+ZEND_VM_C_LABEL(call_trampoline_end):
zend_vm_stack_free_args(call);
-
if (ret == &retval) {
zval_ptr_dtor(ret);
}
}
-ZEND_VM_C_LABEL(call_trampoline_end):
execute_data = EG(current_execute_data);
if (!EX(func) || !ZEND_USER_CODE(EX(func)->type) || (call_info & ZEND_CALL_TOP)) {
@@ -7853,9 +8374,9 @@ ZEND_VM_HANDLER(182, ZEND_BIND_LEXICAL, TMP, CV, REF)
}
} else {
var = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
- if (UNEXPECTED(Z_ISUNDEF_P(var))) {
+ if (UNEXPECTED(Z_ISUNDEF_P(var)) && !(opline->extended_value & ZEND_BIND_IMPLICIT)) {
SAVE_OPLINE();
- var = GET_OP2_UNDEF_CV(var, BP_VAR_R);
+ var = ZVAL_UNDEFINED_OP2();
if (UNEXPECTED(EG(exception))) {
HANDLE_EXCEPTION();
}
@@ -7864,11 +8385,12 @@ ZEND_VM_HANDLER(182, ZEND_BIND_LEXICAL, TMP, CV, REF)
Z_TRY_ADDREF_P(var);
}
- zend_closure_bind_var_ex(closure, (opline->extended_value & ~ZEND_BIND_REF), var);
+ zend_closure_bind_var_ex(closure,
+ (opline->extended_value & ~(ZEND_BIND_REF|ZEND_BIND_IMPLICIT)), var);
ZEND_VM_NEXT_OPCODE();
}
-ZEND_VM_HANDLER(183, ZEND_BIND_STATIC, CV, CONST, REF)
+ZEND_VM_HANDLER(183, ZEND_BIND_STATIC, CV, UNUSED, REF)
{
USE_OPLINE
zend_free_op free_op1;
@@ -7877,18 +8399,22 @@ ZEND_VM_HANDLER(183, ZEND_BIND_STATIC, CV, CONST, REF)
zval *variable_ptr;
variable_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_W);
- zval_ptr_dtor(variable_ptr);
-
- ht = EX(func)->op_array.static_variables;
- ZEND_ASSERT(ht != NULL);
- if (GC_REFCOUNT(ht) > 1) {
+ i_zval_ptr_dtor(variable_ptr);
+
+ ht = ZEND_MAP_PTR_GET(EX(func)->op_array.static_variables_ptr);
+ if (!ht) {
+ ZEND_ASSERT(EX(func)->op_array.fn_flags & (ZEND_ACC_IMMUTABLE|ZEND_ACC_PRELOADED));
+ ht = zend_array_dup(EX(func)->op_array.static_variables);
+ ZEND_MAP_PTR_SET(EX(func)->op_array.static_variables_ptr, ht);
+ } else if (GC_REFCOUNT(ht) > 1) {
if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE)) {
GC_DELREF(ht);
}
- EX(func)->op_array.static_variables = ht = zend_array_dup(ht);
+ ht = zend_array_dup(ht);
+ ZEND_MAP_PTR_SET(EX(func)->op_array.static_variables_ptr, ht);
}
- value = (zval*)((char*)ht->arData + (opline->extended_value & ~ZEND_BIND_REF));
+ value = (zval*)((char*)ht->arData + (opline->extended_value & ~(ZEND_BIND_REF|ZEND_BIND_IMPLICIT)));
if (opline->extended_value & ZEND_BIND_REF) {
if (Z_TYPE_P(value) == IS_CONSTANT_AST) {
@@ -7903,6 +8429,7 @@ ZEND_VM_HANDLER(183, ZEND_BIND_STATIC, CV, CONST, REF)
GC_SET_REFCOUNT(ref, 2);
GC_TYPE_INFO(ref) = IS_REFERENCE;
ZVAL_COPY_VALUE(&ref->val, value);
+ ref->sources.ptr = NULL;
Z_REF_P(value) = ref;
Z_TYPE_INFO_P(value) = IS_REFERENCE_EX;
ZVAL_REF(variable_ptr, ref);
@@ -7949,13 +8476,13 @@ ZEND_VM_HANDLER(49, ZEND_CHECK_VAR, CV, UNUSED)
if (UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
SAVE_OPLINE();
- GET_OP1_UNDEF_CV(op1, BP_VAR_R);
+ ZVAL_UNDEFINED_OP1();
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
ZEND_VM_NEXT_OPCODE();
}
-ZEND_VM_HANDLER(51, ZEND_MAKE_REF, VAR|CV, UNUSED)
+ZEND_VM_HANDLER(140, ZEND_MAKE_REF, VAR|CV, UNUSED)
{
USE_OPLINE
zval *op1 = EX_VAR(opline->op1.var);
@@ -8057,41 +8584,41 @@ ZEND_VM_COLD_CONSTCONST_HANDLER(189, ZEND_IN_ARRAY, CONST|TMP|VAR|CV, CONST, NUM
zend_free_op free_op1;
zval *op1;
HashTable *ht = Z_ARRVAL_P(RT_CONSTANT(opline, opline->op2));
- int result;
+ zval *result;
SAVE_OPLINE();
op1 = GET_OP1_ZVAL_PTR_DEREF(BP_VAR_R);
if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
- result = zend_hash_exists(ht, Z_STR_P(op1));
+ result = zend_hash_find_ex(ht, Z_STR_P(op1), OP1_TYPE == IS_CONST);
} else if (opline->extended_value) {
if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
- result = zend_hash_index_exists(ht, Z_LVAL_P(op1));
+ result = zend_hash_index_find(ht, Z_LVAL_P(op1));
} else {
- result = 0;
+ result = NULL;
}
} else if (Z_TYPE_P(op1) <= IS_FALSE) {
- result = zend_hash_exists(ht, ZSTR_EMPTY_ALLOC());
+ result = zend_hash_find_ex(ht, ZSTR_EMPTY_ALLOC(), 1);
} else {
zend_string *key;
- zval key_tmp, result_tmp;
+ zval key_tmp, result_tmp, *val;
- result = 0;
- ZEND_HASH_FOREACH_STR_KEY(ht, key) {
+ result = NULL;
+ ZEND_HASH_FOREACH_STR_KEY_VAL(ht, key, val) {
ZVAL_STR(&key_tmp, key);
compare_function(&result_tmp, op1, &key_tmp);
if (Z_LVAL(result_tmp) == 0) {
- result = 1;
+ result = val;
break;
}
} ZEND_HASH_FOREACH_END();
}
FREE_OP1();
ZEND_VM_SMART_BRANCH(result, 1);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
+ ZVAL_BOOL(EX_VAR(opline->result.var), result != NULL);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-ZEND_VM_COLD_CONST_HANDLER(190, ZEND_COUNT, CONST|TMP|VAR|CV, UNUSED)
+ZEND_VM_COLD_CONST_HANDLER(190, ZEND_COUNT, CONST|TMPVAR|CV, UNUSED)
{
USE_OPLINE
zend_free_op free_op1;
@@ -8099,8 +8626,8 @@ ZEND_VM_COLD_CONST_HANDLER(190, ZEND_COUNT, CONST|TMP|VAR|CV, UNUSED)
zend_long count;
SAVE_OPLINE();
- op1 = GET_OP1_ZVAL_PTR_DEREF(BP_VAR_R);
- do {
+ op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
+ while (1) {
if (Z_TYPE_P(op1) == IS_ARRAY) {
count = zend_array_count(Z_ARRVAL_P(op1));
break;
@@ -8110,6 +8637,10 @@ ZEND_VM_COLD_CONST_HANDLER(190, ZEND_COUNT, CONST|TMP|VAR|CV, UNUSED)
if (SUCCESS == Z_OBJ_HT_P(op1)->count_elements(op1, &count)) {
break;
}
+ if (UNEXPECTED(EG(exception))) {
+ count = 0;
+ break;
+ }
}
/* if not and the object implements Countable we call its count() method */
@@ -8124,20 +8655,27 @@ ZEND_VM_COLD_CONST_HANDLER(190, ZEND_COUNT, CONST|TMP|VAR|CV, UNUSED)
/* 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) {
+ } else if ((OP1_TYPE & (IS_VAR|IS_CV)) != 0 && Z_TYPE_P(op1) == IS_REFERENCE) {
+ op1 = Z_REFVAL_P(op1);
+ continue;
+ } else if (Z_TYPE_P(op1) <= IS_NULL) {
+ if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ ZVAL_UNDEFINED_OP1();
+ }
count = 0;
} else {
count = 1;
}
- zend_error(E_WARNING, "count(): Parameter must be an array or an object that implements Countable");
- } while (0);
+ zend_error(E_WARNING, "%s(): Parameter must be an array or an object that implements Countable", opline->extended_value ? "sizeof" : "count");
+ break;
+ }
ZVAL_LONG(EX_VAR(opline->result.var), count);
FREE_OP1();
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-ZEND_VM_COLD_CONST_HANDLER(191, ZEND_GET_CLASS, UNUSED|CONST|TMP|VAR|CV, UNUSED)
+ZEND_VM_COLD_CONST_HANDLER(191, ZEND_GET_CLASS, UNUSED|CONST|TMPVAR|CV, UNUSED)
{
USE_OPLINE
@@ -8156,12 +8694,21 @@ ZEND_VM_COLD_CONST_HANDLER(191, ZEND_GET_CLASS, UNUSED|CONST|TMP|VAR|CV, UNUSED)
zval *op1;
SAVE_OPLINE();
- op1 = GET_OP1_ZVAL_PTR_DEREF(BP_VAR_R);
- 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));
+ op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
+ while (1) {
+ if (Z_TYPE_P(op1) == IS_OBJECT) {
+ ZVAL_STR_COPY(EX_VAR(opline->result.var), Z_OBJCE_P(op1)->name);
+ } else if ((OP1_TYPE & (IS_VAR|IS_CV)) != 0 && Z_TYPE_P(op1) == IS_REFERENCE) {
+ op1 = Z_REFVAL_P(op1);
+ continue;
+ } else {
+ if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ ZVAL_UNDEFINED_OP1();
+ }
+ 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));
+ }
+ break;
}
FREE_OP1();
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
@@ -8206,7 +8753,7 @@ ZEND_VM_COLD_CONST_HANDLER(193, ZEND_GET_TYPE, CONST|TMP|VAR|CV, UNUSED)
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-ZEND_VM_HANDLER(194, ZEND_FUNC_NUM_ARGS, UNUSED, UNUSED)
+ZEND_VM_HANDLER(171, ZEND_FUNC_NUM_ARGS, UNUSED, UNUSED)
{
USE_OPLINE
@@ -8214,7 +8761,7 @@ ZEND_VM_HANDLER(194, ZEND_FUNC_NUM_ARGS, UNUSED, UNUSED)
ZEND_VM_NEXT_OPCODE();
}
-ZEND_VM_HANDLER(195, ZEND_FUNC_GET_ARGS, UNUSED|CONST, UNUSED)
+ZEND_VM_HANDLER(172, ZEND_FUNC_GET_ARGS, UNUSED|CONST, UNUSED)
{
USE_OPLINE
zend_array *ht;
@@ -8251,10 +8798,11 @@ ZEND_VM_HANDLER(195, ZEND_FUNC_GET_ARGS, UNUSED|CONST, UNUSED)
if (Z_OPT_REFCOUNTED_P(q)) {
Z_ADDREF_P(q);
}
+ ZEND_HASH_FILL_SET(q);
} else {
- q = &EG(uninitialized_zval);
+ ZEND_HASH_FILL_SET_NULL();
}
- ZEND_HASH_FILL_ADD(q);
+ ZEND_HASH_FILL_NEXT();
p++;
i++;
}
@@ -8272,10 +8820,11 @@ ZEND_VM_HANDLER(195, ZEND_FUNC_GET_ARGS, UNUSED|CONST, UNUSED)
if (Z_OPT_REFCOUNTED_P(q)) {
Z_ADDREF_P(q);
}
+ ZEND_HASH_FILL_SET(q);
} else {
- q = &EG(uninitialized_zval);
+ ZEND_HASH_FILL_SET_NULL();
}
- ZEND_HASH_FILL_ADD(q);
+ ZEND_HASH_FILL_NEXT();
p++;
i++;
}
@@ -8287,6 +8836,16 @@ ZEND_VM_HANDLER(195, ZEND_FUNC_GET_ARGS, UNUSED|CONST, UNUSED)
ZEND_VM_NEXT_OPCODE();
}
+ZEND_VM_HANDLER(167, ZEND_COPY_TMP, TMPVAR, UNUSED)
+{
+ USE_OPLINE
+ zend_free_op free_op1;
+ zval *value = GET_OP1_ZVAL_PTR(BP_VAR_R);
+ zval *result = EX_VAR(opline->result.var);
+ ZVAL_COPY(result, value);
+ 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
@@ -8543,23 +9102,6 @@ ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_PRE_INC, (op1_info == MAY_BE_LONG), ZEND_PRE_
ZEND_VM_NEXT_OPCODE();
}
-ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_PRE_INC, (op1_info == (MAY_BE_LONG|MAY_BE_DOUBLE)), ZEND_PRE_INC_LONG_OR_DOUBLE, CV, ANY, SPEC(RETVAL))
-{
- USE_OPLINE
- zval *var_ptr;
-
- var_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW);
- if (EXPECTED(Z_TYPE_P(var_ptr) == IS_LONG)) {
- fast_long_increment_function(var_ptr);
- } else {
- Z_DVAL_P(var_ptr)++;
- }
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY_VALUE(EX_VAR(opline->result.var), var_ptr);
- }
- ZEND_VM_NEXT_OPCODE();
-}
-
ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_PRE_DEC, (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG), ZEND_PRE_DEC_LONG_NO_OVERFLOW, CV, ANY, SPEC(RETVAL))
{
USE_OPLINE
@@ -8586,23 +9128,6 @@ ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_PRE_DEC, (op1_info == MAY_BE_LONG), ZEND_PRE_
ZEND_VM_NEXT_OPCODE();
}
-ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_PRE_DEC, (op1_info == (MAY_BE_LONG|MAY_BE_DOUBLE)), ZEND_PRE_DEC_LONG_OR_DOUBLE, CV, ANY, SPEC(RETVAL))
-{
- USE_OPLINE
- zval *var_ptr;
-
- var_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW);
- if (EXPECTED(Z_TYPE_P(var_ptr) == IS_LONG)) {
- fast_long_decrement_function(var_ptr);
- } else {
- Z_DVAL_P(var_ptr)--;
- }
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY_VALUE(EX_VAR(opline->result.var), var_ptr);
- }
- ZEND_VM_NEXT_OPCODE();
-}
-
ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_POST_INC, (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG), ZEND_POST_INC_LONG_NO_OVERFLOW, CV, ANY)
{
USE_OPLINE
@@ -8625,22 +9150,6 @@ ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_POST_INC, (op1_info == MAY_BE_LONG), ZEND_POS
ZEND_VM_NEXT_OPCODE();
}
-ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_POST_INC, (op1_info == (MAY_BE_LONG|MAY_BE_DOUBLE)), ZEND_POST_INC_LONG_OR_DOUBLE, CV, ANY)
-{
- USE_OPLINE
- zval *var_ptr;
-
- var_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW);
- 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();
-}
-
ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_POST_DEC, (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG), ZEND_POST_DEC_LONG_NO_OVERFLOW, CV, ANY)
{
USE_OPLINE
@@ -8663,19 +9172,14 @@ ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_POST_DEC, (op1_info == MAY_BE_LONG), ZEND_POS
ZEND_VM_NEXT_OPCODE();
}
-ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_POST_DEC, (op1_info == (MAY_BE_LONG|MAY_BE_DOUBLE)), ZEND_POST_DEC_LONG_OR_DOUBLE, CV, ANY)
+ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_QM_ASSIGN, (op1_info == MAY_BE_LONG), ZEND_QM_ASSIGN_LONG, CONST|TMPVARCV, ANY)
{
USE_OPLINE
- zval *var_ptr;
+ zend_free_op free_op1;
+ zval *value;
- var_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW);
- 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)--;
- }
+ value = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
+ ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(value));
ZEND_VM_NEXT_OPCODE();
}
@@ -8870,7 +9374,7 @@ ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_FE_FETCH_R, op->op2_type == IS_CV && (op1_inf
}
variable_ptr = EX_VAR(opline->op2.var);
- zend_assign_to_variable(variable_ptr, value, IS_CV);
+ zend_assign_to_variable(variable_ptr, value, IS_CV, EX_USES_STRICT_TYPES());
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h
index a84cfe3d4b..ae30886c90 100644
--- a/Zend/zend_vm_execute.h
+++ b/Zend/zend_vm_execute.h
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| Zend Engine |
+----------------------------------------------------------------------+
- | Copyright (c) 1998-2018 Zend Technologies Ltd. (http://www.zend.com) |
+ | Copyright (c) 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 |
@@ -314,7 +314,6 @@ static zend_uchar zend_user_opcodes[256] = {0,
#define SPEC_RULE_RETVAL 0x00080000
#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
@@ -398,19 +397,24 @@ typedef ZEND_OPCODE_HANDLER_RET (ZEND_FASTCALL *opcode_handler_t) (ZEND_OPCODE_H
#undef LOAD_OPLINE
#undef LOAD_OPLINE_EX
#undef SAVE_OPLINE
+#undef SAVE_OPLINE_EX
#define DCL_OPLINE
#ifdef ZEND_VM_IP_GLOBAL_REG
# define OPLINE opline
# define USE_OPLINE
# define LOAD_OPLINE() opline = EX(opline)
+# define LOAD_OPLINE_EX()
# define LOAD_NEXT_OPLINE() opline = EX(opline) + 1
# define SAVE_OPLINE() EX(opline) = opline
+# define SAVE_OPLINE_EX() SAVE_OPLINE()
#else
# define OPLINE EX(opline)
# define USE_OPLINE const zend_op *opline = EX(opline);
# define LOAD_OPLINE()
+# define LOAD_OPLINE_EX()
# define LOAD_NEXT_OPLINE() ZEND_VM_INC_OPCODE()
# define SAVE_OPLINE()
+# define SAVE_OPLINE_EX()
#endif
#undef HANDLE_EXCEPTION
#undef HANDLE_EXCEPTION_LEAVE
@@ -436,6 +440,69 @@ typedef ZEND_OPCODE_HANDLER_RET (ZEND_FASTCALL *opcode_handler_t) (ZEND_OPCODE_H
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_interrupt_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_OPCODE_HANDLER_RET ZEND_FASTCALL zend_add_helper_SPEC(zval *op_1, zval *op_2 ZEND_OPCODE_HANDLER_ARGS_DC)
+{
+ USE_OPLINE
+
+ SAVE_OPLINE();
+ if (UNEXPECTED(Z_TYPE_INFO_P(op_1) == IS_UNDEF)) {
+ op_1 = ZVAL_UNDEFINED_OP1();
+ }
+ if (UNEXPECTED(Z_TYPE_INFO_P(op_2) == IS_UNDEF)) {
+ op_2 = ZVAL_UNDEFINED_OP2();
+ }
+ add_function(EX_VAR(opline->result.var), op_1, op_2);
+ if (opline->op1_type & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_nogc(op_1);
+ }
+ if (opline->op2_type & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_nogc(op_2);
+ }
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+}
+
+static zend_never_inline ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_sub_helper_SPEC(zval *op_1, zval *op_2 ZEND_OPCODE_HANDLER_ARGS_DC)
+{
+ USE_OPLINE
+
+ SAVE_OPLINE();
+ if (UNEXPECTED(Z_TYPE_INFO_P(op_1) == IS_UNDEF)) {
+ op_1 = ZVAL_UNDEFINED_OP1();
+ }
+ if (UNEXPECTED(Z_TYPE_INFO_P(op_2) == IS_UNDEF)) {
+ op_2 = ZVAL_UNDEFINED_OP2();
+ }
+ sub_function(EX_VAR(opline->result.var), op_1, op_2);
+ if (opline->op1_type & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_nogc(op_1);
+ }
+ if (opline->op2_type & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_nogc(op_2);
+ }
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+}
+
+static zend_never_inline ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_mul_helper_SPEC(zval *op_1, zval *op_2 ZEND_OPCODE_HANDLER_ARGS_DC)
+{
+ USE_OPLINE
+
+ SAVE_OPLINE();
+ if (UNEXPECTED(Z_TYPE_INFO_P(op_1) == IS_UNDEF)) {
+ op_1 = ZVAL_UNDEFINED_OP1();
+ }
+ if (UNEXPECTED(Z_TYPE_INFO_P(op_2) == IS_UNDEF)) {
+ op_2 = ZVAL_UNDEFINED_OP2();
+ }
+ mul_function(EX_VAR(opline->result.var), op_1, op_2);
+ if (opline->op1_type & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_nogc(op_1);
+ }
+ if (opline->op2_type & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_nogc(op_2);
+ }
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+}
+
static zend_never_inline ZEND_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_mod_by_zero_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -446,6 +513,260 @@ static zend_never_inline ZEND_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_mo
HANDLE_EXCEPTION();
}
+static zend_never_inline ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_mod_helper_SPEC(zval *op_1, zval *op_2 ZEND_OPCODE_HANDLER_ARGS_DC)
+{
+ USE_OPLINE
+
+ SAVE_OPLINE();
+ if (UNEXPECTED(Z_TYPE_INFO_P(op_1) == IS_UNDEF)) {
+ op_1 = ZVAL_UNDEFINED_OP1();
+ }
+ if (UNEXPECTED(Z_TYPE_INFO_P(op_2) == IS_UNDEF)) {
+ op_2 = ZVAL_UNDEFINED_OP2();
+ }
+ mod_function(EX_VAR(opline->result.var), op_1, op_2);
+ if (opline->op1_type & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_nogc(op_1);
+ }
+ if (opline->op2_type & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_nogc(op_2);
+ }
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+}
+
+static zend_never_inline ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_shift_left_helper_SPEC(zval *op_1, zval *op_2 ZEND_OPCODE_HANDLER_ARGS_DC)
+{
+ USE_OPLINE
+
+ SAVE_OPLINE();
+ if (UNEXPECTED(Z_TYPE_INFO_P(op_1) == IS_UNDEF)) {
+ op_1 = ZVAL_UNDEFINED_OP1();
+ }
+ if (UNEXPECTED(Z_TYPE_INFO_P(op_2) == IS_UNDEF)) {
+ op_2 = ZVAL_UNDEFINED_OP2();
+ }
+ shift_left_function(EX_VAR(opline->result.var), op_1, op_2);
+ if (opline->op1_type & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_nogc(op_1);
+ }
+ if (opline->op2_type & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_nogc(op_2);
+ }
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+}
+
+static zend_never_inline ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_shift_right_helper_SPEC(zval *op_1, zval *op_2 ZEND_OPCODE_HANDLER_ARGS_DC)
+{
+ USE_OPLINE
+
+ SAVE_OPLINE();
+ if (UNEXPECTED(Z_TYPE_INFO_P(op_1) == IS_UNDEF)) {
+ op_1 = ZVAL_UNDEFINED_OP1();
+ }
+ if (UNEXPECTED(Z_TYPE_INFO_P(op_2) == IS_UNDEF)) {
+ op_2 = ZVAL_UNDEFINED_OP2();
+ }
+ shift_right_function(EX_VAR(opline->result.var), op_1, op_2);
+ if (opline->op1_type & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_nogc(op_1);
+ }
+ if (opline->op2_type & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_nogc(op_2);
+ }
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+}
+
+static zend_never_inline ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_is_equal_helper_SPEC(zval *op_1, zval *op_2 ZEND_OPCODE_HANDLER_ARGS_DC)
+{
+ USE_OPLINE
+
+ SAVE_OPLINE();
+ if (UNEXPECTED(Z_TYPE_INFO_P(op_1) == IS_UNDEF)) {
+ op_1 = ZVAL_UNDEFINED_OP1();
+ }
+ if (UNEXPECTED(Z_TYPE_INFO_P(op_2) == IS_UNDEF)) {
+ op_2 = ZVAL_UNDEFINED_OP2();
+ }
+ compare_function(EX_VAR(opline->result.var), op_1, op_2);
+ if (opline->op1_type & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_nogc(op_1);
+ }
+ if (opline->op2_type & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_nogc(op_2);
+ }
+ if (UNEXPECTED(EG(exception))) {
+ HANDLE_EXCEPTION();
+ }
+ if (Z_LVAL_P(EX_VAR(opline->result.var)) == 0) {
+ ZEND_VM_SMART_BRANCH_TRUE();
+ ZVAL_TRUE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
+ } else {
+ ZEND_VM_SMART_BRANCH_FALSE();
+ ZVAL_FALSE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
+ }
+}
+
+static zend_never_inline ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_is_not_equal_helper_SPEC(zval *op_1, zval *op_2 ZEND_OPCODE_HANDLER_ARGS_DC)
+{
+ USE_OPLINE
+
+ SAVE_OPLINE();
+ if (UNEXPECTED(Z_TYPE_INFO_P(op_1) == IS_UNDEF)) {
+ op_1 = ZVAL_UNDEFINED_OP1();
+ }
+ if (UNEXPECTED(Z_TYPE_INFO_P(op_2) == IS_UNDEF)) {
+ op_2 = ZVAL_UNDEFINED_OP2();
+ }
+ compare_function(EX_VAR(opline->result.var), op_1, op_2);
+ if (opline->op1_type & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_nogc(op_1);
+ }
+ if (opline->op2_type & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_nogc(op_2);
+ }
+ if (UNEXPECTED(EG(exception))) {
+ HANDLE_EXCEPTION();
+ }
+ if (Z_LVAL_P(EX_VAR(opline->result.var)) != 0) {
+ ZEND_VM_SMART_BRANCH_TRUE();
+ ZVAL_TRUE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
+ } else {
+ ZEND_VM_SMART_BRANCH_FALSE();
+ ZVAL_FALSE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
+ }
+}
+
+static zend_never_inline ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_is_smaller_helper_SPEC(zval *op_1, zval *op_2 ZEND_OPCODE_HANDLER_ARGS_DC)
+{
+ USE_OPLINE
+
+ SAVE_OPLINE();
+ if (UNEXPECTED(Z_TYPE_INFO_P(op_1) == IS_UNDEF)) {
+ op_1 = ZVAL_UNDEFINED_OP1();
+ }
+ if (UNEXPECTED(Z_TYPE_INFO_P(op_2) == IS_UNDEF)) {
+ op_2 = ZVAL_UNDEFINED_OP2();
+ }
+ compare_function(EX_VAR(opline->result.var), op_1, op_2);
+ if (opline->op1_type & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_nogc(op_1);
+ }
+ if (opline->op2_type & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_nogc(op_2);
+ }
+ if (UNEXPECTED(EG(exception))) {
+ HANDLE_EXCEPTION();
+ }
+ if (Z_LVAL_P(EX_VAR(opline->result.var)) < 0) {
+ ZEND_VM_SMART_BRANCH_TRUE();
+ ZVAL_TRUE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
+ } else {
+ ZEND_VM_SMART_BRANCH_FALSE();
+ ZVAL_FALSE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
+ }
+}
+
+static zend_never_inline ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_is_smaller_or_equal_helper_SPEC(zval *op_1, zval *op_2 ZEND_OPCODE_HANDLER_ARGS_DC)
+{
+ USE_OPLINE
+
+ SAVE_OPLINE();
+ if (UNEXPECTED(Z_TYPE_INFO_P(op_1) == IS_UNDEF)) {
+ op_1 = ZVAL_UNDEFINED_OP1();
+ }
+ if (UNEXPECTED(Z_TYPE_INFO_P(op_2) == IS_UNDEF)) {
+ op_2 = ZVAL_UNDEFINED_OP2();
+ }
+ compare_function(EX_VAR(opline->result.var), op_1, op_2);
+ if (opline->op1_type & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_nogc(op_1);
+ }
+ if (opline->op2_type & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_nogc(op_2);
+ }
+ if (UNEXPECTED(EG(exception))) {
+ HANDLE_EXCEPTION();
+ }
+ if (Z_LVAL_P(EX_VAR(opline->result.var)) <= 0) {
+ ZEND_VM_SMART_BRANCH_TRUE();
+ ZVAL_TRUE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
+ } else {
+ ZEND_VM_SMART_BRANCH_FALSE();
+ ZVAL_FALSE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
+ }
+}
+
+static zend_never_inline ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_bw_or_helper_SPEC(zval *op_1, zval *op_2 ZEND_OPCODE_HANDLER_ARGS_DC)
+{
+ USE_OPLINE
+
+ SAVE_OPLINE();
+ if (UNEXPECTED(Z_TYPE_INFO_P(op_1) == IS_UNDEF)) {
+ op_1 = ZVAL_UNDEFINED_OP1();
+ }
+ if (UNEXPECTED(Z_TYPE_INFO_P(op_2) == IS_UNDEF)) {
+ op_2 = ZVAL_UNDEFINED_OP2();
+ }
+ bitwise_or_function(EX_VAR(opline->result.var), op_1, op_2);
+ if (opline->op1_type & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_nogc(op_1);
+ }
+ if (opline->op2_type & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_nogc(op_2);
+ }
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+}
+
+static zend_never_inline ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_bw_and_helper_SPEC(zval *op_1, zval *op_2 ZEND_OPCODE_HANDLER_ARGS_DC)
+{
+ USE_OPLINE
+
+ SAVE_OPLINE();
+ if (UNEXPECTED(Z_TYPE_INFO_P(op_1) == IS_UNDEF)) {
+ op_1 = ZVAL_UNDEFINED_OP1();
+ }
+ if (UNEXPECTED(Z_TYPE_INFO_P(op_2) == IS_UNDEF)) {
+ op_2 = ZVAL_UNDEFINED_OP2();
+ }
+ bitwise_and_function(EX_VAR(opline->result.var), op_1, op_2);
+ if (opline->op1_type & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_nogc(op_1);
+ }
+ if (opline->op2_type & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_nogc(op_2);
+ }
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+}
+
+static zend_never_inline ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_bw_xor_helper_SPEC(zval *op_1, zval *op_2 ZEND_OPCODE_HANDLER_ARGS_DC)
+{
+ USE_OPLINE
+
+ SAVE_OPLINE();
+ if (UNEXPECTED(Z_TYPE_INFO_P(op_1) == IS_UNDEF)) {
+ op_1 = ZVAL_UNDEFINED_OP1();
+ }
+ if (UNEXPECTED(Z_TYPE_INFO_P(op_2) == IS_UNDEF)) {
+ op_2 = ZVAL_UNDEFINED_OP2();
+ }
+ bitwise_xor_function(EX_VAR(opline->result.var), op_1, op_2);
+ if (opline->op1_type & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_nogc(op_1);
+ }
+ if (opline->op2_type & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_nogc(op_2);
+ }
+ ZEND_VM_NEXT_OPCODE_CHECK_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
@@ -460,21 +781,160 @@ static zend_never_inline ZEND_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_th
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)
+static zend_never_inline ZEND_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_undefined_function_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
+ zval *function_name;
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();
+ function_name = RT_CONSTANT(opline, opline->op2);
+ 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_undefined_function_helper_SPEC(zval *function_name ZEND_OPCODE_HANDLER_ARGS_DC)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_OP_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
+ /* This helper actually never will receive IS_VAR as second op, and has the same handling for VAR and TMP in the first op, but for interoperability with the other binary_assign_op helpers, it is necessary to "include" it */
+
+ USE_OPLINE
+ zend_free_op free_op_data;
+ zval *prop, *value;
+ zend_property_info *prop_info;
+ zend_reference *ref;
+
SAVE_OPLINE();
- zend_throw_error(NULL, "Call to undefined function %s()", Z_STRVAL_P(function_name));
- HANDLE_EXCEPTION();
+
+ if (UNEXPECTED(zend_fetch_static_property_address(&prop, &prop_info, (opline+1)->extended_value, BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) {
+ ZEND_ASSERT(EG(exception));
+ UNDEF_RESULT();
+ FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var);
+ HANDLE_EXCEPTION();
+ }
+
+ value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data);
+
+ do {
+ if (UNEXPECTED(Z_ISREF_P(prop))) {
+ ref = Z_REF_P(prop);
+ prop = Z_REFVAL_P(prop);
+ if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) {
+ zend_binary_assign_op_typed_ref(ref, value OPLINE_CC EXECUTE_DATA_CC);
+ break;
+ }
+ }
+
+ if (UNEXPECTED(prop_info->type)) {
+ /* special case for typed properties */
+ zend_binary_assign_op_typed_prop(prop_info, prop, value OPLINE_CC EXECUTE_DATA_CC);
+ } else {
+ zend_binary_op(prop, prop, value OPLINE_CC);
+ }
+ } while (0);
+
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+ ZVAL_COPY(EX_VAR(opline->result.var), prop);
+ }
+
+ FREE_OP(free_op_data);
+ /* assign_static_prop has two opcodes! */
+ ZEND_VM_NEXT_OPCODE_EX(1, 2);
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_STATIC_PROP_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zval *prop;
+ zend_property_info *prop_info;
+
+ SAVE_OPLINE();
+
+ if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) {
+ UNDEF_RESULT();
+ HANDLE_EXCEPTION();
+ }
+
+ zend_pre_incdec_property_zval(prop, prop_info->type ? prop_info : NULL OPLINE_CC EXECUTE_DATA_CC);
+
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+}
+
+/* No specialization for op_types (CONST|TMPVAR|CV, UNUSED|CONST|VAR) */
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_STATIC_PROP_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zval *prop;
+ zend_property_info *prop_info;
+
+ SAVE_OPLINE();
+
+ if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) {
+ UNDEF_RESULT();
+ HANDLE_EXCEPTION();
+ }
+
+ zend_post_incdec_property_zval(prop, prop_info->type ? prop_info : NULL OPLINE_CC EXECUTE_DATA_CC);
+
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+}
+
+/* No specialization for op_types (CONST|TMPVAR|CV, UNUSED|CONST|VAR) */
+static zend_never_inline ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC(int type ZEND_OPCODE_HANDLER_ARGS_DC)
+{
+ USE_OPLINE
+ zval *prop;
+
+ SAVE_OPLINE();
+
+ if (UNEXPECTED(zend_fetch_static_property_address(&prop, NULL, opline->extended_value & ~ZEND_FETCH_OBJ_FLAGS, type, opline->extended_value & ZEND_FETCH_OBJ_FLAGS OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) {
+ ZEND_ASSERT(EG(exception) || (type == BP_VAR_IS));
+ prop = &EG(uninitialized_zval);
+ }
+
+ if (type == BP_VAR_R || type == BP_VAR_IS) {
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), prop);
+ } else {
+ ZVAL_INDIRECT(EX_VAR(opline->result.var), prop);
+ }
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+}
+
+/* No specialization for op_types (CONST|TMPVAR|CV, UNUSED|CLASS_FETCH|CONST|VAR) */
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_STATIC_PROP_R_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ ZEND_VM_TAIL_CALL(zend_fetch_static_prop_helper_SPEC(BP_VAR_R ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+}
+
+/* No specialization for op_types (CONST|TMPVAR|CV, UNUSED|CLASS_FETCH|CONST|VAR) */
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_STATIC_PROP_W_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ ZEND_VM_TAIL_CALL(zend_fetch_static_prop_helper_SPEC(BP_VAR_W ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+}
+
+/* No specialization for op_types (CONST|TMPVAR|CV, UNUSED|CLASS_FETCH|CONST|VAR) */
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_STATIC_PROP_RW_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ ZEND_VM_TAIL_CALL(zend_fetch_static_prop_helper_SPEC(BP_VAR_RW ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+}
+
+/* No specialization for op_types (CONST|TMPVAR|CV, UNUSED|CLASS_FETCH|CONST|VAR) */
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_STATIC_PROP_FUNC_ARG_SPEC_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(fetch_type ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+}
+
+/* No specialization for op_types (CONST|TMPVAR|CV, UNUSED|CLASS_FETCH|CONST|VAR) */
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_STATIC_PROP_UNSET_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ ZEND_VM_TAIL_CALL(zend_fetch_static_prop_helper_SPEC(BP_VAR_UNSET ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+}
+
+/* No specialization for op_types (CONST|TMPVAR|CV, UNUSED|CLASS_FETCH|CONST|VAR) */
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_STATIC_PROP_IS_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ ZEND_VM_TAIL_CALL(zend_fetch_static_prop_helper_SPEC(BP_VAR_IS ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
static zend_never_inline ZEND_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_use_tmp_in_write_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS)
@@ -501,26 +961,186 @@ static zend_never_inline ZEND_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_us
HANDLE_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_OP_DATA_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+
+ zval *prop, *value;
+ zend_property_info *prop_info;
+
+ SAVE_OPLINE();
+
+ if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) {
+
+ UNDEF_RESULT();
+ HANDLE_EXCEPTION();
+ }
+
+ value = RT_CONSTANT((opline+1), (opline+1)->op1);
+
+ if (UNEXPECTED(prop_info->type)) {
+ value = zend_assign_to_typed_prop(prop_info, prop, value EXECUTE_DATA_CC);
+
+ } else {
+ value = zend_assign_to_variable(prop, value, IS_CONST, EX_USES_STRICT_TYPES());
+ }
+
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+ ZVAL_COPY(EX_VAR(opline->result.var), value);
+ }
+
+ /* assign_static_prop has two opcodes! */
+ ZEND_VM_NEXT_OPCODE_EX(1, 2);
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_OP_DATA_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op_data;
+ zval *prop, *value;
+ zend_property_info *prop_info;
+
+ SAVE_OPLINE();
+
+ if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) {
+ zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
+ UNDEF_RESULT();
+ HANDLE_EXCEPTION();
+ }
+
+ value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
+
+ if (UNEXPECTED(prop_info->type)) {
+ value = zend_assign_to_typed_prop(prop_info, prop, value EXECUTE_DATA_CC);
+ zval_ptr_dtor_nogc(free_op_data);
+ } else {
+ value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES());
+ }
+
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+ ZVAL_COPY(EX_VAR(opline->result.var), value);
+ }
+
+ /* assign_static_prop has two opcodes! */
+ ZEND_VM_NEXT_OPCODE_EX(1, 2);
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op_data;
+ zval *prop, *value;
+ zend_property_info *prop_info;
+
+ SAVE_OPLINE();
+
+ if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) {
+ zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
+ UNDEF_RESULT();
+ HANDLE_EXCEPTION();
+ }
+
+ value = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
+
+ if (UNEXPECTED(prop_info->type)) {
+ value = zend_assign_to_typed_prop(prop_info, prop, value EXECUTE_DATA_CC);
+ zval_ptr_dtor_nogc(free_op_data);
+ } else {
+ value = zend_assign_to_variable(prop, value, IS_VAR, EX_USES_STRICT_TYPES());
+ }
+
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+ ZVAL_COPY(EX_VAR(opline->result.var), value);
+ }
+
+ /* assign_static_prop has two opcodes! */
+ ZEND_VM_NEXT_OPCODE_EX(1, 2);
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+
+ zval *prop, *value;
+ zend_property_info *prop_info;
+
+ SAVE_OPLINE();
+
+ if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) {
+
+ UNDEF_RESULT();
+ HANDLE_EXCEPTION();
+ }
+
+ value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC);
+
+ if (UNEXPECTED(prop_info->type)) {
+ value = zend_assign_to_typed_prop(prop_info, prop, value EXECUTE_DATA_CC);
+
+ } else {
+ value = zend_assign_to_variable(prop, value, IS_CV, EX_USES_STRICT_TYPES());
+ }
+
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+ ZVAL_COPY(EX_VAR(opline->result.var), value);
+ }
+
+ /* assign_static_prop has two opcodes! */
+ ZEND_VM_NEXT_OPCODE_EX(1, 2);
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op_data;
+ zval *prop, *value_ptr;
+ zend_property_info *prop_info;
+
+ SAVE_OPLINE();
+
+ if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value & ~ZEND_RETURNS_FUNCTION, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) {
+ FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var);
+ UNDEF_RESULT();
+ HANDLE_EXCEPTION();
+ }
+
+ value_ptr = get_zval_ptr_ptr((opline+1)->op1_type, (opline+1)->op1, &free_op_data, BP_VAR_W);
+
+ if ((opline+1)->op1_type == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) {
+ prop = &EG(uninitialized_zval);
+ } else if ((opline+1)->op1_type == IS_VAR && (opline->extended_value & ZEND_RETURNS_FUNCTION) && UNEXPECTED(!Z_ISREF_P(value_ptr))) {
+ if (UNEXPECTED(!zend_wrong_assign_to_variable_reference(prop, value_ptr OPLINE_CC EXECUTE_DATA_CC))) {
+ prop = &EG(uninitialized_zval);
+ }
+ } else if (UNEXPECTED(prop_info->type)) {
+ prop = zend_assign_to_typed_property_reference(prop_info, prop, value_ptr EXECUTE_DATA_CC);
+ } else {
+ zend_assign_to_variable_reference(prop, value_ptr);
+ }
+
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+ ZVAL_COPY(EX_VAR(opline->result.var), prop);
+ }
+
+ if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);};
+ ZEND_VM_NEXT_OPCODE_EX(1, 2);
+}
+
+static zend_never_inline ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS)
{
zend_execute_data *old_execute_data;
uint32_t call_info = EX_CALL_INFO();
+ SAVE_OPLINE();
if (EXPECTED((call_info & (ZEND_CALL_CODE|ZEND_CALL_TOP|ZEND_CALL_HAS_SYMBOL_TABLE|ZEND_CALL_FREE_EXTRA_ARGS|ZEND_CALL_ALLOCATED)) == 0)) {
EG(current_execute_data) = EX(prev_execute_data);
i_free_compiled_variables(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)) {
+#ifdef ZEND_PREFER_RELOAD
+ call_info = EX_CALL_INFO();
#endif
- GC_DELREF(object);
- zend_object_store_ctor_failed(object);
- }
- OBJ_RELEASE(object);
+ if (UNEXPECTED(call_info & ZEND_CALL_RELEASE_THIS)) {
+ OBJ_RELEASE(Z_OBJ(execute_data->This));
} else if (UNEXPECTED(call_info & ZEND_CALL_CLOSURE)) {
OBJ_RELEASE(ZEND_CLOSURE_OBJECT(EX(func)));
}
@@ -538,6 +1158,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_leave_helper_SPEC(ZEND_OPCODE_
EG(current_execute_data) = EX(prev_execute_data);
i_free_compiled_variables(execute_data);
+#ifdef ZEND_PREFER_RELOAD
+ call_info = EX_CALL_INFO();
+#endif
if (UNEXPECTED(call_info & ZEND_CALL_HAS_SYMBOL_TABLE)) {
zend_clean_and_cache_symbol_table(EX(symbol_table));
}
@@ -547,16 +1170,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_leave_helper_SPEC(ZEND_OPCODE_
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);
+ OBJ_RELEASE(Z_OBJ(execute_data->This));
} else if (UNEXPECTED(call_info & ZEND_CALL_CLOSURE)) {
OBJ_RELEASE(ZEND_CLOSURE_OBJECT(EX(func)));
}
@@ -576,6 +1190,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_leave_helper_SPEC(ZEND_OPCODE_
zend_detach_symbol_table(execute_data);
destroy_op_array(&EX(func)->op_array);
efree_size(EX(func), sizeof(zend_op_array));
+#ifdef ZEND_PREFER_RELOAD
+ call_info = EX_CALL_INFO();
+#endif
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);
@@ -592,6 +1209,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_leave_helper_SPEC(ZEND_OPCODE_
if (EXPECTED((call_info & ZEND_CALL_CODE) == 0)) {
EG(current_execute_data) = EX(prev_execute_data);
i_free_compiled_variables(execute_data);
+#ifdef ZEND_PREFER_RELOAD
+ call_info = EX_CALL_INFO();
+#endif
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));
@@ -662,7 +1282,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DO_ICALL_SPEC_RETV
zend_vm_stack_free_call_frame(call);
if (!0) {
- zval_ptr_dtor(ret);
+ i_zval_ptr_dtor(ret);
}
if (UNEXPECTED(EG(exception) != NULL)) {
@@ -707,7 +1327,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DO_ICALL_SPEC_RETV
zend_vm_stack_free_call_frame(call);
if (!1) {
- zval_ptr_dtor(ret);
+ i_zval_ptr_dtor(ret);
}
if (UNEXPECTED(EG(exception) != NULL)) {
@@ -732,13 +1352,12 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DO_UCALL_SPEC_RETV
ret = NULL;
if (0) {
ret = EX_VAR(opline->result.var);
- ZVAL_NULL(ret);
}
call->prev_execute_data = execute_data;
execute_data = call;
i_init_func_execute_data(&fbc->op_array, ret, 0 EXECUTE_DATA_CC);
- LOAD_OPLINE();
+ LOAD_OPLINE_EX();
ZEND_VM_ENTER_EX();
}
@@ -756,13 +1375,12 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DO_UCALL_SPEC_RETV
ret = NULL;
if (1) {
ret = EX_VAR(opline->result.var);
- ZVAL_NULL(ret);
}
call->prev_execute_data = execute_data;
execute_data = call;
i_init_func_execute_data(&fbc->op_array, ret, 0 EXECUTE_DATA_CC);
- LOAD_OPLINE();
+ LOAD_OPLINE_EX();
ZEND_VM_ENTER_EX();
}
@@ -781,13 +1399,12 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DO_FCALL_BY_NAME_S
ret = NULL;
if (0) {
ret = EX_VAR(opline->result.var);
- ZVAL_NULL(ret);
}
call->prev_execute_data = execute_data;
execute_data = call;
i_init_func_execute_data(&fbc->op_array, ret, 0 EXECUTE_DATA_CC);
- LOAD_OPLINE();
+ LOAD_OPLINE_EX();
ZEND_VM_ENTER_EX();
} else {
@@ -797,8 +1414,12 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DO_FCALL_BY_NAME_S
if (UNEXPECTED((fbc->common.fn_flags & ZEND_ACC_DEPRECATED) != 0)) {
zend_deprecated_function(fbc);
if (UNEXPECTED(EG(exception) != NULL)) {
- UNDEF_RESULT();
- HANDLE_EXCEPTION();
+ UNDEF_RESULT();
+ if (!0) {
+ ret = &retval;
+ ZVAL_UNDEF(ret);
+ }
+ goto fcall_by_name_end;
}
}
@@ -807,10 +1428,12 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DO_FCALL_BY_NAME_S
if (UNEXPECTED(fbc->common.fn_flags & ZEND_ACC_HAS_TYPE_HINTS)
&& UNEXPECTED(!zend_verify_internal_arg_types(fbc, call))) {
- zend_vm_stack_free_call_frame(call);
- zend_rethrow_exception(execute_data);
- UNDEF_RESULT();
- HANDLE_EXCEPTION();
+ UNDEF_RESULT();
+ if (!0) {
+ ret = &retval;
+ ZVAL_UNDEF(ret);
+ }
+ goto fcall_by_name_end;
}
ret = 0 ? EX_VAR(opline->result.var) : &retval;
@@ -828,11 +1451,13 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DO_FCALL_BY_NAME_S
#endif
EG(current_execute_data) = execute_data;
+
+fcall_by_name_end:
zend_vm_stack_free_args(call);
zend_vm_stack_free_call_frame(call);
if (!0) {
- zval_ptr_dtor(ret);
+ i_zval_ptr_dtor(ret);
}
}
@@ -858,13 +1483,12 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DO_FCALL_BY_NAME_S
ret = NULL;
if (1) {
ret = EX_VAR(opline->result.var);
- ZVAL_NULL(ret);
}
call->prev_execute_data = execute_data;
execute_data = call;
i_init_func_execute_data(&fbc->op_array, ret, 0 EXECUTE_DATA_CC);
- LOAD_OPLINE();
+ LOAD_OPLINE_EX();
ZEND_VM_ENTER_EX();
} else {
@@ -874,8 +1498,12 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DO_FCALL_BY_NAME_S
if (UNEXPECTED((fbc->common.fn_flags & ZEND_ACC_DEPRECATED) != 0)) {
zend_deprecated_function(fbc);
if (UNEXPECTED(EG(exception) != NULL)) {
- UNDEF_RESULT();
- HANDLE_EXCEPTION();
+ UNDEF_RESULT();
+ if (!1) {
+ ret = &retval;
+ ZVAL_UNDEF(ret);
+ }
+ goto fcall_by_name_end;
}
}
@@ -884,10 +1512,12 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DO_FCALL_BY_NAME_S
if (UNEXPECTED(fbc->common.fn_flags & ZEND_ACC_HAS_TYPE_HINTS)
&& UNEXPECTED(!zend_verify_internal_arg_types(fbc, call))) {
- zend_vm_stack_free_call_frame(call);
- zend_rethrow_exception(execute_data);
- UNDEF_RESULT();
- HANDLE_EXCEPTION();
+ UNDEF_RESULT();
+ if (!1) {
+ ret = &retval;
+ ZVAL_UNDEF(ret);
+ }
+ goto fcall_by_name_end;
}
ret = 1 ? EX_VAR(opline->result.var) : &retval;
@@ -905,11 +1535,13 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DO_FCALL_BY_NAME_S
#endif
EG(current_execute_data) = execute_data;
+
+fcall_by_name_end:
zend_vm_stack_free_args(call);
zend_vm_stack_free_call_frame(call);
if (!1) {
- zval_ptr_dtor(ret);
+ i_zval_ptr_dtor(ret);
}
}
@@ -926,20 +1558,25 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DO_FCALL_SPEC_RETV
USE_OPLINE
zend_execute_data *call = EX(call);
zend_function *fbc = call->func;
- zend_object *object;
zval *ret;
+ zval retval;
SAVE_OPLINE();
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_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_abstract_method(fbc);
+fcall_except:
+ UNDEF_RESULT();
+ if (!0) {
+ ret = &retval;
+ ZVAL_UNDEF(ret);
+ }
+ goto fcall_end;
+ } else {
zend_deprecated_function(fbc);
if (UNEXPECTED(EG(exception) != NULL)) {
- UNDEF_RESULT();
- HANDLE_EXCEPTION();
+ goto fcall_except;
}
}
}
@@ -948,7 +1585,6 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DO_FCALL_SPEC_RETV
ret = NULL;
if (0) {
ret = EX_VAR(opline->result.var);
- ZVAL_NULL(ret);
}
call->prev_execute_data = execute_data;
@@ -956,24 +1592,22 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DO_FCALL_SPEC_RETV
i_init_func_execute_data(&fbc->op_array, ret, 1 EXECUTE_DATA_CC);
if (EXPECTED(zend_execute_ex == execute_ex)) {
- LOAD_OPLINE();
+ LOAD_OPLINE_EX();
ZEND_VM_ENTER_EX();
} else {
+ SAVE_OPLINE_EX();
execute_data = EX(prev_execute_data);
LOAD_OPLINE();
ZEND_ADD_CALL_FLAG(call, ZEND_CALL_TOP);
zend_execute_ex(call);
}
} else if (EXPECTED(fbc->type < ZEND_USER_FUNCTION)) {
- zval retval;
-
call->prev_execute_data = execute_data;
EG(current_execute_data) = call;
if (UNEXPECTED(fbc->common.fn_flags & ZEND_ACC_HAS_TYPE_HINTS)
&& UNEXPECTED(!zend_verify_internal_arg_types(fbc, call))) {
- UNDEF_RESULT();
- goto fcall_end;
+ goto fcall_except;
}
ret = 0 ? EX_VAR(opline->result.var) : &retval;
@@ -996,15 +1630,13 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DO_FCALL_SPEC_RETV
#endif
EG(current_execute_data) = execute_data;
- zend_vm_stack_free_args(call);
+fcall_end:
+ zend_vm_stack_free_args(call);
if (!0) {
- zval_ptr_dtor(ret);
+ i_zval_ptr_dtor(ret);
}
-
} else { /* ZEND_OVERLOADED_FUNCTION */
- zval retval;
-
ret = 0 ? EX_VAR(opline->result.var) : &retval;
call->prev_execute_data = execute_data;
@@ -1019,18 +1651,8 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DO_FCALL_SPEC_RETV
}
}
-fcall_end:
if (UNEXPECTED(ZEND_CALL_INFO(call) & ZEND_CALL_RELEASE_THIS)) {
- object = Z_OBJ(call->This);
-#if 0
- if (UNEXPECTED(EG(exception) != NULL) && (opline->op1.num & ZEND_CALL_CTOR)) {
-#else
- if (UNEXPECTED(EG(exception) != NULL) && (ZEND_CALL_INFO(call) & ZEND_CALL_CTOR)) {
-#endif
- GC_DELREF(object);
- zend_object_store_ctor_failed(object);
- }
- OBJ_RELEASE(object);
+ OBJ_RELEASE(Z_OBJ(call->This));
}
zend_vm_stack_free_call_frame(call);
@@ -1048,20 +1670,25 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DO_FCALL_SPEC_RETV
USE_OPLINE
zend_execute_data *call = EX(call);
zend_function *fbc = call->func;
- zend_object *object;
zval *ret;
+ zval retval;
SAVE_OPLINE();
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_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_abstract_method(fbc);
+fcall_except:
+ UNDEF_RESULT();
+ if (!1) {
+ ret = &retval;
+ ZVAL_UNDEF(ret);
+ }
+ goto fcall_end;
+ } else {
zend_deprecated_function(fbc);
if (UNEXPECTED(EG(exception) != NULL)) {
- UNDEF_RESULT();
- HANDLE_EXCEPTION();
+ goto fcall_except;
}
}
}
@@ -1070,7 +1697,6 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DO_FCALL_SPEC_RETV
ret = NULL;
if (1) {
ret = EX_VAR(opline->result.var);
- ZVAL_NULL(ret);
}
call->prev_execute_data = execute_data;
@@ -1078,24 +1704,22 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DO_FCALL_SPEC_RETV
i_init_func_execute_data(&fbc->op_array, ret, 1 EXECUTE_DATA_CC);
if (EXPECTED(zend_execute_ex == execute_ex)) {
- LOAD_OPLINE();
+ LOAD_OPLINE_EX();
ZEND_VM_ENTER_EX();
} else {
+ SAVE_OPLINE_EX();
execute_data = EX(prev_execute_data);
LOAD_OPLINE();
ZEND_ADD_CALL_FLAG(call, ZEND_CALL_TOP);
zend_execute_ex(call);
}
} else if (EXPECTED(fbc->type < ZEND_USER_FUNCTION)) {
- zval retval;
-
call->prev_execute_data = execute_data;
EG(current_execute_data) = call;
if (UNEXPECTED(fbc->common.fn_flags & ZEND_ACC_HAS_TYPE_HINTS)
&& UNEXPECTED(!zend_verify_internal_arg_types(fbc, call))) {
- UNDEF_RESULT();
- goto fcall_end;
+ goto fcall_except;
}
ret = 1 ? EX_VAR(opline->result.var) : &retval;
@@ -1118,15 +1742,13 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DO_FCALL_SPEC_RETV
#endif
EG(current_execute_data) = execute_data;
- zend_vm_stack_free_args(call);
+fcall_end:
+ zend_vm_stack_free_args(call);
if (!1) {
- zval_ptr_dtor(ret);
+ i_zval_ptr_dtor(ret);
}
-
} else { /* ZEND_OVERLOADED_FUNCTION */
- zval retval;
-
ret = 1 ? EX_VAR(opline->result.var) : &retval;
call->prev_execute_data = execute_data;
@@ -1141,18 +1763,8 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DO_FCALL_SPEC_RETV
}
}
-fcall_end:
if (UNEXPECTED(ZEND_CALL_INFO(call) & ZEND_CALL_RELEASE_THIS)) {
- object = Z_OBJ(call->This);
-#if 0
- if (UNEXPECTED(EG(exception) != NULL) && (opline->op1.num & ZEND_CALL_CTOR)) {
-#else
- if (UNEXPECTED(EG(exception) != NULL) && (ZEND_CALL_INFO(call) & ZEND_CALL_CTOR)) {
-#endif
- GC_DELREF(object);
- zend_object_store_ctor_failed(object);
- }
- OBJ_RELEASE(object);
+ OBJ_RELEASE(Z_OBJ(call->This));
}
zend_vm_stack_free_call_frame(call);
@@ -1210,7 +1822,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_GENERATOR_CREATE_SPEC_HANDLER(
gen_execute_data->return_value = (zval*)generator;
call_info = Z_TYPE_INFO(EX(This));
if ((call_info & Z_TYPE_MASK) == IS_OBJECT
- && (!(call_info & ((ZEND_CALL_CLOSURE|ZEND_CALL_RELEASE_THIS) << ZEND_CALL_INFO_SHIFT))
+ && (!(call_info & (ZEND_CALL_CLOSURE|ZEND_CALL_RELEASE_THIS))
/* Bug #72523 */
|| UNEXPECTED(zend_execute_ex != execute_ex))) {
ZEND_ADD_CALL_FLAG_EX(call_info, ZEND_CALL_RELEASE_THIS);
@@ -1399,7 +2011,7 @@ send_again:
goto send_again;
} else {
if (opline->op1_type == IS_CV && UNEXPECTED(Z_TYPE_P(args) == IS_UNDEF)) {
- GET_OP1_UNDEF_CV(args, BP_VAR_R);
+ ZVAL_UNDEFINED_OP1();
}
zend_error(E_WARNING, "Only arrays and Traversables can be unpacked");
}
@@ -1427,13 +2039,12 @@ 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_CLOSURE_OBJECT(EX(call)->func));
- }
- if (Z_TYPE(EX(call)->This) == IS_OBJECT) {
+ } else if (ZEND_CALL_INFO(EX(call)) & ZEND_CALL_RELEASE_THIS) {
OBJ_RELEASE(Z_OBJ(EX(call)->This));
}
EX(call)->func = (zend_function*)&zend_pass_function;
Z_OBJ(EX(call)->This) = NULL;
- ZEND_SET_CALL_INFO(EX(call), 0, ZEND_CALL_INFO(EX(call)) & ~ZEND_CALL_RELEASE_THIS);
+ ZEND_CALL_INFO(EX(call)) &= ~(ZEND_CALL_RELEASE_THIS | ZEND_CALL_HAS_THIS);
FREE_UNFETCHED_OP(opline->op2_type, opline->op2.var);
} else {
uint32_t arg_num;
@@ -1445,7 +2056,7 @@ send_array:
ht = Z_ARRVAL_P(args);
if (opline->op2_type != IS_UNUSED) {
zend_free_op free_op2;
- zval *op2 = get_zval_ptr_deref(opline->op2_type, opline->op2, &free_op2, BP_VAR_R);
+ zval *op2 = get_zval_ptr(opline->op2_type, opline->op2, &free_op2, BP_VAR_R);
uint32_t skip = opline->extended_value;
uint32_t count = zend_hash_num_elements(ht);
zend_long len = zval_get_long(op2);
@@ -1519,6 +2130,244 @@ send_array:
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
+static zend_never_inline ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_case_helper_SPEC(zval *op_1, zval *op_2 ZEND_OPCODE_HANDLER_ARGS_DC)
+{
+ USE_OPLINE
+
+ SAVE_OPLINE();
+ if (UNEXPECTED(Z_TYPE_INFO_P(op_1) == IS_UNDEF)) {
+ op_1 = ZVAL_UNDEFINED_OP1();
+ }
+ if (UNEXPECTED(Z_TYPE_INFO_P(op_2) == IS_UNDEF)) {
+ op_2 = ZVAL_UNDEFINED_OP2();
+ }
+ compare_function(EX_VAR(opline->result.var), op_1, op_2);
+ if (opline->op2_type & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_nogc(op_2);
+ }
+ if (UNEXPECTED(EG(exception))) {
+ HANDLE_EXCEPTION();
+ }
+ if (Z_LVAL_P(EX_VAR(opline->result.var)) == 0) {
+ ZEND_VM_SMART_BRANCH_TRUE();
+ ZVAL_TRUE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
+ } else {
+ ZEND_VM_SMART_BRANCH_FALSE();
+ ZVAL_FALSE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
+ }
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_ARRAY_UNPACK_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op1;
+ zval *op1;
+
+ SAVE_OPLINE();
+ op1 = get_zval_ptr(opline->op1_type, opline->op1, &free_op1, BP_VAR_R);
+
+add_unpack_again:
+ if (EXPECTED(Z_TYPE_P(op1) == IS_ARRAY)) {
+ HashTable *ht = Z_ARRVAL_P(op1);
+ zval *val;
+ zend_string *key;
+
+ ZEND_HASH_FOREACH_STR_KEY_VAL(ht, key, val) {
+ if (key) {
+ zend_throw_error(NULL, "Cannot unpack array with string keys");
+ FREE_OP(free_op1);
+ HANDLE_EXCEPTION();
+ } else {
+ if (Z_ISREF_P(val) && Z_REFCOUNT_P(val) == 1) {
+ val = Z_REFVAL_P(val);
+ }
+ Z_TRY_ADDREF_P(val);
+ if (!zend_hash_next_index_insert(Z_ARRVAL_P(EX_VAR(opline->result.var)), val)) {
+ zend_cannot_add_element();
+ zval_ptr_dtor_nogc(val);
+ break;
+ }
+ }
+ } ZEND_HASH_FOREACH_END();
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_OBJECT)) {
+ zend_class_entry *ce = Z_OBJCE_P(op1);
+ zend_object_iterator *iter;
+
+ if (!ce || !ce->get_iterator) {
+ zend_throw_error(NULL, "Only arrays and Traversables can be unpacked");
+ } else {
+ iter = ce->get_iterator(ce, op1, 0);
+ if (UNEXPECTED(!iter)) {
+ FREE_OP(free_op1);
+ if (!EG(exception)) {
+ zend_throw_exception_ex(
+ NULL, 0, "Object of type %s did not create an Iterator", ZSTR_VAL(ce->name)
+ );
+ }
+ HANDLE_EXCEPTION();
+ }
+
+ if (iter->funcs->rewind) {
+ iter->funcs->rewind(iter);
+ }
+
+ for (; iter->funcs->valid(iter) == SUCCESS; ) {
+ zval *val;
+
+ if (UNEXPECTED(EG(exception) != NULL)) {
+ break;
+ }
+
+ val = iter->funcs->get_current_data(iter);
+ if (UNEXPECTED(EG(exception) != NULL)) {
+ break;
+ }
+
+ if (iter->funcs->get_current_key) {
+ zval key;
+ iter->funcs->get_current_key(iter, &key);
+ if (UNEXPECTED(EG(exception) != NULL)) {
+ break;
+ }
+
+ if (UNEXPECTED(Z_TYPE(key) != IS_LONG)) {
+ zend_throw_error(NULL,
+ (Z_TYPE(key) == IS_STRING) ?
+ "Cannot unpack Traversable with string keys" :
+ "Cannot unpack Traversable with non-integer keys");
+ zval_ptr_dtor(&key);
+ break;
+ }
+ }
+
+ ZVAL_DEREF(val);
+ Z_TRY_ADDREF_P(val);
+
+ if (!zend_hash_next_index_insert(Z_ARRVAL_P(EX_VAR(opline->result.var)), val)) {
+ zend_cannot_add_element();
+ zval_ptr_dtor_nogc(val);
+ }
+
+ iter->funcs->move_forward(iter);
+ }
+
+ zend_iterator_dtor(iter);
+ }
+ } else if (EXPECTED(Z_ISREF_P(op1))) {
+ op1 = Z_REFVAL_P(op1);
+ goto add_unpack_again;
+ } else {
+ zend_throw_error(NULL, "Only arrays and Traversables can be unpacked");
+ }
+
+ FREE_OP(free_op1);
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+}
+
+static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_STATIC_PROP_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zval *varname;
+ zend_string *name, *tmp_name = NULL;
+ zend_class_entry *ce;
+ zend_free_op free_op1;
+
+ SAVE_OPLINE();
+
+ if (opline->op2_type == 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)), Z_STR_P(RT_CONSTANT(opline, opline->op2) + 1), ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
+ if (UNEXPECTED(ce == NULL)) {
+ ZEND_ASSERT(EG(exception));
+ FREE_UNFETCHED_OP(opline->op1_type, opline->op1.var);
+ HANDLE_EXCEPTION();
+ }
+ /*CACHE_PTR(opline->extended_value, ce);*/
+ }
+ } else if (opline->op2_type == IS_UNUSED) {
+ ce = zend_fetch_class(NULL, opline->op2.num);
+ if (UNEXPECTED(ce == NULL)) {
+ ZEND_ASSERT(EG(exception));
+ FREE_UNFETCHED_OP(opline->op1_type, opline->op1.var);
+ HANDLE_EXCEPTION();
+ }
+ } else {
+ ce = Z_CE_P(EX_VAR(opline->op2.var));
+ }
+
+ varname = get_zval_ptr_undef(opline->op1_type, opline->op1, &free_op1, BP_VAR_R);
+ if (opline->op1_type == IS_CONST) {
+ name = Z_STR_P(varname);
+ } else if (EXPECTED(Z_TYPE_P(varname) == IS_STRING)) {
+ name = Z_STR_P(varname);
+ } else {
+ if (opline->op1_type == IS_CV && UNEXPECTED(Z_TYPE_P(varname) == IS_UNDEF)) {
+ varname = ZVAL_UNDEFINED_OP1();
+ }
+ name = zval_get_tmp_string(varname, &tmp_name);
+ }
+
+ zend_std_unset_static_property(ce, name);
+
+ zend_tmp_string_release(tmp_name);
+ FREE_OP(free_op1);
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zval *value;
+ int result;
+
+ SAVE_OPLINE();
+
+ result = zend_fetch_static_property_address(&value, NULL, opline->extended_value & ~ZEND_ISEMPTY, BP_VAR_IS, 0 OPLINE_CC EXECUTE_DATA_CC);
+
+ if (!(opline->extended_value & ZEND_ISEMPTY)) {
+ result = result == SUCCESS && Z_TYPE_P(value) > IS_NULL &&
+ (!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL);
+ } else {
+ result = result != SUCCESS || !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_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_EXIT_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+
+ SAVE_OPLINE();
+ if (opline->op1_type != IS_UNUSED) {
+ zend_free_op free_op1;
+ zval *ptr = get_zval_ptr(opline->op1_type, opline->op1, &free_op1, BP_VAR_R);
+
+ do {
+ if (Z_TYPE_P(ptr) == IS_LONG) {
+ EG(exit_status) = Z_LVAL_P(ptr);
+ } else {
+ if ((opline->op1_type & (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);
+ FREE_OP(free_op1);
+ }
+ zend_bailout();
+ ZEND_VM_NEXT_OPCODE(); /* Never reached */
+}
+
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BEGIN_SILENCE_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -1594,22 +2443,36 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DECLARE_ANON_CLASS_SPEC_HANDLE
zend_class_entry *ce;
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();
- }
-
- if (!(ce->ce_flags & (ZEND_ACC_INTERFACE|ZEND_ACC_IMPLEMENT_INTERFACES|ZEND_ACC_IMPLEMENT_TRAITS))) {
- zend_verify_abstract_class(ce);
+ ce = CACHED_PTR(opline->extended_value);
+ if (UNEXPECTED(ce == NULL)) {
+ zend_string *rtd_key = Z_STR_P(RT_CONSTANT(opline, opline->op1));
+ zv = zend_hash_find_ex(EG(class_table), rtd_key, 1);
+ if (UNEXPECTED(zv == NULL)) {
+ SAVE_OPLINE();
+ do {
+ ZEND_ASSERT(EX(func)->op_array.fn_flags & ZEND_ACC_PRELOADED);
+ if (zend_preload_autoload
+ && zend_preload_autoload(EX(func)->op_array.filename) == SUCCESS) {
+ zv = zend_hash_find_ex(EG(class_table), rtd_key, 1);
+ if (EXPECTED(zv != NULL)) {
+ break;
+ }
+ }
+ zend_error_noreturn(E_ERROR, "Anonymous class wasn't preloaded");
+ } while (0);
+ }
+ ZEND_ASSERT(zv != NULL);
+ ce = Z_CE_P(zv);
+ if (!(ce->ce_flags & ZEND_ACC_LINKED)) {
+ SAVE_OPLINE();
+ if (zend_do_link_class(ce, (opline->op2_type == IS_CONST) ? Z_STR_P(RT_CONSTANT(opline, opline->op2)) : NULL) == FAILURE) {
+ HANDLE_EXCEPTION();
+ }
+ }
+ CACHE_PTR(opline->extended_value, ce);
}
- ce->ce_flags |= ZEND_ACC_ANON_BOUND;
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+ Z_CE_P(EX_VAR(opline->result.var)) = ce;
+ ZEND_VM_NEXT_OPCODE();
}
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DECLARE_FUNCTION_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
@@ -1617,7 +2480,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DECLARE_FUNCTION_SPEC_HANDLER(
USE_OPLINE
SAVE_OPLINE();
- do_bind_function(&EX(func)->op_array, opline, EG(function_table), 0);
+ do_bind_function(RT_CONSTANT(opline, opline->op1));
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
@@ -1650,40 +2513,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_NOP_SPEC_HANDLER(Z
ZEND_VM_NEXT_OPCODE();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_TRAIT_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_class_entry *ce = Z_CE_P(EX_VAR(opline->op1.var));
- zend_class_entry *trait;
-
- SAVE_OPLINE();
- 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)) {
- 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);
-
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BIND_TRAITS_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_class_entry *ce = Z_CE_P(EX_VAR(opline->op1.var));
-
- SAVE_OPLINE();
- zend_do_bind_traits(ce);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_dispatch_try_catch_finally_helper_SPEC(uint32_t try_catch_offset, uint32_t op_num ZEND_OPCODE_HANDLER_ARGS_DC)
+static zend_never_inline ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_dispatch_try_catch_finally_helper_SPEC(uint32_t try_catch_offset, uint32_t op_num ZEND_OPCODE_HANDLER_ARGS_DC)
{
/* May be NULL during generator closing (only finally blocks are executed) */
zend_object *ex = EG(exception);
@@ -1739,6 +2569,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_dispatch_try_catch_finally_hel
zend_generator_close(generator, 1);
ZEND_VM_RETURN();
} else {
+ /* We didn't execute RETURN, and have to initialize return_value */
+ if (EX(return_value)) {
+ ZVAL_UNDEF(EX(return_value));
+ }
ZEND_VM_TAIL_CALL(zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
}
@@ -1777,15 +2611,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_HANDLE_EXCEPTION_SPEC_HANDLER(
if (throw_op->result_type & (IS_VAR | IS_TMP_VAR)) {
switch (throw_op->opcode) {
case ZEND_ADD_ARRAY_ELEMENT:
+ case ZEND_ADD_ARRAY_UNPACK:
case ZEND_ROPE_INIT:
case ZEND_ROPE_ADD:
break; /* exception while building structures, live range handling will free those */
case ZEND_FETCH_CLASS:
- case ZEND_DECLARE_CLASS:
- case ZEND_DECLARE_INHERITED_CLASS:
case ZEND_DECLARE_ANON_CLASS:
- case ZEND_DECLARE_ANON_INHERITED_CLASS:
break; /* return value is zend_class_entry pointer */
default:
@@ -1796,15 +2628,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_HANDLE_EXCEPTION_SPEC_HANDLER(
ZEND_VM_TAIL_CALL(zend_dispatch_try_catch_finally_helper_SPEC(current_try_catch_offset, throw_op_num ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_VERIFY_ABSTRACT_CLASS_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
-
- SAVE_OPLINE();
- zend_verify_abstract_class(Z_CE_P(EX_VAR(opline->op1.var)));
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_USER_OPCODE_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -1920,7 +2743,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSERT_CHECK_SPEC_HANDLER(ZEND
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CALL_TRAMPOLINE_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- zend_array *args;
+ zend_array *args = NULL;
zend_function *fbc = EX(func);
zval *ret = EX(return_value);
uint32_t call_info = EX_CALL_INFO() & (ZEND_CALL_NESTED | ZEND_CALL_TOP | ZEND_CALL_RELEASE_THIS);
@@ -1951,7 +2774,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CALL_TRAMPOLINE_SPEC_HANDLER(Z
ZEND_CALL_NUM_ARGS(call) = 2;
ZVAL_STR(ZEND_CALL_ARG(call, 1), fbc->common.function_name);
- if (num_args) {
+ if (args) {
ZVAL_ARR(ZEND_CALL_ARG(call, 2), args);
} else {
ZVAL_EMPTY_ARRAY(ZEND_CALL_ARG(call, 2));
@@ -1960,15 +2783,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CALL_TRAMPOLINE_SPEC_HANDLER(Z
fbc = call->func;
if (EXPECTED(fbc->type == ZEND_USER_FUNCTION)) {
- if (UNEXPECTED(!fbc->op_array.run_time_cache)) {
+ if (UNEXPECTED(!RUN_TIME_CACHE(&fbc->op_array))) {
init_func_run_time_cache(&fbc->op_array);
}
execute_data = call;
i_init_func_execute_data(&fbc->op_array, ret, 0 EXECUTE_DATA_CC);
if (EXPECTED(zend_execute_ex == execute_ex)) {
- LOAD_OPLINE();
+ LOAD_OPLINE_EX();
ZEND_VM_ENTER_EX();
} else {
+ SAVE_OPLINE_EX();
execute_data = EX(prev_execute_data);
LOAD_OPLINE();
ZEND_ADD_CALL_FLAG(call, ZEND_CALL_TOP);
@@ -1991,10 +2815,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CALL_TRAMPOLINE_SPEC_HANDLER(Z
}
if (ret == NULL) {
- ZVAL_NULL(&retval);
ret = &retval;
}
+ ZVAL_NULL(ret);
if (!zend_execute_internal) {
/* saves one function call if zend_execute_internal is not used */
fbc->internal_function.handler(call, ret);
@@ -2013,14 +2837,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CALL_TRAMPOLINE_SPEC_HANDLER(Z
EG(current_execute_data) = call->prev_execute_data;
+call_trampoline_end:
zend_vm_stack_free_args(call);
-
if (ret == &retval) {
zval_ptr_dtor(ret);
}
}
-call_trampoline_end:
execute_data = EG(current_execute_data);
if (!EX(func) || !ZEND_USER_CODE(EX(func)->type) || (call_info & ZEND_CALL_TOP)) {
@@ -2051,7 +2874,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMP_FORWARD_SPEC_H
ZEND_VM_CONTINUE();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_interrupt_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS)
+static zend_never_inline ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_interrupt_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS)
{
EG(vm_interrupt) = 0;
SAVE_OPLINE();
@@ -2075,16 +2898,16 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_FCALL_BY_NAME
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)) {
- ZEND_VM_TAIL_CALL(zend_undefined_function_helper_SPEC(function_name ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+ ZEND_VM_TAIL_CALL(zend_undefined_function_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
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);
+ if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!RUN_TIME_CACHE(&fbc->op_array))) {
+ init_func_run_time_cache(&fbc->op_array);
}
CACHE_PTR(opline->result.num, fbc);
}
- call = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
- fbc, opline->extended_value, NULL, NULL);
+ call = _zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
+ fbc, opline->extended_value, NULL);
call->prev_execute_data = EX(call);
EX(call) = call;
@@ -2113,7 +2936,7 @@ try_function_name:
goto try_function_name;
} else {
if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(function_name) == IS_UNDEF)) {
- GET_OP2_UNDEF_CV(function_name, BP_VAR_R);
+ ZVAL_UNDEFINED_OP2();
if (UNEXPECTED(EG(exception) != NULL)) {
HANDLE_EXCEPTION();
}
@@ -2160,18 +2983,18 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_NS_FCALL_BY_N
if (func == NULL) {
func = zend_hash_find_ex(EG(function_table), Z_STR_P(func_name + 2), 1);
if (UNEXPECTED(func == NULL)) {
- ZEND_VM_TAIL_CALL(zend_undefined_function_helper_SPEC(func_name ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+ ZEND_VM_TAIL_CALL(zend_undefined_function_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
}
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);
+ if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!RUN_TIME_CACHE(&fbc->op_array))) {
+ init_func_run_time_cache(&fbc->op_array);
}
CACHE_PTR(opline->result.num, fbc);
}
- call = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
- fbc, opline->extended_value, NULL, NULL);
+ call = _zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
+ fbc, opline->extended_value, NULL);
call->prev_execute_data = EX(call);
EX(call) = call;
@@ -2181,7 +3004,6 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_NS_FCALL_BY_N
static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_FCALL_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
-
zval *fname;
zval *func;
zend_function *fbc;
@@ -2189,21 +3011,21 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_FCALL_SPEC_CO
fbc = CACHED_PTR(opline->result.num);
if (UNEXPECTED(fbc == NULL)) {
- fname = RT_CONSTANT(opline, opline->op2);
+ fname = (zval*)RT_CONSTANT(opline, opline->op2);
func = zend_hash_find_ex(EG(function_table), Z_STR_P(fname), 1);
if (UNEXPECTED(func == NULL)) {
- ZEND_VM_TAIL_CALL(zend_undefined_function_helper_SPEC(fname ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+ ZEND_VM_TAIL_CALL(zend_undefined_function_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
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);
+ if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!RUN_TIME_CACHE(&fbc->op_array))) {
+ init_func_run_time_cache(&fbc->op_array);
}
CACHE_PTR(opline->result.num, fbc);
}
- call = zend_vm_stack_push_call_frame_ex(
+ call = _zend_vm_stack_push_call_frame_ex(
opline->op1.num, ZEND_CALL_NESTED_FUNCTION,
- fbc, opline->extended_value, NULL, NULL);
+ fbc, opline->extended_value, NULL);
call->prev_execute_data = EX(call);
EX(call) = call;
@@ -2241,17 +3063,19 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RECV_INIT_SPEC_CON
ZVAL_COPY_VALUE(cache_val, param);
}
}
+ goto recv_init_check_type;
} else {
ZVAL_COPY(param, default_value);
}
- }
-
- if (UNEXPECTED((EX(func)->op_array.fn_flags & ZEND_ACC_HAS_TYPE_HINTS) != 0)) {
- zval *default_value = RT_CONSTANT(opline, opline->op2);
+ } else {
+recv_init_check_type:
+ if (UNEXPECTED((EX(func)->op_array.fn_flags & ZEND_ACC_HAS_TYPE_HINTS) != 0)) {
+ 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(opline->extended_value)) || EG(exception))) {
- HANDLE_EXCEPTION();
+ SAVE_OPLINE();
+ if (UNEXPECTED(!zend_verify_recv_arg_type(EX(func), arg_num, param, default_value, CACHE_ADDR(opline->extended_value)))) {
+ HANDLE_EXCEPTION();
+ }
}
}
@@ -2259,27 +3083,6 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RECV_INIT_SPEC_CON
ZEND_VM_NEXT_OPCODE();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_INTERFACE_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_class_entry *ce = Z_CE_P(EX_VAR(opline->op1.var));
- zend_class_entry *iface;
-
- SAVE_OPLINE();
- 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)) {
- ZEND_ASSERT(EG(exception));
- HANDLE_EXCEPTION();
- }
-
- if (UNEXPECTED((iface->ce_flags & ZEND_ACC_INTERFACE) == 0)) {
- zend_error_noreturn(E_ERROR, "%s cannot implement %s - it is not an interface", ZSTR_VAL(ce->name), ZSTR_VAL(iface->name));
- }
- zend_do_implement_interface(ce, iface);
-
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_DYNAMIC_CALL_SPEC_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -2302,7 +3105,7 @@ try_function_name:
goto try_function_name;
} 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);
+ ZVAL_UNDEFINED_OP2();
if (UNEXPECTED(EG(exception) != NULL)) {
HANDLE_EXCEPTION();
}
@@ -2344,11 +3147,11 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RECV_SPEC_UNUSED_H
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)) {
+ } else {
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))) {
+ if (UNEXPECTED(!zend_verify_recv_arg_type(EX(func), arg_num, param, NULL, CACHE_ADDR(opline->op2.num)))) {
HANDLE_EXCEPTION();
}
}
@@ -2376,7 +3179,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RECV_VARIADIC_SPEC_UNUSED_HAND
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));
+ zend_verify_variadic_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++;
@@ -2418,7 +3221,7 @@ try_function_name:
goto try_function_name;
} else {
if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(function_name) == IS_UNDEF)) {
- GET_OP2_UNDEF_CV(function_name, BP_VAR_R);
+ ZVAL_UNDEFINED_OP2();
if (UNEXPECTED(EG(exception) != NULL)) {
HANDLE_EXCEPTION();
}
@@ -2463,8 +3266,10 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_NOT_SPEC_CONST
}
SAVE_OPLINE();
- bitwise_not_function(EX_VAR(opline->result.var),
- RT_CONSTANT(opline, opline->op1));
+ if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ op1 = ZVAL_UNDEFINED_OP1();
+ }
+ bitwise_not_function(EX_VAR(opline->result.var), op1);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
@@ -2484,7 +3289,7 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BOOL_NOT_SPEC_CON
ZVAL_TRUE(EX_VAR(opline->result.var));
if (IS_CONST == IS_CV && UNEXPECTED(orig_val_type == IS_UNDEF)) {
SAVE_OPLINE();
- GET_OP1_UNDEF_CV(val, BP_VAR_R);
+ ZVAL_UNDEFINED_OP1();
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
} else {
@@ -2517,7 +3322,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ECHO_SPEC_CONST_HANDLER(ZEND_O
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);
+ ZVAL_UNDEFINED_OP1();
}
zend_string_release_ex(str, 0);
}
@@ -2538,7 +3343,7 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPZ_SPEC_CONST_H
} 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);
+ ZVAL_UNDEFINED_OP1();
if (UNEXPECTED(EG(exception))) {
HANDLE_EXCEPTION();
}
@@ -2569,7 +3374,7 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPNZ_SPEC_CONST_
} 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);
+ ZVAL_UNDEFINED_OP1();
if (UNEXPECTED(EG(exception))) {
HANDLE_EXCEPTION();
}
@@ -2587,7 +3392,7 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPNZ_SPEC_CONST_
ZEND_VM_JMP(opline);
}
-static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPZNZ_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPZNZ_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -2601,7 +3406,7 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPZNZ_SPEC_CONST
} 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);
+ ZVAL_UNDEFINED_OP1();
if (UNEXPECTED(EG(exception))) {
HANDLE_EXCEPTION();
}
@@ -2635,7 +3440,7 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPZ_EX_SPEC_CONS
ZVAL_FALSE(EX_VAR(opline->result.var));
if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(val) == IS_UNDEF)) {
SAVE_OPLINE();
- GET_OP1_UNDEF_CV(val, BP_VAR_R);
+ ZVAL_UNDEFINED_OP1();
if (UNEXPECTED(EG(exception))) {
HANDLE_EXCEPTION();
}
@@ -2672,7 +3477,7 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPNZ_EX_SPEC_CON
ZVAL_FALSE(EX_VAR(opline->result.var));
if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(val) == IS_UNDEF)) {
SAVE_OPLINE();
- GET_OP1_UNDEF_CV(val, BP_VAR_R);
+ ZVAL_UNDEFINED_OP1();
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
} else {
ZEND_VM_NEXT_OPCODE();
@@ -2703,7 +3508,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_SPEC_CONST_
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);
+ retval_ptr = ZVAL_UNDEFINED_OP1();
if (return_value) {
ZVAL_NULL(return_value);
}
@@ -2723,25 +3528,29 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_SPEC_CONST_
}
}
} 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))) {
- zend_refcounted *ref = Z_COUNTED_P(retval_ptr);
- if (GC_MAY_LEAK(ref)) {
- gc_possible_root(ref);
+ do {
+ if (Z_OPT_REFCOUNTED_P(retval_ptr)) {
+ if (EXPECTED(!Z_OPT_ISREF_P(retval_ptr))) {
+ if (EXPECTED(!(EX_CALL_INFO() & ZEND_CALL_CODE))) {
+ zend_refcounted *ref = Z_COUNTED_P(retval_ptr);
+ ZVAL_COPY_VALUE(return_value, retval_ptr);
+ if (GC_MAY_LEAK(ref)) {
+ gc_possible_root(ref);
+ }
+ ZVAL_NULL(retval_ptr);
+ break;
+ } else {
+ Z_ADDREF_P(retval_ptr);
}
- ZVAL_NULL(retval_ptr);
} else {
- Z_ADDREF_P(return_value);
+ retval_ptr = Z_REFVAL_P(retval_ptr);
+ if (Z_OPT_REFCOUNTED_P(retval_ptr)) {
+ Z_ADDREF_P(retval_ptr);
+ }
}
- } else {
- retval_ptr = Z_REFVAL_P(retval_ptr);
- ZVAL_COPY(return_value, retval_ptr);
}
- } else {
ZVAL_COPY_VALUE(return_value, retval_ptr);
- }
+ } while (0);
} else /* if (IS_CONST == IS_VAR) */ {
if (UNEXPECTED(Z_ISREF_P(retval_ptr))) {
zend_refcounted *ref = Z_COUNTED_P(retval_ptr);
@@ -2795,8 +3604,8 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_BY_REF_SPE
retval_ptr = NULL;
if (IS_CONST == IS_VAR) {
- if (retval_ptr == &EG(uninitialized_zval) ||
- (opline->extended_value == ZEND_RETURNS_FUNCTION && !Z_ISREF_P(retval_ptr))) {
+ ZEND_ASSERT(retval_ptr != &EG(uninitialized_zval));
+ if (opline->extended_value == ZEND_RETURNS_FUNCTION && !Z_ISREF_P(retval_ptr)) {
zend_error(E_NOTICE, "Only variable references should be returned by reference");
if (EX(return_value)) {
ZVAL_NEW_REF(EX(return_value), retval_ptr);
@@ -2883,7 +3692,7 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_THROW_SPEC_CONST_
}
}
if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(value) == IS_UNDEF)) {
- GET_OP1_UNDEF_CV(value, BP_VAR_R);
+ ZVAL_UNDEFINED_OP1();
if (UNEXPECTED(EG(exception) != NULL)) {
HANDLE_EXCEPTION();
}
@@ -2920,7 +3729,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CATCH_SPEC_CONST_HANDLER(ZEND_
}
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);
+ catch_ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op1)), Z_STR_P(RT_CONSTANT(opline, opline->op1) + 1), ZEND_FETCH_CLASS_NO_AUTOLOAD);
CACHE_PTR(opline->extended_value & ~ZEND_LAST_CATCH, catch_ce);
}
@@ -2944,17 +3753,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CATCH_SPEC_CONST_HANDLER(ZEND_
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 {
+ {
+ /* Always perform a strict assignment. There is a reasonable expectation that if you
+ * write "catch (Exception $e)" then $e will actually be instanceof Exception. As such,
+ * we should not permit coercion to string here. */
+ zval tmp;
+ ZVAL_OBJ(&tmp, exception);
EG(exception) = NULL;
- ZEND_VM_NEXT_OPCODE();
+ zend_assign_to_variable(ex, &tmp, IS_TMP_VAR, /* strict */ 1);
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
}
@@ -3034,13 +3841,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_USER_SPEC_CONST_HANDLER(Z
SAVE_OPLINE();
- 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_param_must_be_ref(EX(call)->func, opline->op2.num);
}
+ arg = RT_CONSTANT(opline, opline->op1);
+ param = ZEND_CALL_VAR(EX(call), opline->result.var);
ZVAL_COPY(param, arg);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
@@ -3061,7 +3868,7 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BOOL_SPEC_CONST_H
ZVAL_FALSE(EX_VAR(opline->result.var));
if (IS_CONST == IS_CV && UNEXPECTED(orig_val_type == IS_UNDEF)) {
SAVE_OPLINE();
- GET_OP1_UNDEF_CV(val, BP_VAR_R);
+ ZVAL_UNDEFINED_OP1();
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
} else {
@@ -3100,7 +3907,7 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CLONE_SPEC_CONST_
}
ZVAL_UNDEF(EX_VAR(opline->result.var));
if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(obj) == IS_UNDEF)) {
- GET_OP1_UNDEF_CV(obj, BP_VAR_R);
+ ZVAL_UNDEFINED_OP1();
if (UNEXPECTED(EG(exception) != NULL)) {
HANDLE_EXCEPTION();
}
@@ -3121,23 +3928,12 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CLONE_SPEC_CONST_
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_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 (clone && !(clone->common.fn_flags & ZEND_ACC_PUBLIC)) {
+ scope = EX(func)->op_array.scope;
+ if (clone->common.scope != scope) {
+ if (UNEXPECTED(clone->common.fn_flags & ZEND_ACC_PRIVATE)
+ || UNEXPECTED(!zend_check_protected(zend_get_function_root_class(clone), scope))) {
+ zend_wrong_clone_call(clone, scope);
ZVAL_UNDEF(EX_VAR(opline->result.var));
HANDLE_EXCEPTION();
@@ -3206,22 +4002,18 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CAST_SPEC_CONST_H
} 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);
+ } else {
+ HashTable *obj_ht = zend_get_properties_for(expr, ZEND_PROP_PURPOSE_ARRAY_CAST);
if (obj_ht) {
/* fast copy */
- obj_ht = zend_proptable_to_symtable(obj_ht,
+ ZVAL_ARR(result, 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);
+ GC_IS_RECURSIVE(obj_ht))));
+ zend_release_properties(obj_ht);
} else {
ZVAL_EMPTY_ARRAY(result);
}
- } else {
- ZVAL_COPY_VALUE(result, expr);
- Z_ADDREF_P(result);
- convert_to_array(result);
}
} else {
ZVAL_OBJ(result, zend_objects_new(zend_standard_class_def));
@@ -3275,15 +4067,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INCLUDE_OR_EVAL_SPEC_CONST_HAN
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,
+ call = zend_vm_stack_push_call_frame(
+ (Z_TYPE_INFO(EX(This)) & ZEND_CALL_HAS_THIS) | 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);
+ Z_PTR(EX(This)));
if (EX_CALL_INFO() & ZEND_CALL_HAS_SYMBOL_TABLE) {
call->symbol_table = EX(symbol_table);
@@ -3462,35 +4253,6 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_
}
}
-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 = RT_CONSTANT(opline, opline->op1);
-
- do {
- if (Z_TYPE_P(ptr) == IS_LONG) {
- EG(exit_status) = Z_LVAL_P(ptr);
- } else {
- if ((IS_CONST & (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);
-
- }
- zend_bailout();
- ZEND_VM_NEXT_OPCODE(); /* Never reached */
-}
-
static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMP_SET_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -3589,7 +4351,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_QM_ASSIGN_SPEC_CON
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);
+ ZVAL_UNDEFINED_OP1();
ZVAL_NULL(result);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
@@ -3623,7 +4385,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DECLARE_CLASS_SPEC_CONST_HANDL
USE_OPLINE
SAVE_OPLINE();
- Z_CE_P(EX_VAR(opline->result.var)) = do_bind_class(&EX(func)->op_array, opline, EG(class_table), 0);
+ do_bind_class(RT_CONSTANT(opline, opline->op1), (opline->op2_type == IS_CONST) ? Z_STR_P(RT_CONSTANT(opline, opline->op2)) : NULL);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
@@ -3756,7 +4518,7 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_STRLEN_SPEC_CONST
SAVE_OPLINE();
if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(value) == IS_UNDEF)) {
- value = GET_OP1_UNDEF_CV(value, BP_VAR_R);
+ value = ZVAL_UNDEFINED_OP1();
}
strict = EX_USES_STRICT_TYPES();
do {
@@ -3772,7 +4534,9 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_STRLEN_SPEC_CONST
}
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)));
+ if (!EG(exception)) {
+ 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);
}
@@ -3802,10 +4566,11 @@ 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();
+ ZVAL_UNDEFINED_OP1();
+ if (UNEXPECTED(EG(exception))) {
+ ZVAL_UNDEF(EX_VAR(opline->result.var));
+ HANDLE_EXCEPTION();
+ }
}
if (IS_CONST & (IS_TMP_VAR|IS_VAR)) {
SAVE_OPLINE();
@@ -3824,28 +4589,37 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DEFINED_SPEC_CONST
{
USE_OPLINE
zend_constant *c;
- int result;
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;
+ if (EXPECTED(c != NULL)) {
+ if (!IS_SPECIAL_CACHE_VAL(c)) {
+defined_true:
+ ZEND_VM_SMART_BRANCH_TRUE();
+ ZVAL_TRUE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
+ } else if (EXPECTED(zend_hash_num_elements(EG(zend_constants)) == DECODE_SPECIAL_CACHE_NUM(c))) {
+defined_false:
+ ZEND_VM_SMART_BRANCH_FALSE();
+ ZVAL_FALSE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
}
- } while (0);
- ZEND_VM_SMART_BRANCH(result, 0);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
+ }
+ 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))));
+ goto defined_false;
+ } else {
+ goto defined_true;
+ }
+}
+
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_QM_ASSIGN_LONG_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+
+ zval *value;
+
+ value = RT_CONSTANT(opline, opline->op1);
+ ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(value));
ZEND_VM_NEXT_OPCODE();
}
@@ -3904,42 +4678,38 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_SPEC_CONST_CO
USE_OPLINE
zval *op1, *op2, *result;
+ double d1, d2;
op1 = RT_CONSTANT(opline, opline->op1);
op2 = RT_CONSTANT(opline, opline->op2);
- if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (1 && IS_CONST == IS_CONST && IS_CONST == IS_CONST) {
+ /* pass */
+ } else 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();
+ d1 = (double)Z_LVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+ goto add_double;
}
} else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+add_double:
result = EX_VAR(opline->result.var);
- ZVAL_DOUBLE(result, Z_DVAL_P(op1) + Z_DVAL_P(op2));
+ ZVAL_DOUBLE(result, d1 + d2);
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();
+ d1 = Z_DVAL_P(op1);
+ d2 = (double)Z_LVAL_P(op2);
+ goto add_double;
}
}
- 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_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);
-
-
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+ ZEND_VM_TAIL_CALL(zend_add_helper_SPEC(op1, op2 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SUB_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
@@ -3947,42 +4717,38 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SUB_SPEC_CONST_CO
USE_OPLINE
zval *op1, *op2, *result;
+ double d1, d2;
op1 = RT_CONSTANT(opline, opline->op1);
op2 = RT_CONSTANT(opline, opline->op2);
- if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (1 && IS_CONST == IS_CONST && IS_CONST == IS_CONST) {
+ /* pass */
+ } else 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();
+ d1 = (double)Z_LVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+ goto sub_double;
}
} else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+sub_double:
result = EX_VAR(opline->result.var);
- ZVAL_DOUBLE(result, Z_DVAL_P(op1) - Z_DVAL_P(op2));
+ ZVAL_DOUBLE(result, d1 - d2);
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();
+ d1 = Z_DVAL_P(op1);
+ d2 = (double)Z_LVAL_P(op2);
+ goto sub_double;
}
}
- 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_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);
-
-
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+ ZEND_VM_TAIL_CALL(zend_sub_helper_SPEC(op1, op2 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MUL_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
@@ -3990,10 +4756,13 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MUL_SPEC_CONST_CO
USE_OPLINE
zval *op1, *op2, *result;
+ double d1, d2;
op1 = RT_CONSTANT(opline, opline->op1);
op2 = RT_CONSTANT(opline, opline->op2);
- if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (1 && IS_CONST == IS_CONST && IS_CONST == IS_CONST) {
+ /* pass */
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
zend_long overflow;
@@ -4002,33 +4771,26 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MUL_SPEC_CONST_CO
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();
+ d1 = (double)Z_LVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+ goto mul_double;
}
} else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+mul_double:
result = EX_VAR(opline->result.var);
- ZVAL_DOUBLE(result, Z_DVAL_P(op1) * Z_DVAL_P(op2));
+ ZVAL_DOUBLE(result, d1 * d2);
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();
+ d1 = Z_DVAL_P(op1);
+ d2 = (double)Z_LVAL_P(op2);
+ goto mul_double;
}
}
- 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_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);
-
-
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+ ZEND_VM_TAIL_CALL(zend_mul_helper_SPEC(op1, op2 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DIV_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
@@ -4054,7 +4816,9 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MOD_SPEC_CONST_CO
op1 = RT_CONSTANT(opline, opline->op1);
op2 = RT_CONSTANT(opline, opline->op2);
- if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (1 && IS_CONST == IS_CONST && IS_CONST == IS_CONST) {
+ /* pass */
+ } else 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)) {
@@ -4069,17 +4833,7 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MOD_SPEC_CONST_CO
}
}
- 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_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);
-
-
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+ ZEND_VM_TAIL_CALL(zend_mod_helper_SPEC(op1, op2 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SL_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
@@ -4090,24 +4844,18 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SL_SPEC_CONST_CON
op1 = RT_CONSTANT(opline, opline->op1);
op2 = RT_CONSTANT(opline, opline->op2);
- if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)
+ if (1 && IS_CONST == IS_CONST && IS_CONST == IS_CONST) {
+ /* pass */
+ } else 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));
+ /* Perform shift on unsigned numbers to get well-defined wrap behavior. */
+ ZVAL_LONG(EX_VAR(opline->result.var),
+ (zend_long) ((zend_ulong) 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_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);
-
-
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+ ZEND_VM_TAIL_CALL(zend_shift_left_helper_SPEC(op1, op2 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SR_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
@@ -4118,24 +4866,16 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SR_SPEC_CONST_CON
op1 = RT_CONSTANT(opline, opline->op1);
op2 = RT_CONSTANT(opline, opline->op2);
- if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)
+ if (1 && IS_CONST == IS_CONST && IS_CONST == IS_CONST) {
+ /* pass */
+ } else 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_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);
-
-
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+ ZEND_VM_TAIL_CALL(zend_shift_right_helper_SPEC(op1, op2 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POW_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
@@ -4158,7 +4898,7 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_IDENTICAL_SPEC
USE_OPLINE
zval *op1, *op2;
- int result;
+ zend_bool result;
SAVE_OPLINE();
op1 = RT_CONSTANT(opline, opline->op1);
@@ -4176,7 +4916,7 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_
USE_OPLINE
zval *op1, *op2;
- int result;
+ zend_bool result;
SAVE_OPLINE();
op1 = RT_CONSTANT(opline, opline->op1);
@@ -4193,216 +4933,222 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_CON
{
USE_OPLINE
- zval *op1, *op2, *result;
+ zval *op1, *op2;
+ double d1, d2;
op1 = RT_CONSTANT(opline, opline->op1);
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));
+ if (1 && IS_CONST == IS_CONST && IS_CONST == IS_CONST) {
+ /* pass */
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_LVAL_P(op1) == Z_LVAL_P(op2))) {
+is_equal_true:
+ ZEND_VM_SMART_BRANCH_TRUE();
+ ZVAL_TRUE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
} else {
- break;
+is_equal_false:
+ ZEND_VM_SMART_BRANCH_FALSE();
+ ZVAL_FALSE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
}
- } 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 if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ d1 = (double)Z_LVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+ goto is_equal_double;
+ }
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+is_equal_double:
+ if (d1 == d2) {
+ goto is_equal_true;
} else {
- break;
+ goto is_equal_false;
}
- } 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 if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = (double)Z_LVAL_P(op2);
+ goto is_equal_double;
+ }
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
+ if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
+ int result = zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2));
+ if (IS_CONST & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_str(op1);
+ }
+ if (IS_CONST & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_str(op2);
+ }
+ if (result) {
+ goto is_equal_true;
} else {
- break;
+ goto is_equal_false;
}
- } 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();
+ ZEND_VM_TAIL_CALL(zend_is_equal_helper_SPEC(op1, op2 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
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;
+ zval *op1, *op2;
+ double d1, d2;
op1 = RT_CONSTANT(opline, opline->op1);
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));
+ if (1 && IS_CONST == IS_CONST && IS_CONST == IS_CONST) {
+ /* pass */
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_LVAL_P(op1) != Z_LVAL_P(op2))) {
+is_not_equal_true:
+ ZEND_VM_SMART_BRANCH_TRUE();
+ ZVAL_TRUE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
} else {
- break;
+is_not_equal_false:
+ ZEND_VM_SMART_BRANCH_FALSE();
+ ZVAL_FALSE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
}
- } 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 if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ d1 = (double)Z_LVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+ goto is_not_equal_double;
+ }
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+is_not_equal_double:
+ if (d1 != d2) {
+ goto is_not_equal_true;
} else {
- break;
+ goto is_not_equal_false;
}
- } 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 if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = (double)Z_LVAL_P(op2);
+ goto is_not_equal_double;
+ }
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
+ if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
+ int result = zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2));
+ if (IS_CONST & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_str(op1);
+ }
+ if (IS_CONST & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_str(op2);
+ }
+ if (!result) {
+ goto is_not_equal_true;
} else {
- break;
+ goto is_not_equal_false;
}
- } 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();
+ ZEND_VM_TAIL_CALL(zend_is_not_equal_helper_SPEC(op1, op2 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
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;
+ zval *op1, *op2;
+ double d1, d2;
op1 = RT_CONSTANT(opline, opline->op1);
op2 = RT_CONSTANT(opline, opline->op2);
- 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));
+ if (1 && IS_CONST == IS_CONST && IS_CONST == IS_CONST) {
+ /* pass */
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_LVAL_P(op1) < Z_LVAL_P(op2))) {
+is_smaller_true:
+ ZEND_VM_SMART_BRANCH_TRUE();
+ ZVAL_TRUE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
} else {
- break;
+is_smaller_false:
+ ZEND_VM_SMART_BRANCH_FALSE();
+ ZVAL_FALSE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
}
- } 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 if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+ d1 = (double)Z_LVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+ goto is_smaller_double;
+ }
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+is_smaller_double:
+ if (d1 < d2) {
+ goto is_smaller_true;
} else {
- break;
+ goto is_smaller_false;
}
- } else {
- break;
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = (double)Z_LVAL_P(op2);
+ goto is_smaller_double;
}
- 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_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);
-
-
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+ ZEND_VM_TAIL_CALL(zend_is_smaller_helper_SPEC(op1, op2 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
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;
+ zval *op1, *op2;
+ double d1, d2;
op1 = RT_CONSTANT(opline, opline->op1);
op2 = RT_CONSTANT(opline, opline->op2);
- 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));
+ if (1 && IS_CONST == IS_CONST && IS_CONST == IS_CONST) {
+ /* pass */
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_LVAL_P(op1) <= Z_LVAL_P(op2))) {
+is_smaller_or_equal_true:
+ ZEND_VM_SMART_BRANCH_TRUE();
+ ZVAL_TRUE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
} else {
- break;
+is_smaller_or_equal_false:
+ ZEND_VM_SMART_BRANCH_FALSE();
+ ZVAL_FALSE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
}
- } 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 if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+ d1 = (double)Z_LVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+ goto is_smaller_or_equal_double;
+ }
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+is_smaller_or_equal_double:
+ if (d1 <= d2) {
+ goto is_smaller_or_equal_true;
} else {
- break;
+ goto is_smaller_or_equal_false;
}
- } else {
- break;
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = (double)Z_LVAL_P(op2);
+ goto is_smaller_or_equal_double;
}
- 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_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);
-
-
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+ ZEND_VM_TAIL_CALL(zend_is_smaller_or_equal_helper_SPEC(op1, op2 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SPACESHIP_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
@@ -4428,23 +5174,15 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_OR_SPEC_CONST_
op1 = RT_CONSTANT(opline, opline->op1);
op2 = RT_CONSTANT(opline, opline->op2);
- if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)
+ if (1 && IS_CONST == IS_CONST && IS_CONST == IS_CONST) {
+ /* pass */
+ } else 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_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);
-
-
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+ ZEND_VM_TAIL_CALL(zend_bw_or_helper_SPEC(op1, op2 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_AND_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
@@ -4455,23 +5193,15 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_AND_SPEC_CONST
op1 = RT_CONSTANT(opline, opline->op1);
op2 = RT_CONSTANT(opline, opline->op2);
- if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)
+ if (1 && IS_CONST == IS_CONST && IS_CONST == IS_CONST) {
+ /* pass */
+ } else 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_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);
-
-
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+ ZEND_VM_TAIL_CALL(zend_bw_and_helper_SPEC(op1, op2 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_XOR_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
@@ -4482,23 +5212,15 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_XOR_SPEC_CONST
op1 = RT_CONSTANT(opline, opline->op1);
op2 = RT_CONSTANT(opline, opline->op2);
- if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)
+ if (1 && IS_CONST == IS_CONST && IS_CONST == IS_CONST) {
+ /* pass */
+ } else 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_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);
-
-
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+ ZEND_VM_TAIL_CALL(zend_bw_xor_helper_SPEC(op1, op2 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BOOL_XOR_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
@@ -4516,136 +5238,11 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BOOL_XOR_SPEC_CON
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_CONST_CONST(int type ZEND_OPCODE_HANDLER_ARGS_DC)
-{
- USE_OPLINE
-
- zval *varname;
- zval *retval;
- zend_string *name, *tmp_name;
- zend_class_entry *ce;
-
- SAVE_OPLINE();
-
- do {
- if (IS_CONST == IS_CONST) {
- if (IS_CONST == IS_CONST && EXPECTED((ce = CACHED_PTR(opline->extended_value)) != NULL)) {
- retval = CACHED_PTR(opline->extended_value + sizeof(void*));
- break;
- } else {
- zval *class_name = RT_CONSTANT(opline, opline->op2);
-
- if (UNEXPECTED((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 {
- 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_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_fetch_static_prop_helper_SPEC_CONST_CONST(BP_VAR_R ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_STATIC_PROP_W_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_fetch_static_prop_helper_SPEC_CONST_CONST(BP_VAR_W ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_STATIC_PROP_RW_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_fetch_static_prop_helper_SPEC_CONST_CONST(BP_VAR_RW ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_STATIC_PROP_FUNC_ARG_SPEC_CONST_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_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)
-{
- ZEND_VM_TAIL_CALL(zend_fetch_static_prop_helper_SPEC_CONST_CONST(BP_VAR_UNSET ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_STATIC_PROP_IS_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_fetch_static_prop_helper_SPEC_CONST_CONST(BP_VAR_IS ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
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;
+ zval *container, *dim, *value;
SAVE_OPLINE();
container = RT_CONSTANT(opline, opline->op1);
@@ -4654,8 +5251,7 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_R_SPEC_
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_DEREF(result, value);
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value);
} else if (EXPECTED(Z_TYPE_P(container) == IS_REFERENCE)) {
container = Z_REFVAL_P(container);
if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
@@ -4694,6 +5290,10 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_IS_SPEC
static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
+#if 0
+ USE_OPLINE
+#endif
+
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));
@@ -4735,12 +5335,14 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_
}
}
if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
- GET_OP1_UNDEF_CV(container, BP_VAR_R);
+ ZVAL_UNDEFINED_OP1();
}
if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(offset) == IS_UNDEF)) {
- GET_OP2_UNDEF_CV(offset, BP_VAR_R);
+ ZVAL_UNDEFINED_OP2();
}
- goto fetch_obj_r_no_object;
+ zend_wrong_property_read(offset);
+ ZVAL_NULL(EX_VAR(opline->result.var));
+ goto fetch_obj_r_finish;
} while (0);
}
@@ -4750,7 +5352,7 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_
zval *retval;
if (IS_CONST == IS_CONST) {
- cache_slot = CACHE_ADDR(opline->extended_value);
+ cache_slot = CACHE_ADDR(opline->extended_value & ~ZEND_FETCH_REF /* FUNC_ARG fetch may contain it */);
if (EXPECTED(zobj->ce == CACHED_PTR_EX(cache_slot))) {
uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1);
@@ -4758,8 +5360,13 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_
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;
+ if (0 || (IS_CONST & (IS_TMP_VAR|IS_VAR)) != 0) {
+ goto fetch_obj_r_copy;
+ } else {
+fetch_obj_r_fast_copy:
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
+ ZEND_VM_NEXT_OPCODE();
+ }
}
} else if (EXPECTED(zobj->properties != NULL)) {
if (!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET(prop_offset)) {
@@ -4773,8 +5380,12 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_
(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;
+ retval = &p->val;
+ if (0 || (IS_CONST & (IS_TMP_VAR|IS_VAR)) != 0) {
+ goto fetch_obj_r_copy;
+ } else {
+ goto fetch_obj_r_fast_copy;
+ }
}
}
CACHE_PTR_EX(cache_slot + 1, (void*)ZEND_DYNAMIC_PROPERTY_OFFSET);
@@ -4783,30 +5394,30 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_
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;
+ if (0 || (IS_CONST & (IS_TMP_VAR|IS_VAR)) != 0) {
+ goto fetch_obj_r_copy;
+ } else {
+ goto fetch_obj_r_fast_copy;
+ }
}
}
}
} else if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(offset) == IS_UNDEF)) {
- GET_OP2_UNDEF_CV(offset, BP_VAR_R);
+ ZVAL_UNDEFINED_OP2();
}
- 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));
+ 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);
- }
+ if (retval != EX_VAR(opline->result.var)) {
+fetch_obj_r_copy:
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
+ } else if (UNEXPECTED(Z_ISREF_P(retval))) {
+ zend_unwrap_reference(retval);
}
} while (0);
+fetch_obj_r_finish:
+
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
@@ -4838,7 +5449,8 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC
break;
}
}
- goto fetch_obj_is_no_object;
+ ZVAL_NULL(EX_VAR(opline->result.var));
+ goto fetch_obj_is_finish;
} while (0);
}
@@ -4856,8 +5468,13 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC
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;
+ if (0 || (IS_CONST & (IS_TMP_VAR|IS_VAR)) != 0) {
+ goto fetch_obj_is_copy;
+ } else {
+fetch_obj_is_fast_copy:
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
+ ZEND_VM_NEXT_OPCODE();
+ }
}
} else if (EXPECTED(zobj->properties != NULL)) {
if (!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET(prop_offset)) {
@@ -4871,8 +5488,12 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC
(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;
+ retval = &p->val;
+ if (0 || (IS_CONST & (IS_TMP_VAR|IS_VAR)) != 0) {
+ goto fetch_obj_is_copy;
+ } else {
+ goto fetch_obj_is_fast_copy;
+ }
}
}
CACHE_PTR_EX(cache_slot + 1, (void*)ZEND_DYNAMIC_PROPERTY_OFFSET);
@@ -4881,38 +5502,43 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC
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 (0 || (IS_CONST & (IS_TMP_VAR|IS_VAR)) != 0) {
+ goto fetch_obj_is_copy;
+ } else {
+ goto fetch_obj_is_fast_copy;
+ }
}
}
}
}
- 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));
+ 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);
- }
+ if (retval != EX_VAR(opline->result.var)) {
+fetch_obj_is_copy:
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
+ } else if (UNEXPECTED(Z_ISREF_P(retval))) {
+ zend_unwrap_reference(retval);
}
} while (0);
+fetch_obj_is_finish:
+
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
+#if 0
+ USE_OPLINE
+#endif
+
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_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
@@ -4954,14 +5580,18 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FAST_CONCAT_SPEC_
} else {
ZVAL_STR(EX_VAR(opline->result.var), op2_str);
}
-
+ if (IS_CONST & (IS_TMP_VAR|IS_VAR)) {
+ zend_string_release_ex(op1_str, 0);
+ }
} 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 {
ZVAL_STR(EX_VAR(opline->result.var), op1_str);
}
-
+ if (IS_CONST & (IS_TMP_VAR|IS_VAR)) {
+ zend_string_release_ex(op2_str, 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);
@@ -4969,14 +5599,20 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FAST_CONCAT_SPEC_
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);
-
+ if (IS_CONST & (IS_TMP_VAR|IS_VAR)) {
+ zend_string_release_ex(op2_str, 0);
+ }
} 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_CONST & (IS_TMP_VAR|IS_VAR)) {
+ zend_string_release_ex(op1_str, 0);
+ }
+ if (IS_CONST & (IS_TMP_VAR|IS_VAR)) {
+ zend_string_release_ex(op2_str, 0);
+ }
}
ZEND_VM_NEXT_OPCODE();
}
@@ -4988,7 +5624,7 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FAST_CONCAT_SPEC_
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);
+ ZVAL_UNDEFINED_OP1();
}
op1_str = zval_get_string_func(op1);
}
@@ -4998,7 +5634,7 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FAST_CONCAT_SPEC_
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);
+ ZVAL_UNDEFINED_OP2();
}
op2_str = zval_get_string_func(op2);
}
@@ -5076,7 +5712,7 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_
break;
}
} else if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(function_name) == IS_UNDEF)) {
- GET_OP2_UNDEF_CV(function_name, BP_VAR_R);
+ ZVAL_UNDEFINED_OP2();
if (UNEXPECTED(EG(exception) != NULL)) {
HANDLE_EXCEPTION();
@@ -5099,7 +5735,7 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_
}
}
if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
- object = GET_OP1_UNDEF_CV(object, BP_VAR_R);
+ object = ZVAL_UNDEFINED_OP1();
if (UNEXPECTED(EG(exception) != NULL)) {
if (IS_CONST != IS_CONST) {
@@ -5127,13 +5763,6 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_
} else {
zend_object *orig_obj = obj;
- if (UNEXPECTED(obj->handlers->get_method == NULL)) {
- zend_throw_error(NULL, "Object does not support method calls");
-
-
- HANDLE_EXCEPTION();
- }
-
if (IS_CONST == IS_CONST) {
function_name = RT_CONSTANT(opline, opline->op2);
}
@@ -5158,7 +5787,7 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_
/* Reset "object" to trigger reference counting */
object = NULL;
}
- if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
+ if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!RUN_TIME_CACHE(&fbc->op_array))) {
init_func_run_time_cache(&fbc->op_array);
}
}
@@ -5167,26 +5796,28 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_
}
- call_info = ZEND_CALL_NESTED_FUNCTION;
+ call_info = ZEND_CALL_NESTED_FUNCTION | ZEND_CALL_HAS_THIS;
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();
}
+ /* call static method */
+ obj = (zend_object*)called_scope;
+ call_info = ZEND_CALL_NESTED_FUNCTION;
} 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 */
}
+ /* CV may be changed indirectly (e.g. when it's a reference) */
+ call_info = ZEND_CALL_NESTED_FUNCTION | ZEND_CALL_HAS_THIS | ZEND_CALL_RELEASE_THIS;
}
call = zend_vm_stack_push_call_frame(call_info,
- fbc, opline->extended_value, called_scope, obj);
+ fbc, opline->extended_value, obj);
call->prev_execute_data = EX(call);
EX(call) = call;
@@ -5198,7 +5829,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_C
USE_OPLINE
zval *function_name;
zend_class_entry *ce;
- zend_object *object;
+ uint32_t call_info;
zend_function *fbc;
zend_execute_data *call;
@@ -5208,7 +5839,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_C
/* 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);
+ ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op1)), Z_STR_P(RT_CONSTANT(opline, opline->op1) + 1), ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
if (UNEXPECTED(ce == NULL)) {
ZEND_ASSERT(EG(exception));
@@ -5250,7 +5881,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_C
break;
}
} else if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(function_name) == IS_UNDEF)) {
- GET_OP2_UNDEF_CV(function_name, BP_VAR_R);
+ ZVAL_UNDEFINED_OP2();
if (UNEXPECTED(EG(exception) != NULL)) {
HANDLE_EXCEPTION();
}
@@ -5279,7 +5910,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_C
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)) {
+ if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!RUN_TIME_CACHE(&fbc->op_array))) {
init_func_run_time_cache(&fbc->op_array);
}
if (IS_CONST != IS_CONST) {
@@ -5295,38 +5926,39 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_C
HANDLE_EXCEPTION();
}
fbc = ce->constructor;
- if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
+ if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!RUN_TIME_CACHE(&fbc->op_array))) {
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;
+ ce = (zend_class_entry*)Z_OBJ(EX(This));
+ call_info = ZEND_CALL_NESTED_FUNCTION | ZEND_CALL_HAS_THIS;
} else {
zend_non_static_method_call(fbc);
if (UNEXPECTED(EG(exception) != NULL)) {
HANDLE_EXCEPTION();
}
+ goto check_parent_and_self;
}
- }
-
- if (IS_CONST == IS_UNUSED) {
+ } else {
+check_parent_and_self:
/* 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 (IS_CONST == IS_UNUSED
+ && ((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_info = ZEND_CALL_NESTED_FUNCTION;
}
- call = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
- fbc, opline->extended_value, ce, object);
+ call = zend_vm_stack_push_call_frame(call_info,
+ fbc, opline->extended_value, ce);
call->prev_execute_data = EX(call);
EX(call) = call;
@@ -5341,8 +5973,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_USER_CALL_SPEC_CONST_CONS
zend_fcall_info_cache fcc;
char *error = NULL;
zend_function *func;
- zend_class_entry *called_scope;
- zend_object *object;
+ void *object_or_called_scope;
zend_execute_data *call;
uint32_t call_info = ZEND_CALL_NESTED_FUNCTION | ZEND_CALL_DYNAMIC;
@@ -5350,8 +5981,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_USER_CALL_SPEC_CONST_CONS
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;
- object = fcc.object;
if (error) {
efree(error);
/* This is the only soft error is_callable() can generate */
@@ -5361,6 +5990,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_USER_CALL_SPEC_CONST_CONS
HANDLE_EXCEPTION();
}
}
+ object_or_called_scope = fcc.called_scope;
if (func->common.fn_flags & ZEND_ACC_CLOSURE) {
/* Delay closure destruction until its invocation */
GC_ADDREF(ZEND_CLOSURE_OBJECT(func));
@@ -5368,22 +5998,26 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_USER_CALL_SPEC_CONST_CONS
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 */
+ if (fcc.object) {
+ object_or_called_scope = fcc.object;
+ call_info |= ZEND_CALL_HAS_THIS;
+ }
+ } else if (fcc.object) {
+ GC_ADDREF(fcc.object); /* For $this pointer */
+ object_or_called_scope = fcc.object;
+ call_info |= ZEND_CALL_RELEASE_THIS | ZEND_CALL_HAS_THIS;
}
if ((IS_CONST & (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);
+ } else if (call_info & ZEND_CALL_RELEASE_THIS) {
+ zend_object_release(fcc.object);
}
HANDLE_EXCEPTION();
}
- if (EXPECTED(func->type == ZEND_USER_FUNCTION) && UNEXPECTED(!func->op_array.run_time_cache)) {
+ if (EXPECTED(func->type == ZEND_USER_FUNCTION) && UNEXPECTED(!RUN_TIME_CACHE(&func->op_array))) {
init_func_run_time_cache(&func->op_array);
}
} else {
@@ -5394,12 +6028,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_USER_CALL_SPEC_CONST_CONS
HANDLE_EXCEPTION();
}
func = (zend_function*)&zend_pass_function;
- called_scope = NULL;
- object = NULL;
+ object_or_called_scope = NULL;
}
call = zend_vm_stack_push_call_frame(call_info,
- func, opline->extended_value, called_scope, object);
+ func, opline->extended_value, object_or_called_scope);
call->prev_execute_data = EX(call);
EX(call) = call;
@@ -5423,7 +6056,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_CLASS_CONSTANT_SPEC_CONS
} 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);
+ ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op1)), Z_STR_P(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));
@@ -5553,8 +6186,12 @@ num_index:
} else if (Z_TYPE_P(offset) == IS_TRUE) {
hval = 1;
goto num_index;
+ } else if (Z_TYPE_P(offset) == IS_RESOURCE) {
+ zend_use_resource_as_offset(offset);
+ hval = Z_RES_HANDLE_P(offset);
+ goto num_index;
} else if (IS_CONST == IS_CV && Z_TYPE_P(offset) == IS_UNDEF) {
- GET_OP2_UNDEF_CV(offset, BP_VAR_R);
+ ZVAL_UNDEFINED_OP2();
str = ZSTR_EMPTY_ALLOC();
goto str_index;
} else {
@@ -5587,141 +6224,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_CONST_CONST_HA
}
ZEND_VM_TAIL_CALL(ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
} else {
- ZVAL_EMPTY_ARRAY(array);
+ ZVAL_ARR(array, zend_new_array(0));
ZEND_VM_NEXT_OPCODE();
}
}
-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 *varname;
- zend_string *name, *tmp_name;
- zend_class_entry *ce;
-
-
- SAVE_OPLINE();
-
- 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_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
- if (UNEXPECTED(ce == NULL)) {
- ZEND_ASSERT(EG(exception));
-
- HANDLE_EXCEPTION();
- }
- /*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));
-
- HANDLE_EXCEPTION();
- }
- } else {
- ce = Z_CE_P(EX_VAR(opline->op2.var));
- }
-
- 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();
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zval *value;
- int result;
-
- zval *varname;
- zend_string *name, *tmp_name;
- zend_class_entry *ce;
-
- SAVE_OPLINE();
- if (IS_CONST == IS_CONST) {
- if (IS_CONST == IS_CONST && EXPECTED((ce = CACHED_PTR(opline->extended_value & ~ZEND_ISEMPTY)) != NULL)) {
- value = CACHED_PTR((opline->extended_value & ~ZEND_ISEMPTY) + sizeof(void*));
- goto is_static_prop_return;
- } else if (UNEXPECTED((ce = CACHED_PTR(opline->extended_value & ~ZEND_ISEMPTY)) == NULL)) {
- ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op2)), RT_CONSTANT(opline, opline->op2) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
- if (UNEXPECTED(ce == NULL)) {
- ZEND_ASSERT(EG(exception));
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
- }
- if (IS_CONST != IS_CONST) {
- CACHE_PTR(opline->extended_value & ~ZEND_ISEMPTY, ce);
- }
- }
- } else {
- if (IS_CONST == IS_UNUSED) {
- ce = zend_fetch_class(NULL, opline->op2.num);
- if (UNEXPECTED(ce == NULL)) {
- ZEND_ASSERT(EG(exception));
-
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
- }
- } else {
- ce = Z_CE_P(EX_VAR(opline->op2.var));
- }
- if (IS_CONST == IS_CONST &&
- EXPECTED(CACHED_PTR(opline->extended_value & ~ZEND_ISEMPTY) == ce)) {
-
- value = CACHED_PTR((opline->extended_value & ~ZEND_ISEMPTY) + sizeof(void*));
- goto is_static_prop_return;
- }
- }
-
- varname = RT_CONSTANT(opline, opline->op1);
- if (IS_CONST == IS_CONST) {
- name = Z_STR_P(varname);
- } else {
- name = zval_get_tmp_string(varname, &tmp_name);
- }
-
- value = zend_std_get_static_property(ce, name, 1);
-
- if (IS_CONST == IS_CONST && value) {
- CACHE_POLYMORPHIC_PTR(opline->extended_value & ~ZEND_ISEMPTY, ce, value);
- }
-
- if (IS_CONST != IS_CONST) {
- zend_tmp_string_release(tmp_name);
- }
-
-is_static_prop_return:
- if (!(opline->extended_value & ZEND_ISEMPTY)) {
- result = value && Z_TYPE_P(value) > IS_NULL &&
- (!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_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -5766,6 +6273,14 @@ num_index_prop:
/* > 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);
+
+ if (IS_CONST & (IS_CONST|IS_CV)) {
+ /* avoid exception check */
+
+ ZEND_VM_SMART_BRANCH(result, 0);
+ ZVAL_BOOL(EX_VAR(opline->result.var), result);
+ ZEND_VM_NEXT_OPCODE();
+ }
} else {
result = (value == NULL || !i_zend_is_true(value));
}
@@ -5816,21 +6331,20 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PRO
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;
+ result = (opline->extended_value & ZEND_ISEMPTY);
+ goto isset_object_finish;
}
} else {
- goto isset_no_object;
+ result = (opline->extended_value & ZEND_ISEMPTY);
+ goto isset_object_finish;
}
}
- 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));
- }
+
+ 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));
+
+isset_object_finish:
ZEND_VM_SMART_BRANCH(result, 1);
@@ -5838,73 +6352,69 @@ 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)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ARRAY_KEY_EXISTS_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;
+ zval *key, *subject;
+ HashTable *ht;
+ uint32_t result;
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();
+
+ key = RT_CONSTANT(opline, opline->op1);
+ subject = RT_CONSTANT(opline, opline->op2);
+
+ if (EXPECTED(Z_TYPE_P(subject) == IS_ARRAY)) {
+array_key_exists_array:
+ ht = Z_ARRVAL_P(subject);
+ result = zend_array_key_exists_fast(ht, key OPLINE_CC EXECUTE_DATA_CC);
+ } else {
+ if ((IS_CONST & (IS_VAR|IS_CV)) && EXPECTED(Z_ISREF_P(subject))) {
+ subject = Z_REFVAL_P(subject);
+ if (EXPECTED(Z_TYPE_P(subject) == IS_ARRAY)) {
+ goto array_key_exists_array;
+ }
}
- do_bind_inherited_class(&EX(func)->op_array, opline, EG(class_table), parent, 0);
+ result = zend_array_key_exists_slow(subject, key OPLINE_CC EXECUTE_DATA_CC);
}
+
+
+ ZEND_VM_SMART_BRANCH(result == IS_TRUE, 1);
+ Z_TYPE_INFO_P(EX_VAR(opline->result.var)) = result;
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)
+/* No specialization for op_types (CONST|TMPVAR|UNUSED|CV, ANY) */
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DECLARE_CLASS_DELAYED_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- zval *zv;
- zend_class_entry *ce, *parent;
USE_OPLINE
+ zval *lcname, *zv;
+ zend_class_entry *ce;
- 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();
+ ce = CACHED_PTR(opline->extended_value);
+ if (ce == NULL) {
+ lcname = RT_CONSTANT(opline, opline->op1);
+ zv = zend_hash_find_ex(EG(class_table), Z_STR_P(lcname + 1), 1);
+ if (zv) {
+ SAVE_OPLINE();
+ ce = Z_CE_P(zv);
+ zv = zend_hash_set_bucket_key(EG(class_table), (Bucket*)zv, Z_STR_P(lcname));
+ if (UNEXPECTED(!zv)) {
+ 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));
+ } else {
+ if (zend_do_link_class(ce, Z_STR_P(RT_CONSTANT(opline, opline->op2))) == FAILURE) {
+ /* Reload bucket pointer, the hash table may have been reallocated */
+ zv = zend_hash_find(EG(class_table), Z_STR_P(lcname));
+ zend_hash_set_bucket_key(EG(class_table), (Bucket *) zv, Z_STR_P(lcname + 1));
+ HANDLE_EXCEPTION();
+ }
+ }
+ }
+ CACHE_PTR(opline->extended_value, ce);
}
-
- zend_do_inheritance(ce, parent);
- ce->ce_flags |= ZEND_ACC_ANON_BOUND;
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+ ZEND_VM_NEXT_OPCODE();
}
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DECLARE_CONST_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
@@ -5980,20 +6490,23 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_CONST_CONST_HANDLER
/* If a function call result is yielded and the function did
* not return by reference we throw a notice. */
- if (IS_CONST == 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 {
+ do {
+ if (IS_CONST == IS_VAR) {
+ ZEND_ASSERT(value_ptr != &EG(uninitialized_zval));
+ if (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);
+ break;
+ }
+ }
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));
- }
+ } while (0);
}
} else {
@@ -6145,40 +6658,476 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IN_ARRAY_SPEC_CON
zval *op1;
HashTable *ht = Z_ARRVAL_P(RT_CONSTANT(opline, opline->op2));
- int result;
+ zval *result;
SAVE_OPLINE();
op1 = RT_CONSTANT(opline, opline->op1);
if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
- result = zend_hash_exists(ht, Z_STR_P(op1));
+ result = zend_hash_find_ex(ht, Z_STR_P(op1), IS_CONST == IS_CONST);
} else if (opline->extended_value) {
if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
- result = zend_hash_index_exists(ht, Z_LVAL_P(op1));
+ result = zend_hash_index_find(ht, Z_LVAL_P(op1));
} else {
- result = 0;
+ result = NULL;
}
} else if (Z_TYPE_P(op1) <= IS_FALSE) {
- result = zend_hash_exists(ht, ZSTR_EMPTY_ALLOC());
+ result = zend_hash_find_ex(ht, ZSTR_EMPTY_ALLOC(), 1);
} else {
zend_string *key;
- zval key_tmp, result_tmp;
+ zval key_tmp, result_tmp, *val;
- result = 0;
- ZEND_HASH_FOREACH_STR_KEY(ht, key) {
+ result = NULL;
+ ZEND_HASH_FOREACH_STR_KEY_VAL(ht, key, val) {
ZVAL_STR(&key_tmp, key);
compare_function(&result_tmp, op1, &key_tmp);
if (Z_LVAL(result_tmp) == 0) {
- result = 1;
+ result = val;
break;
}
} ZEND_HASH_FOREACH_END();
}
ZEND_VM_SMART_BRANCH(result, 1);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
+ ZVAL_BOOL(EX_VAR(opline->result.var), result != NULL);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_SPEC_CONST_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+
+ zval *op1, *op2, *result;
+ double d1, d2;
+
+ op1 = RT_CONSTANT(opline, opline->op1);
+ op2 = EX_VAR(opline->op2.var);
+ if (1 && IS_CONST == IS_CONST && (IS_TMP_VAR|IS_VAR|IS_CV) == IS_CONST) {
+ /* pass */
+ } else 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)) {
+ d1 = (double)Z_LVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+ goto add_double;
+ }
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+add_double:
+ result = EX_VAR(opline->result.var);
+ ZVAL_DOUBLE(result, d1 + d2);
+ ZEND_VM_NEXT_OPCODE();
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = (double)Z_LVAL_P(op2);
+ goto add_double;
+ }
+ }
+
+ ZEND_VM_TAIL_CALL(zend_add_helper_SPEC(op1, op2 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+}
+
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SUB_SPEC_CONST_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+
+ zval *op1, *op2, *result;
+ double d1, d2;
+
+ op1 = RT_CONSTANT(opline, opline->op1);
+ op2 = EX_VAR(opline->op2.var);
+ if (1 && IS_CONST == IS_CONST && (IS_TMP_VAR|IS_VAR|IS_CV) == IS_CONST) {
+ /* pass */
+ } else 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)) {
+ d1 = (double)Z_LVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+ goto sub_double;
+ }
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+sub_double:
+ result = EX_VAR(opline->result.var);
+ ZVAL_DOUBLE(result, d1 - d2);
+ ZEND_VM_NEXT_OPCODE();
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = (double)Z_LVAL_P(op2);
+ goto sub_double;
+ }
+ }
+
+ ZEND_VM_TAIL_CALL(zend_sub_helper_SPEC(op1, op2 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MOD_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);
+ if (1 && IS_CONST == IS_CONST && (IS_TMP_VAR|IS_VAR|IS_CV) == IS_CONST) {
+ /* pass */
+ } else 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();
+ }
+ }
+
+ ZEND_VM_TAIL_CALL(zend_mod_helper_SPEC(op1, op2 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SL_SPEC_CONST_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+
+ zval *op1, *op2;
+
+ op1 = RT_CONSTANT(opline, opline->op1);
+ op2 = EX_VAR(opline->op2.var);
+ if (1 && IS_CONST == IS_CONST && (IS_TMP_VAR|IS_VAR|IS_CV) == IS_CONST) {
+ /* pass */
+ } else 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)) {
+ /* Perform shift on unsigned numbers to get well-defined wrap behavior. */
+ ZVAL_LONG(EX_VAR(opline->result.var),
+ (zend_long) ((zend_ulong) Z_LVAL_P(op1) << Z_LVAL_P(op2)));
+ ZEND_VM_NEXT_OPCODE();
+ }
+
+ ZEND_VM_TAIL_CALL(zend_shift_left_helper_SPEC(op1, op2 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SR_SPEC_CONST_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+
+ zval *op1, *op2;
+
+ op1 = RT_CONSTANT(opline, opline->op1);
+ op2 = EX_VAR(opline->op2.var);
+ if (1 && IS_CONST == IS_CONST && (IS_TMP_VAR|IS_VAR|IS_CV) == IS_CONST) {
+ /* pass */
+ } else 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();
+ }
+
+ ZEND_VM_TAIL_CALL(zend_shift_right_helper_SPEC(op1, op2 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_CONST_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+
+ zval *op1, *op2;
+ double d1, d2;
+
+ op1 = RT_CONSTANT(opline, opline->op1);
+ op2 = EX_VAR(opline->op2.var);
+ if (1 && IS_CONST == IS_CONST && (IS_TMP_VAR|IS_VAR|IS_CV) == IS_CONST) {
+ /* pass */
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_LVAL_P(op1) < Z_LVAL_P(op2))) {
+is_smaller_true:
+
+ ZVAL_TRUE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
+ } else {
+is_smaller_false:
+
+ ZVAL_FALSE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
+ }
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+ d1 = (double)Z_LVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+ goto is_smaller_double;
+ }
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+is_smaller_double:
+ if (d1 < d2) {
+ goto is_smaller_true;
+ } else {
+ goto is_smaller_false;
+ }
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = (double)Z_LVAL_P(op2);
+ goto is_smaller_double;
+ }
+ }
+ ZEND_VM_TAIL_CALL(zend_is_smaller_helper_SPEC(op1, op2 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+}
+
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_CONST_TMPVARCV_JMPZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+
+ zval *op1, *op2;
+ double d1, d2;
+
+ op1 = RT_CONSTANT(opline, opline->op1);
+ op2 = EX_VAR(opline->op2.var);
+ if (1 && IS_CONST == IS_CONST && (IS_TMP_VAR|IS_VAR|IS_CV) == IS_CONST) {
+ /* pass */
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_LVAL_P(op1) < Z_LVAL_P(op2))) {
+is_smaller_true:
+ ZEND_VM_SMART_BRANCH_TRUE_JMPZ();
+ ZVAL_TRUE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
+ } else {
+is_smaller_false:
+ ZEND_VM_SMART_BRANCH_FALSE_JMPZ();
+ ZVAL_FALSE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
+ }
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+ d1 = (double)Z_LVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+ goto is_smaller_double;
+ }
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+is_smaller_double:
+ if (d1 < d2) {
+ goto is_smaller_true;
+ } else {
+ goto is_smaller_false;
+ }
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = (double)Z_LVAL_P(op2);
+ goto is_smaller_double;
+ }
+ }
+ ZEND_VM_TAIL_CALL(zend_is_smaller_helper_SPEC(op1, op2 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+}
+
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_CONST_TMPVARCV_JMPNZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+
+ zval *op1, *op2;
+ double d1, d2;
+
+ op1 = RT_CONSTANT(opline, opline->op1);
+ op2 = EX_VAR(opline->op2.var);
+ if (1 && IS_CONST == IS_CONST && (IS_TMP_VAR|IS_VAR|IS_CV) == IS_CONST) {
+ /* pass */
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_LVAL_P(op1) < Z_LVAL_P(op2))) {
+is_smaller_true:
+ ZEND_VM_SMART_BRANCH_TRUE_JMPNZ();
+ ZVAL_TRUE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
+ } else {
+is_smaller_false:
+ ZEND_VM_SMART_BRANCH_FALSE_JMPNZ();
+ ZVAL_FALSE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
+ }
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+ d1 = (double)Z_LVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+ goto is_smaller_double;
+ }
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+is_smaller_double:
+ if (d1 < d2) {
+ goto is_smaller_true;
+ } else {
+ goto is_smaller_false;
+ }
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = (double)Z_LVAL_P(op2);
+ goto is_smaller_double;
+ }
+ }
+ ZEND_VM_TAIL_CALL(zend_is_smaller_helper_SPEC(op1, op2 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_CONST_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+
+ zval *op1, *op2;
+ double d1, d2;
+
+ op1 = RT_CONSTANT(opline, opline->op1);
+ op2 = EX_VAR(opline->op2.var);
+ if (1 && IS_CONST == IS_CONST && (IS_TMP_VAR|IS_VAR|IS_CV) == IS_CONST) {
+ /* pass */
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_LVAL_P(op1) <= Z_LVAL_P(op2))) {
+is_smaller_or_equal_true:
+
+ ZVAL_TRUE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
+ } else {
+is_smaller_or_equal_false:
+
+ ZVAL_FALSE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
+ }
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+ d1 = (double)Z_LVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+ goto is_smaller_or_equal_double;
+ }
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+is_smaller_or_equal_double:
+ if (d1 <= d2) {
+ goto is_smaller_or_equal_true;
+ } else {
+ goto is_smaller_or_equal_false;
+ }
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = (double)Z_LVAL_P(op2);
+ goto is_smaller_or_equal_double;
+ }
+ }
+ ZEND_VM_TAIL_CALL(zend_is_smaller_or_equal_helper_SPEC(op1, op2 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+}
+
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_CONST_TMPVARCV_JMPZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+
+ zval *op1, *op2;
+ double d1, d2;
+
+ op1 = RT_CONSTANT(opline, opline->op1);
+ op2 = EX_VAR(opline->op2.var);
+ if (1 && IS_CONST == IS_CONST && (IS_TMP_VAR|IS_VAR|IS_CV) == IS_CONST) {
+ /* pass */
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_LVAL_P(op1) <= Z_LVAL_P(op2))) {
+is_smaller_or_equal_true:
+ ZEND_VM_SMART_BRANCH_TRUE_JMPZ();
+ ZVAL_TRUE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
+ } else {
+is_smaller_or_equal_false:
+ ZEND_VM_SMART_BRANCH_FALSE_JMPZ();
+ ZVAL_FALSE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
+ }
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+ d1 = (double)Z_LVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+ goto is_smaller_or_equal_double;
+ }
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+is_smaller_or_equal_double:
+ if (d1 <= d2) {
+ goto is_smaller_or_equal_true;
+ } else {
+ goto is_smaller_or_equal_false;
+ }
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = (double)Z_LVAL_P(op2);
+ goto is_smaller_or_equal_double;
+ }
+ }
+ ZEND_VM_TAIL_CALL(zend_is_smaller_or_equal_helper_SPEC(op1, op2 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+}
+
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_CONST_TMPVARCV_JMPNZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+
+ zval *op1, *op2;
+ double d1, d2;
+
+ op1 = RT_CONSTANT(opline, opline->op1);
+ op2 = EX_VAR(opline->op2.var);
+ if (1 && IS_CONST == IS_CONST && (IS_TMP_VAR|IS_VAR|IS_CV) == IS_CONST) {
+ /* pass */
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_LVAL_P(op1) <= Z_LVAL_P(op2))) {
+is_smaller_or_equal_true:
+ ZEND_VM_SMART_BRANCH_TRUE_JMPNZ();
+ ZVAL_TRUE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
+ } else {
+is_smaller_or_equal_false:
+ ZEND_VM_SMART_BRANCH_FALSE_JMPNZ();
+ ZVAL_FALSE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
+ }
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+ d1 = (double)Z_LVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+ goto is_smaller_or_equal_double;
+ }
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+is_smaller_or_equal_double:
+ if (d1 <= d2) {
+ goto is_smaller_or_equal_true;
+ } else {
+ goto is_smaller_or_equal_false;
+ }
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = (double)Z_LVAL_P(op2);
+ goto is_smaller_or_equal_double;
+ }
+ }
+ ZEND_VM_TAIL_CALL(zend_is_smaller_or_equal_helper_SPEC(op1, op2 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+}
+
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
@@ -6215,7 +7164,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SUB_DOUBLE_SPEC_CO
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)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zval *op1, *op2;
@@ -6257,7 +7206,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_LONG_SP
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)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zval *op1, *op2;
@@ -6299,7 +7248,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_DOUBLE_
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)
+static 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;
@@ -6341,7 +7290,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUA
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_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zval *op1, *op2;
@@ -6436,92 +7385,6 @@ fetch_dim_r_index_undef:
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
@@ -6537,98 +7400,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DIV_SPEC_CONST_TMPVAR_HANDLER(
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
@@ -6665,14 +7436,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CONCAT_SPEC_CONST_TMPVAR_HANDL
} else {
ZVAL_STR(EX_VAR(opline->result.var), op2_str);
}
-
+ if (IS_CONST & (IS_TMP_VAR|IS_VAR)) {
+ zend_string_release_ex(op1_str, 0);
+ }
} 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);
+ if ((IS_TMP_VAR|IS_VAR) & (IS_TMP_VAR|IS_VAR)) {
+ zend_string_release_ex(op2_str, 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);
@@ -6680,24 +7455,30 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CONCAT_SPEC_CONST_TMPVAR_HANDL
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);
+ if ((IS_TMP_VAR|IS_VAR) & (IS_TMP_VAR|IS_VAR)) {
+ zend_string_release_ex(op2_str, 0);
+ }
} 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);
+ if (IS_CONST & (IS_TMP_VAR|IS_VAR)) {
+ zend_string_release_ex(op1_str, 0);
+ }
+ if ((IS_TMP_VAR|IS_VAR) & (IS_TMP_VAR|IS_VAR)) {
+ zend_string_release_ex(op2_str, 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);
+ op1 = ZVAL_UNDEFINED_OP1();
}
if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
- op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
+ op2 = ZVAL_UNDEFINED_OP2();
}
concat_function(EX_VAR(opline->result.var), op1, op2);
@@ -6706,106 +7487,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CONCAT_SPEC_CONST_TMPVAR_HANDL
}
}
-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_SPACESHIP_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -6825,7 +7506,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_R_SPEC_CONST_TMPVAR_
{
USE_OPLINE
zend_free_op free_op2;
- zval *container, *dim, *value, *result;
+ zval *container, *dim, *value;
SAVE_OPLINE();
container = RT_CONSTANT(opline, opline->op1);
@@ -6834,8 +7515,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_R_SPEC_CONST_TMPVAR_
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);
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value);
} else if (EXPECTED(Z_TYPE_P(container) == IS_REFERENCE)) {
container = Z_REFVAL_P(container);
if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
@@ -6874,6 +7554,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_IS_SPEC_CONST_TMPVAR
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
+#if 0
+ USE_OPLINE
+#endif
+
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));
@@ -6915,12 +7599,14 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_
}
}
if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
- GET_OP1_UNDEF_CV(container, BP_VAR_R);
+ ZVAL_UNDEFINED_OP1();
}
if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(offset) == IS_UNDEF)) {
- GET_OP2_UNDEF_CV(offset, BP_VAR_R);
+ ZVAL_UNDEFINED_OP2();
}
- goto fetch_obj_r_no_object;
+ zend_wrong_property_read(offset);
+ ZVAL_NULL(EX_VAR(opline->result.var));
+ goto fetch_obj_r_finish;
} while (0);
}
@@ -6930,7 +7616,7 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_
zval *retval;
if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
- cache_slot = CACHE_ADDR(opline->extended_value);
+ cache_slot = CACHE_ADDR(opline->extended_value & ~ZEND_FETCH_REF /* FUNC_ARG fetch may contain it */);
if (EXPECTED(zobj->ce == CACHED_PTR_EX(cache_slot))) {
uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1);
@@ -6938,8 +7624,13 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_
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;
+ if (0 || (IS_CONST & (IS_TMP_VAR|IS_VAR)) != 0) {
+ goto fetch_obj_r_copy;
+ } else {
+fetch_obj_r_fast_copy:
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
+ ZEND_VM_NEXT_OPCODE();
+ }
}
} else if (EXPECTED(zobj->properties != NULL)) {
if (!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET(prop_offset)) {
@@ -6953,8 +7644,12 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_
(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;
+ retval = &p->val;
+ if (0 || (IS_CONST & (IS_TMP_VAR|IS_VAR)) != 0) {
+ goto fetch_obj_r_copy;
+ } else {
+ goto fetch_obj_r_fast_copy;
+ }
}
}
CACHE_PTR_EX(cache_slot + 1, (void*)ZEND_DYNAMIC_PROPERTY_OFFSET);
@@ -6963,30 +7658,29 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_
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;
+ if (0 || (IS_CONST & (IS_TMP_VAR|IS_VAR)) != 0) {
+ goto fetch_obj_r_copy;
+ } else {
+ goto fetch_obj_r_fast_copy;
+ }
}
}
}
} 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);
+ ZVAL_UNDEFINED_OP2();
}
- 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));
+ 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);
- }
+ if (retval != EX_VAR(opline->result.var)) {
+fetch_obj_r_copy:
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
+ } else if (UNEXPECTED(Z_ISREF_P(retval))) {
+ zend_unwrap_reference(retval);
}
} while (0);
+fetch_obj_r_finish:
zval_ptr_dtor_nogc(free_op2);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
@@ -7019,7 +7713,8 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC
break;
}
}
- goto fetch_obj_is_no_object;
+ ZVAL_NULL(EX_VAR(opline->result.var));
+ goto fetch_obj_is_finish;
} while (0);
}
@@ -7037,8 +7732,13 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC
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;
+ if (0 || (IS_CONST & (IS_TMP_VAR|IS_VAR)) != 0) {
+ goto fetch_obj_is_copy;
+ } else {
+fetch_obj_is_fast_copy:
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
+ ZEND_VM_NEXT_OPCODE();
+ }
}
} else if (EXPECTED(zobj->properties != NULL)) {
if (!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET(prop_offset)) {
@@ -7052,8 +7752,12 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC
(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;
+ retval = &p->val;
+ if (0 || (IS_CONST & (IS_TMP_VAR|IS_VAR)) != 0) {
+ goto fetch_obj_is_copy;
+ } else {
+ goto fetch_obj_is_fast_copy;
+ }
}
}
CACHE_PTR_EX(cache_slot + 1, (void*)ZEND_DYNAMIC_PROPERTY_OFFSET);
@@ -7062,26 +7766,27 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC
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 (0 || (IS_CONST & (IS_TMP_VAR|IS_VAR)) != 0) {
+ goto fetch_obj_is_copy;
+ } else {
+ goto fetch_obj_is_fast_copy;
+ }
}
}
}
}
- 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));
+ 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);
- }
+ if (retval != EX_VAR(opline->result.var)) {
+fetch_obj_is_copy:
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
+ } else if (UNEXPECTED(Z_ISREF_P(retval))) {
+ zend_unwrap_reference(retval);
}
} while (0);
+fetch_obj_is_finish:
zval_ptr_dtor_nogc(free_op2);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
@@ -7089,12 +7794,15 @@ fetch_obj_is_no_object:
static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
+#if 0
+ USE_OPLINE
+#endif
+
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));
@@ -7136,14 +7844,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FAST_CONCAT_SPEC_CONST_TMPVAR_
} else {
ZVAL_STR(EX_VAR(opline->result.var), op2_str);
}
-
+ if (IS_CONST & (IS_TMP_VAR|IS_VAR)) {
+ zend_string_release_ex(op1_str, 0);
+ }
} 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);
+ if ((IS_TMP_VAR|IS_VAR) & (IS_TMP_VAR|IS_VAR)) {
+ zend_string_release_ex(op2_str, 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);
@@ -7151,14 +7863,20 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FAST_CONCAT_SPEC_CONST_TMPVAR_
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);
+ if ((IS_TMP_VAR|IS_VAR) & (IS_TMP_VAR|IS_VAR)) {
+ zend_string_release_ex(op2_str, 0);
+ }
} 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);
+ if (IS_CONST & (IS_TMP_VAR|IS_VAR)) {
+ zend_string_release_ex(op1_str, 0);
+ }
+ if ((IS_TMP_VAR|IS_VAR) & (IS_TMP_VAR|IS_VAR)) {
+ zend_string_release_ex(op2_str, 0);
+ }
}
ZEND_VM_NEXT_OPCODE();
}
@@ -7170,7 +7888,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FAST_CONCAT_SPEC_CONST_TMPVAR_
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);
+ ZVAL_UNDEFINED_OP1();
}
op1_str = zval_get_string_func(op1);
}
@@ -7180,7 +7898,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FAST_CONCAT_SPEC_CONST_TMPVAR_
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);
+ ZVAL_UNDEFINED_OP2();
}
op2_str = zval_get_string_func(op2);
}
@@ -7258,7 +7976,7 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_
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);
+ ZVAL_UNDEFINED_OP2();
if (UNEXPECTED(EG(exception) != NULL)) {
HANDLE_EXCEPTION();
@@ -7281,7 +7999,7 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_
}
}
if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
- object = GET_OP1_UNDEF_CV(object, BP_VAR_R);
+ object = ZVAL_UNDEFINED_OP1();
if (UNEXPECTED(EG(exception) != NULL)) {
if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
zval_ptr_dtor_nogc(free_op2);
@@ -7309,13 +8027,6 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_
} 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);
}
@@ -7340,7 +8051,7 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_
/* Reset "object" to trigger reference counting */
object = NULL;
}
- if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
+ if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!RUN_TIME_CACHE(&fbc->op_array))) {
init_func_run_time_cache(&fbc->op_array);
}
}
@@ -7349,26 +8060,28 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_
zval_ptr_dtor_nogc(free_op2);
}
- call_info = ZEND_CALL_NESTED_FUNCTION;
+ call_info = ZEND_CALL_NESTED_FUNCTION | ZEND_CALL_HAS_THIS;
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();
}
+ /* call static method */
+ obj = (zend_object*)called_scope;
+ call_info = ZEND_CALL_NESTED_FUNCTION;
} 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 */
}
+ /* CV may be changed indirectly (e.g. when it's a reference) */
+ call_info = ZEND_CALL_NESTED_FUNCTION | ZEND_CALL_HAS_THIS | ZEND_CALL_RELEASE_THIS;
}
call = zend_vm_stack_push_call_frame(call_info,
- fbc, opline->extended_value, called_scope, obj);
+ fbc, opline->extended_value, obj);
call->prev_execute_data = EX(call);
EX(call) = call;
@@ -7380,7 +8093,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_C
USE_OPLINE
zval *function_name;
zend_class_entry *ce;
- zend_object *object;
+ uint32_t call_info;
zend_function *fbc;
zend_execute_data *call;
@@ -7390,7 +8103,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_C
/* 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);
+ ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op1)), Z_STR_P(RT_CONSTANT(opline, opline->op1) + 1), ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
if (UNEXPECTED(ce == NULL)) {
ZEND_ASSERT(EG(exception));
zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
@@ -7432,7 +8145,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_C
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);
+ ZVAL_UNDEFINED_OP2();
if (UNEXPECTED(EG(exception) != NULL)) {
HANDLE_EXCEPTION();
}
@@ -7461,7 +8174,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_C
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)) {
+ if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!RUN_TIME_CACHE(&fbc->op_array))) {
init_func_run_time_cache(&fbc->op_array);
}
if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
@@ -7477,38 +8190,39 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_C
HANDLE_EXCEPTION();
}
fbc = ce->constructor;
- if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
+ if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!RUN_TIME_CACHE(&fbc->op_array))) {
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;
+ ce = (zend_class_entry*)Z_OBJ(EX(This));
+ call_info = ZEND_CALL_NESTED_FUNCTION | ZEND_CALL_HAS_THIS;
} else {
zend_non_static_method_call(fbc);
if (UNEXPECTED(EG(exception) != NULL)) {
HANDLE_EXCEPTION();
}
+ goto check_parent_and_self;
}
- }
-
- if (IS_CONST == IS_UNUSED) {
+ } else {
+check_parent_and_self:
/* 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 (IS_CONST == IS_UNUSED
+ && ((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_info = ZEND_CALL_NESTED_FUNCTION;
}
- call = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
- fbc, opline->extended_value, ce, object);
+ call = zend_vm_stack_push_call_frame(call_info,
+ fbc, opline->extended_value, ce);
call->prev_execute_data = EX(call);
EX(call) = call;
@@ -7523,8 +8237,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_USER_CALL_SPEC_CONST_TMPV
zend_fcall_info_cache fcc;
char *error = NULL;
zend_function *func;
- zend_class_entry *called_scope;
- zend_object *object;
+ void *object_or_called_scope;
zend_execute_data *call;
uint32_t call_info = ZEND_CALL_NESTED_FUNCTION | ZEND_CALL_DYNAMIC;
@@ -7532,8 +8245,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_USER_CALL_SPEC_CONST_TMPV
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 */
@@ -7543,6 +8254,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_USER_CALL_SPEC_CONST_TMPV
HANDLE_EXCEPTION();
}
}
+ object_or_called_scope = fcc.called_scope;
if (func->common.fn_flags & ZEND_ACC_CLOSURE) {
/* Delay closure destruction until its invocation */
GC_ADDREF(ZEND_CLOSURE_OBJECT(func));
@@ -7550,23 +8262,27 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_USER_CALL_SPEC_CONST_TMPV
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 */
+ if (fcc.object) {
+ object_or_called_scope = fcc.object;
+ call_info |= ZEND_CALL_HAS_THIS;
+ }
+ } else if (fcc.object) {
+ GC_ADDREF(fcc.object); /* For $this pointer */
+ object_or_called_scope = fcc.object;
+ call_info |= ZEND_CALL_RELEASE_THIS | ZEND_CALL_HAS_THIS;
}
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);
+ } else if (call_info & ZEND_CALL_RELEASE_THIS) {
+ zend_object_release(fcc.object);
}
HANDLE_EXCEPTION();
}
- if (EXPECTED(func->type == ZEND_USER_FUNCTION) && UNEXPECTED(!func->op_array.run_time_cache)) {
+ if (EXPECTED(func->type == ZEND_USER_FUNCTION) && UNEXPECTED(!RUN_TIME_CACHE(&func->op_array))) {
init_func_run_time_cache(&func->op_array);
}
} else {
@@ -7577,12 +8293,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_USER_CALL_SPEC_CONST_TMPV
HANDLE_EXCEPTION();
}
func = (zend_function*)&zend_pass_function;
- called_scope = NULL;
- object = NULL;
+ object_or_called_scope = NULL;
}
call = zend_vm_stack_push_call_frame(call_info,
- func, opline->extended_value, called_scope, object);
+ func, opline->extended_value, object_or_called_scope);
call->prev_execute_data = EX(call);
EX(call) = call;
@@ -7665,8 +8380,12 @@ num_index:
} else if (Z_TYPE_P(offset) == IS_TRUE) {
hval = 1;
goto num_index;
+ } else if (Z_TYPE_P(offset) == IS_RESOURCE) {
+ zend_use_resource_as_offset(offset);
+ hval = Z_RES_HANDLE_P(offset);
+ 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);
+ ZVAL_UNDEFINED_OP2();
str = ZSTR_EMPTY_ALLOC();
goto str_index;
} else {
@@ -7699,7 +8418,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_CONST_TMPVAR_H
}
ZEND_VM_TAIL_CALL(ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
} else {
- ZVAL_EMPTY_ARRAY(array);
+ ZVAL_ARR(array, zend_new_array(0));
ZEND_VM_NEXT_OPCODE();
}
}
@@ -7748,6 +8467,14 @@ num_index_prop:
/* > 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);
+
+ if (IS_CONST & (IS_CONST|IS_CV)) {
+ /* avoid exception check */
+ zval_ptr_dtor_nogc(free_op2);
+ ZEND_VM_SMART_BRANCH(result, 0);
+ ZVAL_BOOL(EX_VAR(opline->result.var), result);
+ ZEND_VM_NEXT_OPCODE();
+ }
} else {
result = (value == NULL || !i_zend_is_true(value));
}
@@ -7798,22 +8525,20 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PRO
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;
+ result = (opline->extended_value & ZEND_ISEMPTY);
+ goto isset_object_finish;
}
} else {
- goto isset_no_object;
+ result = (opline->extended_value & ZEND_ISEMPTY);
+ goto isset_object_finish;
}
}
- 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));
- }
+ 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));
+
+isset_object_finish:
zval_ptr_dtor_nogc(free_op2);
ZEND_VM_SMART_BRANCH(result, 1);
@@ -7821,6 +8546,42 @@ isset_no_object:
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ARRAY_KEY_EXISTS_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+
+ zend_free_op free_op2;
+ zval *key, *subject;
+ HashTable *ht;
+ uint32_t result;
+
+ SAVE_OPLINE();
+
+ key = RT_CONSTANT(opline, opline->op1);
+ subject = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+
+ if (EXPECTED(Z_TYPE_P(subject) == IS_ARRAY)) {
+array_key_exists_array:
+ ht = Z_ARRVAL_P(subject);
+ result = zend_array_key_exists_fast(ht, key OPLINE_CC EXECUTE_DATA_CC);
+ } else {
+ if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_CV)) && EXPECTED(Z_ISREF_P(subject))) {
+ subject = Z_REFVAL_P(subject);
+ if (EXPECTED(Z_TYPE_P(subject) == IS_ARRAY)) {
+ goto array_key_exists_array;
+ }
+ }
+ result = zend_array_key_exists_slow(subject, key OPLINE_CC EXECUTE_DATA_CC);
+ }
+
+ zval_ptr_dtor_nogc(free_op2);
+
+ ZEND_VM_SMART_BRANCH(result == IS_TRUE, 1);
+ Z_TYPE_INFO_P(EX_VAR(opline->result.var)) = result;
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+}
+
+/* No specialization for op_types (CONST|TMPVAR|UNUSED|CV, ANY) */
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -7862,20 +8623,23 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_CONST_TMP_HANDLER(Z
/* If a function call result is yielded and the function did
* not return by reference we throw a notice. */
- if (IS_CONST == 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 {
+ do {
+ if (IS_CONST == IS_VAR) {
+ ZEND_ASSERT(value_ptr != &EG(uninitialized_zval));
+ if (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);
+ break;
+ }
+ }
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));
- }
+ } while (0);
}
} else {
@@ -7958,261 +8722,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_CONST_TMP_HANDLER(Z
ZEND_VM_RETURN();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_CONST_VAR(int type ZEND_OPCODE_HANDLER_ARGS_DC)
-{
- USE_OPLINE
-
- zval *varname;
- zval *retval;
- zend_string *name, *tmp_name;
- zend_class_entry *ce;
-
- SAVE_OPLINE();
-
- do {
- if (IS_VAR == IS_CONST) {
- if (IS_CONST == IS_CONST && EXPECTED((ce = CACHED_PTR(opline->extended_value)) != NULL)) {
- retval = CACHED_PTR(opline->extended_value + sizeof(void*));
- break;
- } else {
- zval *class_name = RT_CONSTANT(opline, opline->op2);
-
- if (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_VAR == 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 {
- 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_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_fetch_static_prop_helper_SPEC_CONST_VAR(BP_VAR_R ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_STATIC_PROP_W_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_fetch_static_prop_helper_SPEC_CONST_VAR(BP_VAR_W ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_STATIC_PROP_RW_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_fetch_static_prop_helper_SPEC_CONST_VAR(BP_VAR_RW ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_STATIC_PROP_FUNC_ARG_SPEC_CONST_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_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)
-{
- ZEND_VM_TAIL_CALL(zend_fetch_static_prop_helper_SPEC_CONST_VAR(BP_VAR_UNSET ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_STATIC_PROP_IS_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_fetch_static_prop_helper_SPEC_CONST_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_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zval *varname;
- zend_string *name, *tmp_name;
- zend_class_entry *ce;
-
-
- 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();
- }
- /*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));
-
- HANDLE_EXCEPTION();
- }
- } else {
- ce = Z_CE_P(EX_VAR(opline->op2.var));
- }
-
- 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();
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zval *value;
- int result;
-
- zval *varname;
- zend_string *name, *tmp_name;
- zend_class_entry *ce;
-
- SAVE_OPLINE();
- if (IS_VAR == IS_CONST) {
- if (IS_CONST == IS_CONST && EXPECTED((ce = CACHED_PTR(opline->extended_value & ~ZEND_ISEMPTY)) != NULL)) {
- value = CACHED_PTR((opline->extended_value & ~ZEND_ISEMPTY) + sizeof(void*));
- goto is_static_prop_return;
- } else if (UNEXPECTED((ce = CACHED_PTR(opline->extended_value & ~ZEND_ISEMPTY)) == NULL)) {
- ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op2)), RT_CONSTANT(opline, opline->op2) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
- if (UNEXPECTED(ce == NULL)) {
- ZEND_ASSERT(EG(exception));
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
- }
- if (IS_CONST != IS_CONST) {
- CACHE_PTR(opline->extended_value & ~ZEND_ISEMPTY, ce);
- }
- }
- } else {
- if (IS_VAR == IS_UNUSED) {
- ce = zend_fetch_class(NULL, opline->op2.num);
- if (UNEXPECTED(ce == NULL)) {
- ZEND_ASSERT(EG(exception));
-
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
- }
- } else {
- ce = Z_CE_P(EX_VAR(opline->op2.var));
- }
- if (IS_CONST == IS_CONST &&
- EXPECTED(CACHED_PTR(opline->extended_value & ~ZEND_ISEMPTY) == ce)) {
-
- value = CACHED_PTR((opline->extended_value & ~ZEND_ISEMPTY) + sizeof(void*));
- goto is_static_prop_return;
- }
- }
-
- varname = RT_CONSTANT(opline, opline->op1);
- if (IS_CONST == IS_CONST) {
- name = Z_STR_P(varname);
- } else {
- name = zval_get_tmp_string(varname, &tmp_name);
- }
-
- value = zend_std_get_static_property(ce, name, 1);
-
- if (IS_CONST == IS_CONST && value) {
- CACHE_POLYMORPHIC_PTR(opline->extended_value & ~ZEND_ISEMPTY, ce, value);
- }
-
- if (IS_CONST != IS_CONST) {
- zend_tmp_string_release(tmp_name);
- }
-
-is_static_prop_return:
- if (!(opline->extended_value & ZEND_ISEMPTY)) {
- result = value && Z_TYPE_P(value) > IS_NULL &&
- (!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_YIELD_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -8254,20 +8763,23 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_CONST_VAR_HANDLER(Z
/* If a function call result is yielded and the function did
* not return by reference we throw a notice. */
- if (IS_CONST == 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 {
+ do {
+ if (IS_CONST == IS_VAR) {
+ ZEND_ASSERT(value_ptr != &EG(uninitialized_zval));
+ if (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);
+ break;
+ }
+ }
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));
- }
+ } while (0);
}
} else {
@@ -8350,7 +8862,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_CONST_VAR_HANDLER(Z
ZEND_VM_RETURN();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_CONST_UNUSED(int type ZEND_OPCODE_HANDLER_ARGS_DC)
+static zend_never_inline ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_CONST_UNUSED(int type ZEND_OPCODE_HANDLER_ARGS_DC)
{
USE_OPLINE
@@ -8369,9 +8881,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_
tmp_name = NULL;
} else {
if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(varname) == IS_UNDEF)) {
- GET_OP1_UNDEF_CV(varname, BP_VAR_R);
+ ZVAL_UNDEFINED_OP1();
+ }
+ name = zval_try_get_tmp_string(varname, &tmp_name);
+ if (UNEXPECTED(!name)) {
+
+ ZVAL_UNDEF(EX_VAR(opline->result.var));
+ HANDLE_EXCEPTION();
}
- name = zval_get_tmp_string(varname, &tmp_name);
}
target_symbol_table = zend_get_target_symbol_table(opline->extended_value EXECUTE_DATA_CC);
@@ -8469,133 +8986,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_IS_SPEC_CONST_UNUSED_HAN
ZEND_VM_TAIL_CALL(zend_fetch_var_address_helper_SPEC_CONST_UNUSED(BP_VAR_IS ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_CONST_UNUSED(int type ZEND_OPCODE_HANDLER_ARGS_DC)
+/* No specialization for op_types (CONST|TMPVAR|CV, UNUSED|CONST|VAR) */
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
+#if 0
USE_OPLINE
+#endif
- zval *varname;
- zval *retval;
- zend_string *name, *tmp_name;
- zend_class_entry *ce;
-
- SAVE_OPLINE();
-
- do {
- if (IS_UNUSED == IS_CONST) {
- if (IS_CONST == IS_CONST && EXPECTED((ce = CACHED_PTR(opline->extended_value)) != NULL)) {
- retval = CACHED_PTR(opline->extended_value + sizeof(void*));
- break;
- } else {
- zval *class_name = RT_CONSTANT(opline, opline->op2);
-
- if (UNEXPECTED((ce = CACHED_PTR(opline->extended_value)) == NULL)) {
- ce = zend_fetch_class_by_name(Z_STR_P(class_name), 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 {
- 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_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_fetch_static_prop_helper_SPEC_CONST_UNUSED(BP_VAR_R ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_STATIC_PROP_W_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_fetch_static_prop_helper_SPEC_CONST_UNUSED(BP_VAR_W ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_STATIC_PROP_RW_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_fetch_static_prop_helper_SPEC_CONST_UNUSED(BP_VAR_RW ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_STATIC_PROP_FUNC_ARG_SPEC_CONST_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_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)
-{
- ZEND_VM_TAIL_CALL(zend_fetch_static_prop_helper_SPEC_CONST_UNUSED(BP_VAR_UNSET ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_STATIC_PROP_IS_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_fetch_static_prop_helper_SPEC_CONST_UNUSED(BP_VAR_IS ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_CONST_UNUSED_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));
@@ -8614,7 +9011,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_C
USE_OPLINE
zval *function_name;
zend_class_entry *ce;
- zend_object *object;
+ uint32_t call_info;
zend_function *fbc;
zend_execute_data *call;
@@ -8624,7 +9021,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_C
/* 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);
+ ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op1)), Z_STR_P(RT_CONSTANT(opline, opline->op1) + 1), ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
if (UNEXPECTED(ce == NULL)) {
ZEND_ASSERT(EG(exception));
@@ -8666,7 +9063,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_C
break;
}
} else if (IS_UNUSED == IS_CV && UNEXPECTED(Z_TYPE_P(function_name) == IS_UNDEF)) {
- GET_OP2_UNDEF_CV(function_name, BP_VAR_R);
+ ZVAL_UNDEFINED_OP2();
if (UNEXPECTED(EG(exception) != NULL)) {
HANDLE_EXCEPTION();
}
@@ -8695,7 +9092,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_C
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)) {
+ if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!RUN_TIME_CACHE(&fbc->op_array))) {
init_func_run_time_cache(&fbc->op_array);
}
if (IS_UNUSED != IS_CONST) {
@@ -8711,38 +9108,39 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_C
HANDLE_EXCEPTION();
}
fbc = ce->constructor;
- if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
+ if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!RUN_TIME_CACHE(&fbc->op_array))) {
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;
+ ce = (zend_class_entry*)Z_OBJ(EX(This));
+ call_info = ZEND_CALL_NESTED_FUNCTION | ZEND_CALL_HAS_THIS;
} else {
zend_non_static_method_call(fbc);
if (UNEXPECTED(EG(exception) != NULL)) {
HANDLE_EXCEPTION();
}
+ goto check_parent_and_self;
}
- }
-
- if (IS_CONST == IS_UNUSED) {
+ } else {
+check_parent_and_self:
/* 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 (IS_CONST == IS_UNUSED
+ && ((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_info = ZEND_CALL_NESTED_FUNCTION;
}
- call = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
- fbc, opline->extended_value, ce, object);
+ call = zend_vm_stack_push_call_frame(call_info,
+ fbc, opline->extended_value, ce);
call->prev_execute_data = EX(call);
EX(call) = call;
@@ -8811,7 +9209,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_NEW_SPEC_CONST_UNUSED_HANDLER(
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);
+ ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op1)), Z_STR_P(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));
@@ -8851,17 +9249,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_NEW_SPEC_CONST_UNUSED_HANDLER(
/* 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);
+ opline->extended_value, NULL);
} else {
- if (EXPECTED(constructor->type == ZEND_USER_FUNCTION) && UNEXPECTED(!constructor->op_array.run_time_cache)) {
+ if (EXPECTED(constructor->type == ZEND_USER_FUNCTION) && UNEXPECTED(!RUN_TIME_CACHE(&constructor->op_array))) {
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,
+ ZEND_CALL_FUNCTION | ZEND_CALL_RELEASE_THIS | ZEND_CALL_HAS_THIS,
constructor,
opline->extended_value,
- ce,
Z_OBJ_P(result));
Z_ADDREF_P(result);
}
@@ -8947,8 +9344,12 @@ num_index:
} else if (Z_TYPE_P(offset) == IS_TRUE) {
hval = 1;
goto num_index;
+ } else if (Z_TYPE_P(offset) == IS_RESOURCE) {
+ zend_use_resource_as_offset(offset);
+ hval = Z_RES_HANDLE_P(offset);
+ goto num_index;
} else if (IS_UNUSED == IS_CV && Z_TYPE_P(offset) == IS_UNDEF) {
- GET_OP2_UNDEF_CV(offset, BP_VAR_R);
+ ZVAL_UNDEFINED_OP2();
str = ZSTR_EMPTY_ALLOC();
goto str_index;
} else {
@@ -8981,7 +9382,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_CONST_UNUSED_H
}
ZEND_VM_TAIL_CALL(ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
} else {
- ZVAL_EMPTY_ARRAY(array);
+ ZVAL_ARR(array, zend_new_array(0));
ZEND_VM_NEXT_OPCODE();
}
}
@@ -9005,67 +9406,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_VAR_SPEC_CONST_UNUSED_HA
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);
- }
-
- 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) {
- zend_tmp_string_release(tmp_name);
- }
-
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
-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 *varname;
- zend_string *name, *tmp_name;
- zend_class_entry *ce;
-
-
- SAVE_OPLINE();
-
- 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));
-
- HANDLE_EXCEPTION();
- }
- /*CACHE_PTR(opline->extended_value, ce);*/
+ varname = ZVAL_UNDEFINED_OP1();
}
- } else if (IS_UNUSED == IS_UNUSED) {
- ce = zend_fetch_class(NULL, opline->op2.num);
- if (UNEXPECTED(ce == NULL)) {
- ZEND_ASSERT(EG(exception));
+ name = zval_try_get_tmp_string(varname, &tmp_name);
+ if (UNEXPECTED(!name)) {
HANDLE_EXCEPTION();
}
- } else {
- ce = Z_CE_P(EX_VAR(opline->op2.var));
}
- 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);
+ 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) {
zend_tmp_string_release(tmp_name);
@@ -9074,6 +9425,7 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_STATIC_PROP
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
+/* No specialization for op_types (CONST|TMPVAR|CV, UNUSED|CLASS_FETCH|CONST|VAR) */
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -9120,105 +9472,27 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_CONST_U
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zval *value;
- int result;
-
- zval *varname;
- zend_string *name, *tmp_name;
- zend_class_entry *ce;
-
- SAVE_OPLINE();
- if (IS_UNUSED == IS_CONST) {
- if (IS_CONST == IS_CONST && EXPECTED((ce = CACHED_PTR(opline->extended_value & ~ZEND_ISEMPTY)) != NULL)) {
- value = CACHED_PTR((opline->extended_value & ~ZEND_ISEMPTY) + sizeof(void*));
- goto is_static_prop_return;
- } else if (UNEXPECTED((ce = CACHED_PTR(opline->extended_value & ~ZEND_ISEMPTY)) == NULL)) {
- ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op2)), RT_CONSTANT(opline, opline->op2) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
- if (UNEXPECTED(ce == NULL)) {
- ZEND_ASSERT(EG(exception));
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
- }
- if (IS_CONST != IS_CONST) {
- CACHE_PTR(opline->extended_value & ~ZEND_ISEMPTY, ce);
- }
- }
- } else {
- if (IS_UNUSED == IS_UNUSED) {
- ce = zend_fetch_class(NULL, opline->op2.num);
- if (UNEXPECTED(ce == NULL)) {
- ZEND_ASSERT(EG(exception));
-
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
- }
- } else {
- ce = Z_CE_P(EX_VAR(opline->op2.var));
- }
- if (IS_CONST == IS_CONST &&
- EXPECTED(CACHED_PTR(opline->extended_value & ~ZEND_ISEMPTY) == ce)) {
-
- value = CACHED_PTR((opline->extended_value & ~ZEND_ISEMPTY) + sizeof(void*));
- goto is_static_prop_return;
- }
- }
-
- varname = RT_CONSTANT(opline, opline->op1);
- if (IS_CONST == IS_CONST) {
- name = Z_STR_P(varname);
- } else {
- name = zval_get_tmp_string(varname, &tmp_name);
- }
-
- value = zend_std_get_static_property(ce, name, 1);
-
- if (IS_CONST == IS_CONST && value) {
- CACHE_POLYMORPHIC_PTR(opline->extended_value & ~ZEND_ISEMPTY, ce, value);
- }
-
- if (IS_CONST != IS_CONST) {
- zend_tmp_string_release(tmp_name);
- }
-
-is_static_prop_return:
- if (!(opline->extended_value & ZEND_ISEMPTY)) {
- result = value && Z_TYPE_P(value) > IS_NULL &&
- (!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();
-}
-
+/* No specialization for op_types (CONST|TMPVAR|CV, UNUSED|CLASS_FETCH|CONST|VAR) */
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DECLARE_LAMBDA_FUNCTION_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
+ zend_function *func;
zval *zfunc;
zval *object;
zend_class_entry *called_scope;
- zend_function *fbc;
-
- 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;
+ func = CACHED_PTR(opline->extended_value);
+ if (UNEXPECTED(func == NULL)) {
+ zfunc = zend_hash_find_ex(EG(function_table), Z_STR_P(RT_CONSTANT(opline, opline->op1)), 1);
+ ZEND_ASSERT(zfunc != NULL);
+ func = Z_FUNC_P(zfunc);
+ ZEND_ASSERT(func->type == ZEND_USER_FUNCTION);
+ CACHE_PTR(opline->extended_value, 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) ||
+ if (UNEXPECTED((func->common.fn_flags & ZEND_ACC_STATIC) ||
(EX(func)->common.fn_flags & ZEND_ACC_STATIC))) {
object = NULL;
} else {
@@ -9228,7 +9502,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DECLARE_LAMBDA_FUNCTION_SPEC_C
called_scope = Z_CE(EX(This));
object = NULL;
}
- zend_create_closure(EX_VAR(opline->result.var), Z_FUNC_P(zfunc),
+ zend_create_closure(EX_VAR(opline->result.var), func,
EX(func)->op_array.scope, called_scope, object);
ZEND_VM_NEXT_OPCODE();
@@ -9275,20 +9549,23 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_CONST_UNUSED_HANDLE
/* If a function call result is yielded and the function did
* not return by reference we throw a notice. */
- if (IS_CONST == 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 {
+ do {
+ if (IS_CONST == IS_VAR) {
+ ZEND_ASSERT(value_ptr != &EG(uninitialized_zval));
+ if (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);
+ break;
+ }
+ }
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));
- }
+ } while (0);
}
} else {
@@ -9380,7 +9657,7 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_COUNT_SPEC_CONST_
SAVE_OPLINE();
op1 = RT_CONSTANT(opline, opline->op1);
- do {
+ while (1) {
if (Z_TYPE_P(op1) == IS_ARRAY) {
count = zend_array_count(Z_ARRVAL_P(op1));
break;
@@ -9390,6 +9667,10 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_COUNT_SPEC_CONST_
if (SUCCESS == Z_OBJ_HT_P(op1)->count_elements(op1, &count)) {
break;
}
+ if (UNEXPECTED(EG(exception))) {
+ count = 0;
+ break;
+ }
}
/* if not and the object implements Countable we call its count() method */
@@ -9404,13 +9685,20 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_COUNT_SPEC_CONST_
/* 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) {
+ } else if ((IS_CONST & (IS_VAR|IS_CV)) != 0 && Z_TYPE_P(op1) == IS_REFERENCE) {
+ op1 = Z_REFVAL_P(op1);
+ continue;
+ } else if (Z_TYPE_P(op1) <= IS_NULL) {
+ if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ ZVAL_UNDEFINED_OP1();
+ }
count = 0;
} else {
count = 1;
}
- zend_error(E_WARNING, "count(): Parameter must be an array or an object that implements Countable");
- } while (0);
+ zend_error(E_WARNING, "%s(): Parameter must be an array or an object that implements Countable", opline->extended_value ? "sizeof" : "count");
+ break;
+ }
ZVAL_LONG(EX_VAR(opline->result.var), count);
@@ -9437,11 +9725,20 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_GET_CLASS_SPEC_CO
SAVE_OPLINE();
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 {
- 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));
+ while (1) {
+ if (Z_TYPE_P(op1) == IS_OBJECT) {
+ ZVAL_STR_COPY(EX_VAR(opline->result.var), Z_OBJCE_P(op1)->name);
+ } else if ((IS_CONST & (IS_VAR|IS_CV)) != 0 && Z_TYPE_P(op1) == IS_REFERENCE) {
+ op1 = Z_REFVAL_P(op1);
+ continue;
+ } else {
+ if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ ZVAL_UNDEFINED_OP1();
+ }
+ 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));
+ }
+ break;
}
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
@@ -9504,10 +9801,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FUNC_GET_ARGS_SPEC_CONST_UNUSE
if (Z_OPT_REFCOUNTED_P(q)) {
Z_ADDREF_P(q);
}
+ ZEND_HASH_FILL_SET(q);
} else {
- q = &EG(uninitialized_zval);
+ ZEND_HASH_FILL_SET_NULL();
}
- ZEND_HASH_FILL_ADD(q);
+ ZEND_HASH_FILL_NEXT();
p++;
i++;
}
@@ -9525,10 +9823,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FUNC_GET_ARGS_SPEC_CONST_UNUSE
if (Z_OPT_REFCOUNTED_P(q)) {
Z_ADDREF_P(q);
}
+ ZEND_HASH_FILL_SET(q);
} else {
- q = &EG(uninitialized_zval);
+ ZEND_HASH_FILL_SET_NULL();
}
- ZEND_HASH_FILL_ADD(q);
+ ZEND_HASH_FILL_NEXT();
p++;
i++;
}
@@ -9540,92 +9839,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FUNC_GET_ARGS_SPEC_CONST_UNUSE
ZEND_VM_NEXT_OPCODE();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
-
- zval *op1, *op2, *result;
-
- 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);
- 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_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);
-
-
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SUB_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
-
- zval *op1, *op2, *result;
-
- 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);
- 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_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);
-
-
- 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
@@ -9641,98 +9854,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DIV_SPEC_CONST_CV_HANDLER(ZEND
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MOD_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
-
- zval *op1, *op2, *result;
-
- 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)) {
- 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_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);
-
-
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SL_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
-
- zval *op1, *op2;
-
- 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)) {
- 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);
- }
- shift_left_function(EX_VAR(opline->result.var), op1, op2);
-
-
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SR_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
-
- zval *op1, *op2;
-
- 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)) {
- 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);
- }
- shift_right_function(EX_VAR(opline->result.var), op1, op2);
-
-
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POW_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -9769,14 +9890,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CONCAT_SPEC_CONST_CV_HANDLER(Z
} else {
ZVAL_STR(EX_VAR(opline->result.var), op2_str);
}
-
+ if (IS_CONST & (IS_TMP_VAR|IS_VAR)) {
+ zend_string_release_ex(op1_str, 0);
+ }
} 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 {
ZVAL_STR(EX_VAR(opline->result.var), op1_str);
}
-
+ if (IS_CV & (IS_TMP_VAR|IS_VAR)) {
+ zend_string_release_ex(op2_str, 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);
@@ -9784,24 +9909,30 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CONCAT_SPEC_CONST_CV_HANDLER(Z
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);
-
+ if (IS_CV & (IS_TMP_VAR|IS_VAR)) {
+ zend_string_release_ex(op2_str, 0);
+ }
} 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_CONST & (IS_TMP_VAR|IS_VAR)) {
+ zend_string_release_ex(op1_str, 0);
+ }
+ if (IS_CV & (IS_TMP_VAR|IS_VAR)) {
+ zend_string_release_ex(op2_str, 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);
+ op1 = ZVAL_UNDEFINED_OP1();
}
if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
- op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
+ op2 = ZVAL_UNDEFINED_OP2();
}
concat_function(EX_VAR(opline->result.var), op1, op2);
@@ -9810,106 +9941,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CONCAT_SPEC_CONST_CV_HANDLER(Z
}
}
-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 = RT_CONSTANT(opline, opline->op1);
- op2 = EX_VAR(opline->op2.var);
- 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_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);
-
-
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
-
- zval *op1, *op2, *result;
-
- op1 = RT_CONSTANT(opline, opline->op1);
- op2 = EX_VAR(opline->op2.var);
- 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_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);
-
-
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SPACESHIP_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -9929,7 +9960,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_R_SPEC_CONST_CV_HAND
{
USE_OPLINE
- zval *container, *dim, *value, *result;
+ zval *container, *dim, *value;
SAVE_OPLINE();
container = RT_CONSTANT(opline, opline->op1);
@@ -9938,8 +9969,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_R_SPEC_CONST_CV_HAND
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);
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value);
} else if (EXPECTED(Z_TYPE_P(container) == IS_REFERENCE)) {
container = Z_REFVAL_P(container);
if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
@@ -9978,6 +10008,10 @@ 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)
{
+#if 0
+ USE_OPLINE
+#endif
+
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));
@@ -10019,12 +10053,14 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_
}
}
if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
- GET_OP1_UNDEF_CV(container, BP_VAR_R);
+ ZVAL_UNDEFINED_OP1();
}
if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(offset) == IS_UNDEF)) {
- GET_OP2_UNDEF_CV(offset, BP_VAR_R);
+ ZVAL_UNDEFINED_OP2();
}
- goto fetch_obj_r_no_object;
+ zend_wrong_property_read(offset);
+ ZVAL_NULL(EX_VAR(opline->result.var));
+ goto fetch_obj_r_finish;
} while (0);
}
@@ -10034,7 +10070,7 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_
zval *retval;
if (IS_CV == IS_CONST) {
- cache_slot = CACHE_ADDR(opline->extended_value);
+ cache_slot = CACHE_ADDR(opline->extended_value & ~ZEND_FETCH_REF /* FUNC_ARG fetch may contain it */);
if (EXPECTED(zobj->ce == CACHED_PTR_EX(cache_slot))) {
uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1);
@@ -10042,8 +10078,13 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_
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;
+ if (0 || (IS_CONST & (IS_TMP_VAR|IS_VAR)) != 0) {
+ goto fetch_obj_r_copy;
+ } else {
+fetch_obj_r_fast_copy:
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
+ ZEND_VM_NEXT_OPCODE();
+ }
}
} else if (EXPECTED(zobj->properties != NULL)) {
if (!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET(prop_offset)) {
@@ -10057,8 +10098,12 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_
(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;
+ retval = &p->val;
+ if (0 || (IS_CONST & (IS_TMP_VAR|IS_VAR)) != 0) {
+ goto fetch_obj_r_copy;
+ } else {
+ goto fetch_obj_r_fast_copy;
+ }
}
}
CACHE_PTR_EX(cache_slot + 1, (void*)ZEND_DYNAMIC_PROPERTY_OFFSET);
@@ -10067,30 +10112,30 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_
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;
+ if (0 || (IS_CONST & (IS_TMP_VAR|IS_VAR)) != 0) {
+ goto fetch_obj_r_copy;
+ } else {
+ goto fetch_obj_r_fast_copy;
+ }
}
}
}
} else if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(offset) == IS_UNDEF)) {
- GET_OP2_UNDEF_CV(offset, BP_VAR_R);
+ ZVAL_UNDEFINED_OP2();
}
- 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));
+ 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);
- }
+ if (retval != EX_VAR(opline->result.var)) {
+fetch_obj_r_copy:
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
+ } else if (UNEXPECTED(Z_ISREF_P(retval))) {
+ zend_unwrap_reference(retval);
}
} while (0);
+fetch_obj_r_finish:
+
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
@@ -10122,7 +10167,8 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC
break;
}
}
- goto fetch_obj_is_no_object;
+ ZVAL_NULL(EX_VAR(opline->result.var));
+ goto fetch_obj_is_finish;
} while (0);
}
@@ -10140,8 +10186,13 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC
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;
+ if (0 || (IS_CONST & (IS_TMP_VAR|IS_VAR)) != 0) {
+ goto fetch_obj_is_copy;
+ } else {
+fetch_obj_is_fast_copy:
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
+ ZEND_VM_NEXT_OPCODE();
+ }
}
} else if (EXPECTED(zobj->properties != NULL)) {
if (!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET(prop_offset)) {
@@ -10155,8 +10206,12 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC
(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;
+ retval = &p->val;
+ if (0 || (IS_CONST & (IS_TMP_VAR|IS_VAR)) != 0) {
+ goto fetch_obj_is_copy;
+ } else {
+ goto fetch_obj_is_fast_copy;
+ }
}
}
CACHE_PTR_EX(cache_slot + 1, (void*)ZEND_DYNAMIC_PROPERTY_OFFSET);
@@ -10165,38 +10220,43 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC
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 (0 || (IS_CONST & (IS_TMP_VAR|IS_VAR)) != 0) {
+ goto fetch_obj_is_copy;
+ } else {
+ goto fetch_obj_is_fast_copy;
+ }
}
}
}
}
- 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));
+ 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);
- }
+ if (retval != EX_VAR(opline->result.var)) {
+fetch_obj_is_copy:
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
+ } else if (UNEXPECTED(Z_ISREF_P(retval))) {
+ zend_unwrap_reference(retval);
}
} while (0);
+fetch_obj_is_finish:
+
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
+#if 0
+ USE_OPLINE
+#endif
+
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_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
@@ -10238,14 +10298,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FAST_CONCAT_SPEC_CONST_CV_HAND
} else {
ZVAL_STR(EX_VAR(opline->result.var), op2_str);
}
-
+ if (IS_CONST & (IS_TMP_VAR|IS_VAR)) {
+ zend_string_release_ex(op1_str, 0);
+ }
} 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 {
ZVAL_STR(EX_VAR(opline->result.var), op1_str);
}
-
+ if (IS_CV & (IS_TMP_VAR|IS_VAR)) {
+ zend_string_release_ex(op2_str, 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);
@@ -10253,14 +10317,20 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FAST_CONCAT_SPEC_CONST_CV_HAND
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);
-
+ if (IS_CV & (IS_TMP_VAR|IS_VAR)) {
+ zend_string_release_ex(op2_str, 0);
+ }
} 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_CONST & (IS_TMP_VAR|IS_VAR)) {
+ zend_string_release_ex(op1_str, 0);
+ }
+ if (IS_CV & (IS_TMP_VAR|IS_VAR)) {
+ zend_string_release_ex(op2_str, 0);
+ }
}
ZEND_VM_NEXT_OPCODE();
}
@@ -10272,7 +10342,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FAST_CONCAT_SPEC_CONST_CV_HAND
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);
+ ZVAL_UNDEFINED_OP1();
}
op1_str = zval_get_string_func(op1);
}
@@ -10282,7 +10352,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FAST_CONCAT_SPEC_CONST_CV_HAND
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);
+ ZVAL_UNDEFINED_OP2();
}
op2_str = zval_get_string_func(op2);
}
@@ -10360,7 +10430,7 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_
break;
}
} else if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(function_name) == IS_UNDEF)) {
- GET_OP2_UNDEF_CV(function_name, BP_VAR_R);
+ ZVAL_UNDEFINED_OP2();
if (UNEXPECTED(EG(exception) != NULL)) {
HANDLE_EXCEPTION();
@@ -10383,7 +10453,7 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_
}
}
if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
- object = GET_OP1_UNDEF_CV(object, BP_VAR_R);
+ object = ZVAL_UNDEFINED_OP1();
if (UNEXPECTED(EG(exception) != NULL)) {
if (IS_CV != IS_CONST) {
@@ -10411,13 +10481,6 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_
} else {
zend_object *orig_obj = obj;
- if (UNEXPECTED(obj->handlers->get_method == NULL)) {
- zend_throw_error(NULL, "Object does not support method calls");
-
-
- HANDLE_EXCEPTION();
- }
-
if (IS_CV == IS_CONST) {
function_name = EX_VAR(opline->op2.var);
}
@@ -10442,7 +10505,7 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_
/* Reset "object" to trigger reference counting */
object = NULL;
}
- if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
+ if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!RUN_TIME_CACHE(&fbc->op_array))) {
init_func_run_time_cache(&fbc->op_array);
}
}
@@ -10451,26 +10514,28 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_
}
- call_info = ZEND_CALL_NESTED_FUNCTION;
+ call_info = ZEND_CALL_NESTED_FUNCTION | ZEND_CALL_HAS_THIS;
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();
}
+ /* call static method */
+ obj = (zend_object*)called_scope;
+ call_info = ZEND_CALL_NESTED_FUNCTION;
} 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 */
}
+ /* CV may be changed indirectly (e.g. when it's a reference) */
+ call_info = ZEND_CALL_NESTED_FUNCTION | ZEND_CALL_HAS_THIS | ZEND_CALL_RELEASE_THIS;
}
call = zend_vm_stack_push_call_frame(call_info,
- fbc, opline->extended_value, called_scope, obj);
+ fbc, opline->extended_value, obj);
call->prev_execute_data = EX(call);
EX(call) = call;
@@ -10482,7 +10547,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_C
USE_OPLINE
zval *function_name;
zend_class_entry *ce;
- zend_object *object;
+ uint32_t call_info;
zend_function *fbc;
zend_execute_data *call;
@@ -10492,7 +10557,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_C
/* 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);
+ ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op1)), Z_STR_P(RT_CONSTANT(opline, opline->op1) + 1), ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
if (UNEXPECTED(ce == NULL)) {
ZEND_ASSERT(EG(exception));
@@ -10534,7 +10599,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_C
break;
}
} else if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(function_name) == IS_UNDEF)) {
- GET_OP2_UNDEF_CV(function_name, BP_VAR_R);
+ ZVAL_UNDEFINED_OP2();
if (UNEXPECTED(EG(exception) != NULL)) {
HANDLE_EXCEPTION();
}
@@ -10563,7 +10628,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_C
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)) {
+ if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!RUN_TIME_CACHE(&fbc->op_array))) {
init_func_run_time_cache(&fbc->op_array);
}
if (IS_CV != IS_CONST) {
@@ -10579,38 +10644,39 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_C
HANDLE_EXCEPTION();
}
fbc = ce->constructor;
- if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
+ if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!RUN_TIME_CACHE(&fbc->op_array))) {
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;
+ ce = (zend_class_entry*)Z_OBJ(EX(This));
+ call_info = ZEND_CALL_NESTED_FUNCTION | ZEND_CALL_HAS_THIS;
} else {
zend_non_static_method_call(fbc);
if (UNEXPECTED(EG(exception) != NULL)) {
HANDLE_EXCEPTION();
}
+ goto check_parent_and_self;
}
- }
-
- if (IS_CONST == IS_UNUSED) {
+ } else {
+check_parent_and_self:
/* 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 (IS_CONST == IS_UNUSED
+ && ((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_info = ZEND_CALL_NESTED_FUNCTION;
}
- call = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
- fbc, opline->extended_value, ce, object);
+ call = zend_vm_stack_push_call_frame(call_info,
+ fbc, opline->extended_value, ce);
call->prev_execute_data = EX(call);
EX(call) = call;
@@ -10625,8 +10691,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_USER_CALL_SPEC_CONST_CV_H
zend_fcall_info_cache fcc;
char *error = NULL;
zend_function *func;
- zend_class_entry *called_scope;
- zend_object *object;
+ void *object_or_called_scope;
zend_execute_data *call;
uint32_t call_info = ZEND_CALL_NESTED_FUNCTION | ZEND_CALL_DYNAMIC;
@@ -10634,8 +10699,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_USER_CALL_SPEC_CONST_CV_H
function_name = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var 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 */
@@ -10645,6 +10708,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_USER_CALL_SPEC_CONST_CV_H
HANDLE_EXCEPTION();
}
}
+ object_or_called_scope = fcc.called_scope;
if (func->common.fn_flags & ZEND_ACC_CLOSURE) {
/* Delay closure destruction until its invocation */
GC_ADDREF(ZEND_CLOSURE_OBJECT(func));
@@ -10652,22 +10716,26 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_USER_CALL_SPEC_CONST_CV_H
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 */
+ if (fcc.object) {
+ object_or_called_scope = fcc.object;
+ call_info |= ZEND_CALL_HAS_THIS;
+ }
+ } else if (fcc.object) {
+ GC_ADDREF(fcc.object); /* For $this pointer */
+ object_or_called_scope = fcc.object;
+ call_info |= ZEND_CALL_RELEASE_THIS | ZEND_CALL_HAS_THIS;
}
if ((IS_CV & (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);
+ } else if (call_info & ZEND_CALL_RELEASE_THIS) {
+ zend_object_release(fcc.object);
}
HANDLE_EXCEPTION();
}
- if (EXPECTED(func->type == ZEND_USER_FUNCTION) && UNEXPECTED(!func->op_array.run_time_cache)) {
+ if (EXPECTED(func->type == ZEND_USER_FUNCTION) && UNEXPECTED(!RUN_TIME_CACHE(&func->op_array))) {
init_func_run_time_cache(&func->op_array);
}
} else {
@@ -10678,12 +10746,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_USER_CALL_SPEC_CONST_CV_H
HANDLE_EXCEPTION();
}
func = (zend_function*)&zend_pass_function;
- called_scope = NULL;
- object = NULL;
+ object_or_called_scope = NULL;
}
call = zend_vm_stack_push_call_frame(call_info,
- func, opline->extended_value, called_scope, object);
+ func, opline->extended_value, object_or_called_scope);
call->prev_execute_data = EX(call);
EX(call) = call;
@@ -10766,8 +10833,12 @@ num_index:
} else if (Z_TYPE_P(offset) == IS_TRUE) {
hval = 1;
goto num_index;
+ } else if (Z_TYPE_P(offset) == IS_RESOURCE) {
+ zend_use_resource_as_offset(offset);
+ hval = Z_RES_HANDLE_P(offset);
+ goto num_index;
} else if (IS_CV == IS_CV && Z_TYPE_P(offset) == IS_UNDEF) {
- GET_OP2_UNDEF_CV(offset, BP_VAR_R);
+ ZVAL_UNDEFINED_OP2();
str = ZSTR_EMPTY_ALLOC();
goto str_index;
} else {
@@ -10800,7 +10871,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_CONST_CV_HANDL
}
ZEND_VM_TAIL_CALL(ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
} else {
- ZVAL_EMPTY_ARRAY(array);
+ ZVAL_ARR(array, zend_new_array(0));
ZEND_VM_NEXT_OPCODE();
}
}
@@ -10849,6 +10920,14 @@ num_index_prop:
/* > 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);
+
+ if (IS_CONST & (IS_CONST|IS_CV)) {
+ /* avoid exception check */
+
+ ZEND_VM_SMART_BRANCH(result, 0);
+ ZVAL_BOOL(EX_VAR(opline->result.var), result);
+ ZEND_VM_NEXT_OPCODE();
+ }
} else {
result = (value == NULL || !i_zend_is_true(value));
}
@@ -10899,21 +10978,20 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PRO
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;
+ result = (opline->extended_value & ZEND_ISEMPTY);
+ goto isset_object_finish;
}
} else {
- goto isset_no_object;
+ result = (opline->extended_value & ZEND_ISEMPTY);
+ goto isset_object_finish;
}
}
- 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));
- }
+
+ 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));
+
+isset_object_finish:
ZEND_VM_SMART_BRANCH(result, 1);
@@ -10921,6 +10999,41 @@ isset_no_object:
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ARRAY_KEY_EXISTS_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+
+
+ zval *key, *subject;
+ HashTable *ht;
+ uint32_t result;
+
+ SAVE_OPLINE();
+
+ key = RT_CONSTANT(opline, opline->op1);
+ subject = EX_VAR(opline->op2.var);
+
+ if (EXPECTED(Z_TYPE_P(subject) == IS_ARRAY)) {
+array_key_exists_array:
+ ht = Z_ARRVAL_P(subject);
+ result = zend_array_key_exists_fast(ht, key OPLINE_CC EXECUTE_DATA_CC);
+ } else {
+ if ((IS_CV & (IS_VAR|IS_CV)) && EXPECTED(Z_ISREF_P(subject))) {
+ subject = Z_REFVAL_P(subject);
+ if (EXPECTED(Z_TYPE_P(subject) == IS_ARRAY)) {
+ goto array_key_exists_array;
+ }
+ }
+ result = zend_array_key_exists_slow(subject, key OPLINE_CC EXECUTE_DATA_CC);
+ }
+
+
+ ZEND_VM_SMART_BRANCH(result == IS_TRUE, 1);
+ Z_TYPE_INFO_P(EX_VAR(opline->result.var)) = result;
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+}
+
+/* No specialization for op_types (CONST|TMPVAR|UNUSED|CV, ANY) */
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -10962,20 +11075,23 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_CONST_CV_HANDLER(ZE
/* If a function call result is yielded and the function did
* not return by reference we throw a notice. */
- if (IS_CONST == 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 {
+ do {
+ if (IS_CONST == IS_VAR) {
+ ZEND_ASSERT(value_ptr != &EG(uninitialized_zval));
+ if (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);
+ break;
+ }
+ }
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));
- }
+ } while (0);
}
} else {
@@ -11058,6 +11174,17 @@ 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_QM_ASSIGN_LONG_SPEC_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+
+ zval *value;
+
+ value = EX_VAR(opline->op1.var);
+ ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(value));
+ ZEND_VM_NEXT_OPCODE();
+}
+
static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_QM_ASSIGN_DOUBLE_SPEC_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -11080,6 +11207,541 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_QM_ASSIGN_NOREF_SP
ZEND_VM_NEXT_OPCODE();
}
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_SPEC_TMPVARCV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+
+ zval *op1, *op2, *result;
+ double d1, d2;
+
+ op1 = EX_VAR(opline->op1.var);
+ op2 = RT_CONSTANT(opline, opline->op2);
+ if (1 && (IS_TMP_VAR|IS_VAR|IS_CV) == IS_CONST && IS_CONST == IS_CONST) {
+ /* pass */
+ } else 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)) {
+ d1 = (double)Z_LVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+ goto add_double;
+ }
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+add_double:
+ result = EX_VAR(opline->result.var);
+ ZVAL_DOUBLE(result, d1 + d2);
+ ZEND_VM_NEXT_OPCODE();
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = (double)Z_LVAL_P(op2);
+ goto add_double;
+ }
+ }
+
+ ZEND_VM_TAIL_CALL(zend_add_helper_SPEC(op1, op2 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+}
+
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SUB_SPEC_TMPVARCV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+
+ zval *op1, *op2, *result;
+ double d1, d2;
+
+ op1 = EX_VAR(opline->op1.var);
+ op2 = RT_CONSTANT(opline, opline->op2);
+ if (1 && (IS_TMP_VAR|IS_VAR|IS_CV) == IS_CONST && IS_CONST == IS_CONST) {
+ /* pass */
+ } else 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)) {
+ d1 = (double)Z_LVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+ goto sub_double;
+ }
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+sub_double:
+ result = EX_VAR(opline->result.var);
+ ZVAL_DOUBLE(result, d1 - d2);
+ ZEND_VM_NEXT_OPCODE();
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = (double)Z_LVAL_P(op2);
+ goto sub_double;
+ }
+ }
+
+ ZEND_VM_TAIL_CALL(zend_sub_helper_SPEC(op1, op2 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MUL_SPEC_TMPVARCV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+
+ zval *op1, *op2, *result;
+ double d1, d2;
+
+ op1 = EX_VAR(opline->op1.var);
+ op2 = RT_CONSTANT(opline, opline->op2);
+ if (1 && (IS_TMP_VAR|IS_VAR|IS_CV) == IS_CONST && IS_CONST == IS_CONST) {
+ /* pass */
+ } else 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)) {
+ d1 = (double)Z_LVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+ goto mul_double;
+ }
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+mul_double:
+ result = EX_VAR(opline->result.var);
+ ZVAL_DOUBLE(result, d1 * d2);
+ ZEND_VM_NEXT_OPCODE();
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = (double)Z_LVAL_P(op2);
+ goto mul_double;
+ }
+ }
+
+ ZEND_VM_TAIL_CALL(zend_mul_helper_SPEC(op1, op2 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MOD_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);
+ if (1 && (IS_TMP_VAR|IS_VAR|IS_CV) == IS_CONST && IS_CONST == IS_CONST) {
+ /* pass */
+ } else 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();
+ }
+ }
+
+ ZEND_VM_TAIL_CALL(zend_mod_helper_SPEC(op1, op2 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SL_SPEC_TMPVARCV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+
+ zval *op1, *op2;
+
+ op1 = EX_VAR(opline->op1.var);
+ op2 = RT_CONSTANT(opline, opline->op2);
+ if (1 && (IS_TMP_VAR|IS_VAR|IS_CV) == IS_CONST && IS_CONST == IS_CONST) {
+ /* pass */
+ } else 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)) {
+ /* Perform shift on unsigned numbers to get well-defined wrap behavior. */
+ ZVAL_LONG(EX_VAR(opline->result.var),
+ (zend_long) ((zend_ulong) Z_LVAL_P(op1) << Z_LVAL_P(op2)));
+ ZEND_VM_NEXT_OPCODE();
+ }
+
+ ZEND_VM_TAIL_CALL(zend_shift_left_helper_SPEC(op1, op2 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SR_SPEC_TMPVARCV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+
+ zval *op1, *op2;
+
+ op1 = EX_VAR(opline->op1.var);
+ op2 = RT_CONSTANT(opline, opline->op2);
+ if (1 && (IS_TMP_VAR|IS_VAR|IS_CV) == IS_CONST && IS_CONST == IS_CONST) {
+ /* pass */
+ } else 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();
+ }
+
+ ZEND_VM_TAIL_CALL(zend_shift_right_helper_SPEC(op1, op2 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_TMPVARCV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+
+ zval *op1, *op2;
+ double d1, d2;
+
+ op1 = EX_VAR(opline->op1.var);
+ op2 = RT_CONSTANT(opline, opline->op2);
+ if (1 && (IS_TMP_VAR|IS_VAR|IS_CV) == IS_CONST && IS_CONST == IS_CONST) {
+ /* pass */
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_LVAL_P(op1) < Z_LVAL_P(op2))) {
+is_smaller_true:
+
+ ZVAL_TRUE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
+ } else {
+is_smaller_false:
+
+ ZVAL_FALSE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
+ }
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+ d1 = (double)Z_LVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+ goto is_smaller_double;
+ }
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+is_smaller_double:
+ if (d1 < d2) {
+ goto is_smaller_true;
+ } else {
+ goto is_smaller_false;
+ }
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = (double)Z_LVAL_P(op2);
+ goto is_smaller_double;
+ }
+ }
+ ZEND_VM_TAIL_CALL(zend_is_smaller_helper_SPEC(op1, op2 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+}
+
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_TMPVARCV_CONST_JMPZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+
+ zval *op1, *op2;
+ double d1, d2;
+
+ op1 = EX_VAR(opline->op1.var);
+ op2 = RT_CONSTANT(opline, opline->op2);
+ if (1 && (IS_TMP_VAR|IS_VAR|IS_CV) == IS_CONST && IS_CONST == IS_CONST) {
+ /* pass */
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_LVAL_P(op1) < Z_LVAL_P(op2))) {
+is_smaller_true:
+ ZEND_VM_SMART_BRANCH_TRUE_JMPZ();
+ ZVAL_TRUE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
+ } else {
+is_smaller_false:
+ ZEND_VM_SMART_BRANCH_FALSE_JMPZ();
+ ZVAL_FALSE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
+ }
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+ d1 = (double)Z_LVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+ goto is_smaller_double;
+ }
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+is_smaller_double:
+ if (d1 < d2) {
+ goto is_smaller_true;
+ } else {
+ goto is_smaller_false;
+ }
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = (double)Z_LVAL_P(op2);
+ goto is_smaller_double;
+ }
+ }
+ ZEND_VM_TAIL_CALL(zend_is_smaller_helper_SPEC(op1, op2 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+}
+
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_TMPVARCV_CONST_JMPNZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+
+ zval *op1, *op2;
+ double d1, d2;
+
+ op1 = EX_VAR(opline->op1.var);
+ op2 = RT_CONSTANT(opline, opline->op2);
+ if (1 && (IS_TMP_VAR|IS_VAR|IS_CV) == IS_CONST && IS_CONST == IS_CONST) {
+ /* pass */
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_LVAL_P(op1) < Z_LVAL_P(op2))) {
+is_smaller_true:
+ ZEND_VM_SMART_BRANCH_TRUE_JMPNZ();
+ ZVAL_TRUE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
+ } else {
+is_smaller_false:
+ ZEND_VM_SMART_BRANCH_FALSE_JMPNZ();
+ ZVAL_FALSE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
+ }
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+ d1 = (double)Z_LVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+ goto is_smaller_double;
+ }
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+is_smaller_double:
+ if (d1 < d2) {
+ goto is_smaller_true;
+ } else {
+ goto is_smaller_false;
+ }
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = (double)Z_LVAL_P(op2);
+ goto is_smaller_double;
+ }
+ }
+ ZEND_VM_TAIL_CALL(zend_is_smaller_helper_SPEC(op1, op2 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+
+ zval *op1, *op2;
+ double d1, d2;
+
+ op1 = EX_VAR(opline->op1.var);
+ op2 = RT_CONSTANT(opline, opline->op2);
+ if (1 && (IS_TMP_VAR|IS_VAR|IS_CV) == IS_CONST && IS_CONST == IS_CONST) {
+ /* pass */
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_LVAL_P(op1) <= Z_LVAL_P(op2))) {
+is_smaller_or_equal_true:
+
+ ZVAL_TRUE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
+ } else {
+is_smaller_or_equal_false:
+
+ ZVAL_FALSE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
+ }
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+ d1 = (double)Z_LVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+ goto is_smaller_or_equal_double;
+ }
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+is_smaller_or_equal_double:
+ if (d1 <= d2) {
+ goto is_smaller_or_equal_true;
+ } else {
+ goto is_smaller_or_equal_false;
+ }
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = (double)Z_LVAL_P(op2);
+ goto is_smaller_or_equal_double;
+ }
+ }
+ ZEND_VM_TAIL_CALL(zend_is_smaller_or_equal_helper_SPEC(op1, op2 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+}
+
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_CONST_JMPZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+
+ zval *op1, *op2;
+ double d1, d2;
+
+ op1 = EX_VAR(opline->op1.var);
+ op2 = RT_CONSTANT(opline, opline->op2);
+ if (1 && (IS_TMP_VAR|IS_VAR|IS_CV) == IS_CONST && IS_CONST == IS_CONST) {
+ /* pass */
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_LVAL_P(op1) <= Z_LVAL_P(op2))) {
+is_smaller_or_equal_true:
+ ZEND_VM_SMART_BRANCH_TRUE_JMPZ();
+ ZVAL_TRUE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
+ } else {
+is_smaller_or_equal_false:
+ ZEND_VM_SMART_BRANCH_FALSE_JMPZ();
+ ZVAL_FALSE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
+ }
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+ d1 = (double)Z_LVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+ goto is_smaller_or_equal_double;
+ }
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+is_smaller_or_equal_double:
+ if (d1 <= d2) {
+ goto is_smaller_or_equal_true;
+ } else {
+ goto is_smaller_or_equal_false;
+ }
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = (double)Z_LVAL_P(op2);
+ goto is_smaller_or_equal_double;
+ }
+ }
+ ZEND_VM_TAIL_CALL(zend_is_smaller_or_equal_helper_SPEC(op1, op2 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+}
+
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_CONST_JMPNZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+
+ zval *op1, *op2;
+ double d1, d2;
+
+ op1 = EX_VAR(opline->op1.var);
+ op2 = RT_CONSTANT(opline, opline->op2);
+ if (1 && (IS_TMP_VAR|IS_VAR|IS_CV) == IS_CONST && IS_CONST == IS_CONST) {
+ /* pass */
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_LVAL_P(op1) <= Z_LVAL_P(op2))) {
+is_smaller_or_equal_true:
+ ZEND_VM_SMART_BRANCH_TRUE_JMPNZ();
+ ZVAL_TRUE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
+ } else {
+is_smaller_or_equal_false:
+ ZEND_VM_SMART_BRANCH_FALSE_JMPNZ();
+ ZVAL_FALSE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
+ }
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+ d1 = (double)Z_LVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+ goto is_smaller_or_equal_double;
+ }
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+is_smaller_or_equal_double:
+ if (d1 <= d2) {
+ goto is_smaller_or_equal_true;
+ } else {
+ goto is_smaller_or_equal_false;
+ }
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = (double)Z_LVAL_P(op2);
+ goto is_smaller_or_equal_double;
+ }
+ }
+ ZEND_VM_TAIL_CALL(zend_is_smaller_or_equal_helper_SPEC(op1, op2 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_OR_SPEC_TMPVARCV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+
+ zval *op1, *op2;
+
+ op1 = EX_VAR(opline->op1.var);
+ op2 = RT_CONSTANT(opline, opline->op2);
+ if (1 && (IS_TMP_VAR|IS_VAR|IS_CV) == IS_CONST && IS_CONST == IS_CONST) {
+ /* pass */
+ } else 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_VM_TAIL_CALL(zend_bw_or_helper_SPEC(op1, op2 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_AND_SPEC_TMPVARCV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+
+ zval *op1, *op2;
+
+ op1 = EX_VAR(opline->op1.var);
+ op2 = RT_CONSTANT(opline, opline->op2);
+ if (1 && (IS_TMP_VAR|IS_VAR|IS_CV) == IS_CONST && IS_CONST == IS_CONST) {
+ /* pass */
+ } else 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_VM_TAIL_CALL(zend_bw_and_helper_SPEC(op1, op2 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_XOR_SPEC_TMPVARCV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+
+ zval *op1, *op2;
+
+ op1 = EX_VAR(opline->op1.var);
+ op2 = RT_CONSTANT(opline, opline->op2);
+ if (1 && (IS_TMP_VAR|IS_VAR|IS_CV) == IS_CONST && IS_CONST == IS_CONST) {
+ /* pass */
+ } else 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_VM_TAIL_CALL(zend_bw_xor_helper_SPEC(op1, op2 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+}
+
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_LIST_R_SPEC_TMPVARCV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -11266,7 +11928,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MUL_DOUBLE_SPEC_TM
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)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zval *op1, *op2;
@@ -11308,7 +11970,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_EQUAL_LONG_SPEC
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)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zval *op1, *op2;
@@ -11350,7 +12012,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_EQUAL_DOUBLE_SP
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)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zval *op1, *op2;
@@ -11392,7 +12054,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_EQUAL_LONG_
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)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zval *op1, *op2;
@@ -11434,7 +12096,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_EQUAL_DOUBL
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)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zval *op1, *op2;
@@ -11476,7 +12138,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_LONG_SP
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)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zval *op1, *op2;
@@ -11518,7 +12180,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_DOUBLE_
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)
+static 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;
@@ -11560,7 +12222,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUA
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)
+static 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;
@@ -11602,6 +12264,541 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUA
ZEND_VM_NEXT_OPCODE();
}
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_SPEC_TMPVARCV_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+
+ zval *op1, *op2, *result;
+ double d1, d2;
+
+ op1 = EX_VAR(opline->op1.var);
+ op2 = EX_VAR(opline->op2.var);
+ if (1 && (IS_TMP_VAR|IS_VAR|IS_CV) == IS_CONST && (IS_TMP_VAR|IS_VAR|IS_CV) == IS_CONST) {
+ /* pass */
+ } else 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)) {
+ d1 = (double)Z_LVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+ goto add_double;
+ }
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+add_double:
+ result = EX_VAR(opline->result.var);
+ ZVAL_DOUBLE(result, d1 + d2);
+ ZEND_VM_NEXT_OPCODE();
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = (double)Z_LVAL_P(op2);
+ goto add_double;
+ }
+ }
+
+ ZEND_VM_TAIL_CALL(zend_add_helper_SPEC(op1, op2 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+}
+
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SUB_SPEC_TMPVARCV_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+
+ zval *op1, *op2, *result;
+ double d1, d2;
+
+ op1 = EX_VAR(opline->op1.var);
+ op2 = EX_VAR(opline->op2.var);
+ if (1 && (IS_TMP_VAR|IS_VAR|IS_CV) == IS_CONST && (IS_TMP_VAR|IS_VAR|IS_CV) == IS_CONST) {
+ /* pass */
+ } else 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)) {
+ d1 = (double)Z_LVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+ goto sub_double;
+ }
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+sub_double:
+ result = EX_VAR(opline->result.var);
+ ZVAL_DOUBLE(result, d1 - d2);
+ ZEND_VM_NEXT_OPCODE();
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = (double)Z_LVAL_P(op2);
+ goto sub_double;
+ }
+ }
+
+ ZEND_VM_TAIL_CALL(zend_sub_helper_SPEC(op1, op2 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MUL_SPEC_TMPVARCV_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+
+ zval *op1, *op2, *result;
+ double d1, d2;
+
+ op1 = EX_VAR(opline->op1.var);
+ op2 = EX_VAR(opline->op2.var);
+ if (1 && (IS_TMP_VAR|IS_VAR|IS_CV) == IS_CONST && (IS_TMP_VAR|IS_VAR|IS_CV) == IS_CONST) {
+ /* pass */
+ } else 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)) {
+ d1 = (double)Z_LVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+ goto mul_double;
+ }
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+mul_double:
+ result = EX_VAR(opline->result.var);
+ ZVAL_DOUBLE(result, d1 * d2);
+ ZEND_VM_NEXT_OPCODE();
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = (double)Z_LVAL_P(op2);
+ goto mul_double;
+ }
+ }
+
+ ZEND_VM_TAIL_CALL(zend_mul_helper_SPEC(op1, op2 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MOD_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);
+ if (1 && (IS_TMP_VAR|IS_VAR|IS_CV) == IS_CONST && (IS_TMP_VAR|IS_VAR|IS_CV) == IS_CONST) {
+ /* pass */
+ } else 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();
+ }
+ }
+
+ ZEND_VM_TAIL_CALL(zend_mod_helper_SPEC(op1, op2 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SL_SPEC_TMPVARCV_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+
+ zval *op1, *op2;
+
+ op1 = EX_VAR(opline->op1.var);
+ op2 = EX_VAR(opline->op2.var);
+ if (1 && (IS_TMP_VAR|IS_VAR|IS_CV) == IS_CONST && (IS_TMP_VAR|IS_VAR|IS_CV) == IS_CONST) {
+ /* pass */
+ } else 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)) {
+ /* Perform shift on unsigned numbers to get well-defined wrap behavior. */
+ ZVAL_LONG(EX_VAR(opline->result.var),
+ (zend_long) ((zend_ulong) Z_LVAL_P(op1) << Z_LVAL_P(op2)));
+ ZEND_VM_NEXT_OPCODE();
+ }
+
+ ZEND_VM_TAIL_CALL(zend_shift_left_helper_SPEC(op1, op2 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SR_SPEC_TMPVARCV_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+
+ zval *op1, *op2;
+
+ op1 = EX_VAR(opline->op1.var);
+ op2 = EX_VAR(opline->op2.var);
+ if (1 && (IS_TMP_VAR|IS_VAR|IS_CV) == IS_CONST && (IS_TMP_VAR|IS_VAR|IS_CV) == IS_CONST) {
+ /* pass */
+ } else 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();
+ }
+
+ ZEND_VM_TAIL_CALL(zend_shift_right_helper_SPEC(op1, op2 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_TMPVARCV_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+
+ zval *op1, *op2;
+ double d1, d2;
+
+ op1 = EX_VAR(opline->op1.var);
+ op2 = EX_VAR(opline->op2.var);
+ if (1 && (IS_TMP_VAR|IS_VAR|IS_CV) == IS_CONST && (IS_TMP_VAR|IS_VAR|IS_CV) == IS_CONST) {
+ /* pass */
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_LVAL_P(op1) < Z_LVAL_P(op2))) {
+is_smaller_true:
+
+ ZVAL_TRUE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
+ } else {
+is_smaller_false:
+
+ ZVAL_FALSE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
+ }
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+ d1 = (double)Z_LVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+ goto is_smaller_double;
+ }
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+is_smaller_double:
+ if (d1 < d2) {
+ goto is_smaller_true;
+ } else {
+ goto is_smaller_false;
+ }
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = (double)Z_LVAL_P(op2);
+ goto is_smaller_double;
+ }
+ }
+ ZEND_VM_TAIL_CALL(zend_is_smaller_helper_SPEC(op1, op2 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+}
+
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_TMPVARCV_TMPVARCV_JMPZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+
+ zval *op1, *op2;
+ double d1, d2;
+
+ op1 = EX_VAR(opline->op1.var);
+ op2 = EX_VAR(opline->op2.var);
+ if (1 && (IS_TMP_VAR|IS_VAR|IS_CV) == IS_CONST && (IS_TMP_VAR|IS_VAR|IS_CV) == IS_CONST) {
+ /* pass */
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_LVAL_P(op1) < Z_LVAL_P(op2))) {
+is_smaller_true:
+ ZEND_VM_SMART_BRANCH_TRUE_JMPZ();
+ ZVAL_TRUE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
+ } else {
+is_smaller_false:
+ ZEND_VM_SMART_BRANCH_FALSE_JMPZ();
+ ZVAL_FALSE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
+ }
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+ d1 = (double)Z_LVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+ goto is_smaller_double;
+ }
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+is_smaller_double:
+ if (d1 < d2) {
+ goto is_smaller_true;
+ } else {
+ goto is_smaller_false;
+ }
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = (double)Z_LVAL_P(op2);
+ goto is_smaller_double;
+ }
+ }
+ ZEND_VM_TAIL_CALL(zend_is_smaller_helper_SPEC(op1, op2 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+}
+
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_TMPVARCV_TMPVARCV_JMPNZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+
+ zval *op1, *op2;
+ double d1, d2;
+
+ op1 = EX_VAR(opline->op1.var);
+ op2 = EX_VAR(opline->op2.var);
+ if (1 && (IS_TMP_VAR|IS_VAR|IS_CV) == IS_CONST && (IS_TMP_VAR|IS_VAR|IS_CV) == IS_CONST) {
+ /* pass */
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_LVAL_P(op1) < Z_LVAL_P(op2))) {
+is_smaller_true:
+ ZEND_VM_SMART_BRANCH_TRUE_JMPNZ();
+ ZVAL_TRUE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
+ } else {
+is_smaller_false:
+ ZEND_VM_SMART_BRANCH_FALSE_JMPNZ();
+ ZVAL_FALSE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
+ }
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+ d1 = (double)Z_LVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+ goto is_smaller_double;
+ }
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+is_smaller_double:
+ if (d1 < d2) {
+ goto is_smaller_true;
+ } else {
+ goto is_smaller_false;
+ }
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = (double)Z_LVAL_P(op2);
+ goto is_smaller_double;
+ }
+ }
+ ZEND_VM_TAIL_CALL(zend_is_smaller_helper_SPEC(op1, op2 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+
+ zval *op1, *op2;
+ double d1, d2;
+
+ op1 = EX_VAR(opline->op1.var);
+ op2 = EX_VAR(opline->op2.var);
+ if (1 && (IS_TMP_VAR|IS_VAR|IS_CV) == IS_CONST && (IS_TMP_VAR|IS_VAR|IS_CV) == IS_CONST) {
+ /* pass */
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_LVAL_P(op1) <= Z_LVAL_P(op2))) {
+is_smaller_or_equal_true:
+
+ ZVAL_TRUE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
+ } else {
+is_smaller_or_equal_false:
+
+ ZVAL_FALSE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
+ }
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+ d1 = (double)Z_LVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+ goto is_smaller_or_equal_double;
+ }
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+is_smaller_or_equal_double:
+ if (d1 <= d2) {
+ goto is_smaller_or_equal_true;
+ } else {
+ goto is_smaller_or_equal_false;
+ }
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = (double)Z_LVAL_P(op2);
+ goto is_smaller_or_equal_double;
+ }
+ }
+ ZEND_VM_TAIL_CALL(zend_is_smaller_or_equal_helper_SPEC(op1, op2 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+}
+
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_TMPVARCV_JMPZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+
+ zval *op1, *op2;
+ double d1, d2;
+
+ op1 = EX_VAR(opline->op1.var);
+ op2 = EX_VAR(opline->op2.var);
+ if (1 && (IS_TMP_VAR|IS_VAR|IS_CV) == IS_CONST && (IS_TMP_VAR|IS_VAR|IS_CV) == IS_CONST) {
+ /* pass */
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_LVAL_P(op1) <= Z_LVAL_P(op2))) {
+is_smaller_or_equal_true:
+ ZEND_VM_SMART_BRANCH_TRUE_JMPZ();
+ ZVAL_TRUE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
+ } else {
+is_smaller_or_equal_false:
+ ZEND_VM_SMART_BRANCH_FALSE_JMPZ();
+ ZVAL_FALSE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
+ }
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+ d1 = (double)Z_LVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+ goto is_smaller_or_equal_double;
+ }
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+is_smaller_or_equal_double:
+ if (d1 <= d2) {
+ goto is_smaller_or_equal_true;
+ } else {
+ goto is_smaller_or_equal_false;
+ }
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = (double)Z_LVAL_P(op2);
+ goto is_smaller_or_equal_double;
+ }
+ }
+ ZEND_VM_TAIL_CALL(zend_is_smaller_or_equal_helper_SPEC(op1, op2 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+}
+
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_TMPVARCV_JMPNZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+
+ zval *op1, *op2;
+ double d1, d2;
+
+ op1 = EX_VAR(opline->op1.var);
+ op2 = EX_VAR(opline->op2.var);
+ if (1 && (IS_TMP_VAR|IS_VAR|IS_CV) == IS_CONST && (IS_TMP_VAR|IS_VAR|IS_CV) == IS_CONST) {
+ /* pass */
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_LVAL_P(op1) <= Z_LVAL_P(op2))) {
+is_smaller_or_equal_true:
+ ZEND_VM_SMART_BRANCH_TRUE_JMPNZ();
+ ZVAL_TRUE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
+ } else {
+is_smaller_or_equal_false:
+ ZEND_VM_SMART_BRANCH_FALSE_JMPNZ();
+ ZVAL_FALSE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
+ }
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+ d1 = (double)Z_LVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+ goto is_smaller_or_equal_double;
+ }
+ } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+is_smaller_or_equal_double:
+ if (d1 <= d2) {
+ goto is_smaller_or_equal_true;
+ } else {
+ goto is_smaller_or_equal_false;
+ }
+ } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = (double)Z_LVAL_P(op2);
+ goto is_smaller_or_equal_double;
+ }
+ }
+ ZEND_VM_TAIL_CALL(zend_is_smaller_or_equal_helper_SPEC(op1, op2 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_OR_SPEC_TMPVARCV_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+
+ zval *op1, *op2;
+
+ op1 = EX_VAR(opline->op1.var);
+ op2 = EX_VAR(opline->op2.var);
+ if (1 && (IS_TMP_VAR|IS_VAR|IS_CV) == IS_CONST && (IS_TMP_VAR|IS_VAR|IS_CV) == IS_CONST) {
+ /* pass */
+ } else 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_VM_TAIL_CALL(zend_bw_or_helper_SPEC(op1, op2 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_AND_SPEC_TMPVARCV_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+
+ zval *op1, *op2;
+
+ op1 = EX_VAR(opline->op1.var);
+ op2 = EX_VAR(opline->op2.var);
+ if (1 && (IS_TMP_VAR|IS_VAR|IS_CV) == IS_CONST && (IS_TMP_VAR|IS_VAR|IS_CV) == IS_CONST) {
+ /* pass */
+ } else 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_VM_TAIL_CALL(zend_bw_and_helper_SPEC(op1, op2 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_XOR_SPEC_TMPVARCV_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+
+ zval *op1, *op2;
+
+ op1 = EX_VAR(opline->op1.var);
+ op2 = EX_VAR(opline->op2.var);
+ if (1 && (IS_TMP_VAR|IS_VAR|IS_CV) == IS_CONST && (IS_TMP_VAR|IS_VAR|IS_CV) == IS_CONST) {
+ /* pass */
+ } else 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_VM_TAIL_CALL(zend_bw_xor_helper_SPEC(op1, op2 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+}
+
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
@@ -11712,7 +12909,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MUL_DOUBLE_SPEC_TM
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)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zval *op1, *op2;
@@ -11754,7 +12951,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_EQUAL_LONG_SPEC
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)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zval *op1, *op2;
@@ -11796,7 +12993,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_EQUAL_DOUBLE_SP
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)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zval *op1, *op2;
@@ -11838,7 +13035,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_EQUAL_LONG_
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)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zval *op1, *op2;
@@ -11880,7 +13077,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_EQUAL_DOUBL
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)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zval *op1, *op2;
@@ -11922,7 +13119,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_LONG_SP
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)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zval *op1, *op2;
@@ -11964,7 +13161,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_DOUBLE_
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)
+static 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;
@@ -12006,7 +13203,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUA
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)
+static 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;
@@ -12087,8 +13284,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_NOT_SPEC_TMPVAR_HANDLER(ZEN
}
SAVE_OPLINE();
- bitwise_not_function(EX_VAR(opline->result.var),
- _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC));
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ op1 = ZVAL_UNDEFINED_OP1();
+ }
+ bitwise_not_function(EX_VAR(opline->result.var), op1);
zval_ptr_dtor_nogc(free_op1);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
@@ -12108,7 +13307,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BOOL_NOT_SPEC_TMPVAR_HANDLER(Z
ZVAL_TRUE(EX_VAR(opline->result.var));
if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(orig_val_type == IS_UNDEF)) {
SAVE_OPLINE();
- GET_OP1_UNDEF_CV(val, BP_VAR_R);
+ ZVAL_UNDEFINED_OP1();
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
} else {
@@ -12141,7 +13340,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ECHO_SPEC_TMPVAR_HANDLER(ZEND_
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);
+ ZVAL_UNDEFINED_OP1();
}
zend_string_release_ex(str, 0);
}
@@ -12163,7 +13362,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPZ_SPEC_TMPVAR_H
} 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);
+ ZVAL_UNDEFINED_OP1();
if (UNEXPECTED(EG(exception))) {
HANDLE_EXCEPTION();
}
@@ -12194,7 +13393,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPNZ_SPEC_TMPVAR_
} 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);
+ ZVAL_UNDEFINED_OP1();
if (UNEXPECTED(EG(exception))) {
HANDLE_EXCEPTION();
}
@@ -12212,7 +13411,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPNZ_SPEC_TMPVAR_
ZEND_VM_JMP(opline);
}
-static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPZNZ_SPEC_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPZNZ_SPEC_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zend_free_op free_op1;
@@ -12226,7 +13425,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPZNZ_SPEC_TMPVAR
} 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);
+ ZVAL_UNDEFINED_OP1();
if (UNEXPECTED(EG(exception))) {
HANDLE_EXCEPTION();
}
@@ -12260,7 +13459,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPZ_EX_SPEC_TMPVAR_HANDLER(ZE
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);
+ ZVAL_UNDEFINED_OP1();
if (UNEXPECTED(EG(exception))) {
HANDLE_EXCEPTION();
}
@@ -12297,7 +13496,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPNZ_EX_SPEC_TMPVAR_HANDLER(Z
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);
+ ZVAL_UNDEFINED_OP1();
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
} else {
ZEND_VM_NEXT_OPCODE();
@@ -12372,7 +13571,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BOOL_SPEC_TMPVAR_HANDLER(ZEND_
ZVAL_FALSE(EX_VAR(opline->result.var));
if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(orig_val_type == IS_UNDEF)) {
SAVE_OPLINE();
- GET_OP1_UNDEF_CV(val, BP_VAR_R);
+ ZVAL_UNDEFINED_OP1();
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
} else {
@@ -12411,7 +13610,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CLONE_SPEC_TMPVAR_HANDLER(ZEND
}
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);
+ ZVAL_UNDEFINED_OP1();
if (UNEXPECTED(EG(exception) != NULL)) {
HANDLE_EXCEPTION();
}
@@ -12432,23 +13631,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CLONE_SPEC_TMPVAR_HANDLER(ZEND
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) : "");
+ if (clone && !(clone->common.fn_flags & ZEND_ACC_PUBLIC)) {
+ scope = EX(func)->op_array.scope;
+ if (clone->common.scope != scope) {
+ if (UNEXPECTED(clone->common.fn_flags & ZEND_ACC_PRIVATE)
+ || UNEXPECTED(!zend_check_protected(zend_get_function_root_class(clone), scope))) {
+ zend_wrong_clone_call(clone, scope);
zval_ptr_dtor_nogc(free_op1);
ZVAL_UNDEF(EX_VAR(opline->result.var));
HANDLE_EXCEPTION();
@@ -12490,15 +13678,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INCLUDE_OR_EVAL_SPEC_TMPVAR_HA
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,
+ call = zend_vm_stack_push_call_frame(
+ (Z_TYPE_INFO(EX(This)) & ZEND_CALL_HAS_THIS) | 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);
+ Z_PTR(EX(This)));
if (EX_CALL_INFO() & ZEND_CALL_HAS_SYMBOL_TABLE) {
call->symbol_table = EX(symbol_table);
@@ -12529,75 +13716,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INCLUDE_OR_EVAL_SPEC_TMPVAR_HA
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
@@ -12623,7 +13741,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_STRLEN_SPEC_TMPVAR_HANDLER(ZEN
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);
+ value = ZVAL_UNDEFINED_OP1();
}
strict = EX_USES_STRICT_TYPES();
do {
@@ -12639,7 +13757,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_STRLEN_SPEC_TMPVAR_HANDLER(ZEN
}
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)));
+ if (!EG(exception)) {
+ 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);
}
@@ -12669,10 +13789,11 @@ 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();
+ ZVAL_UNDEFINED_OP1();
+ if (UNEXPECTED(EG(exception))) {
+ ZVAL_UNDEF(EX_VAR(opline->result.var));
+ HANDLE_EXCEPTION();
+ }
}
if ((IS_TMP_VAR|IS_VAR) & (IS_TMP_VAR|IS_VAR)) {
SAVE_OPLINE();
@@ -12687,138 +13808,6 @@ type_check_resource:
}
}
-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 = _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);
- 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_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);
-
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SUB_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 = 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);
- 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_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);
-
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MUL_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 = 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;
-
- 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_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);
-
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DIV_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -12834,98 +13823,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DIV_SPEC_TMPVAR_CONST_HANDLER(
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MOD_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 = 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)) {
- 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_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);
-
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SL_SPEC_TMPVAR_CONST_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 = 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)) {
- 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_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);
-
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SR_SPEC_TMPVAR_CONST_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 = 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)) {
- 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_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);
-
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POW_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -12962,14 +13859,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CONCAT_SPEC_TMPVAR_CONST_HANDL
} else {
ZVAL_STR(EX_VAR(opline->result.var), op2_str);
}
- zval_ptr_dtor_nogc(free_op1);
+ if ((IS_TMP_VAR|IS_VAR) & (IS_TMP_VAR|IS_VAR)) {
+ zend_string_release_ex(op1_str, 0);
+ }
} 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 {
ZVAL_STR(EX_VAR(opline->result.var), op1_str);
}
-
+ if (IS_CONST & (IS_TMP_VAR|IS_VAR)) {
+ zend_string_release_ex(op2_str, 0);
+ }
} 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);
@@ -12977,24 +13878,30 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CONCAT_SPEC_TMPVAR_CONST_HANDL
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);
-
+ if (IS_CONST & (IS_TMP_VAR|IS_VAR)) {
+ zend_string_release_ex(op2_str, 0);
+ }
} 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);
-
+ if ((IS_TMP_VAR|IS_VAR) & (IS_TMP_VAR|IS_VAR)) {
+ zend_string_release_ex(op1_str, 0);
+ }
+ if (IS_CONST & (IS_TMP_VAR|IS_VAR)) {
+ zend_string_release_ex(op2_str, 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);
+ op1 = ZVAL_UNDEFINED_OP1();
}
if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
- op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
+ op2 = ZVAL_UNDEFINED_OP2();
}
concat_function(EX_VAR(opline->result.var), op1, op2);
zval_ptr_dtor_nogc(free_op1);
@@ -13007,309 +13914,390 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_TMPVAR_CONST_HAN
{
USE_OPLINE
zend_free_op free_op1;
- zval *op1, *op2, *result;
+ zval *op1, *op2;
+ double d1, d2;
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));
+ if (1 && (IS_TMP_VAR|IS_VAR) == IS_CONST && IS_CONST == IS_CONST) {
+ /* pass */
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_LVAL_P(op1) == Z_LVAL_P(op2))) {
+is_equal_true:
+
+ ZVAL_TRUE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
} else {
- break;
+is_equal_false:
+
+ ZVAL_FALSE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
}
- } 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 if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ d1 = (double)Z_LVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+ goto is_equal_double;
+ }
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+is_equal_double:
+ if (d1 == d2) {
+ goto is_equal_true;
} else {
- break;
+ goto is_equal_false;
}
- } 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);
-
+ } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = (double)Z_LVAL_P(op2);
+ goto is_equal_double;
+ }
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
+ if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
+ int result = zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2));
+ if ((IS_TMP_VAR|IS_VAR) & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_str(op1);
+ }
+ if (IS_CONST & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_str(op2);
+ }
+ if (result) {
+ goto is_equal_true;
} else {
- break;
+ goto is_equal_false;
}
- } 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);
- zval_ptr_dtor_nogc(free_op1);
-
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+ ZEND_VM_TAIL_CALL(zend_is_equal_helper_SPEC(op1, op2 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-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_EQUAL_SPEC_TMPVAR_CONST_JMPZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zend_free_op free_op1;
- zval *op1, *op2, *result;
+ zval *op1, *op2;
+ double d1, d2;
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));
+ if (1 && (IS_TMP_VAR|IS_VAR) == IS_CONST && IS_CONST == IS_CONST) {
+ /* pass */
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_LVAL_P(op1) == Z_LVAL_P(op2))) {
+is_equal_true:
+ ZEND_VM_SMART_BRANCH_TRUE_JMPZ();
+ ZVAL_TRUE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
} else {
- break;
+is_equal_false:
+ ZEND_VM_SMART_BRANCH_FALSE_JMPZ();
+ ZVAL_FALSE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
}
- } 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 if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ d1 = (double)Z_LVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+ goto is_equal_double;
+ }
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+is_equal_double:
+ if (d1 == d2) {
+ goto is_equal_true;
} else {
- break;
+ goto is_equal_false;
}
- } 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);
-
+ } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = (double)Z_LVAL_P(op2);
+ goto is_equal_double;
+ }
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
+ if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
+ int result = zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2));
+ if ((IS_TMP_VAR|IS_VAR) & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_str(op1);
+ }
+ if (IS_CONST & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_str(op2);
+ }
+ if (result) {
+ goto is_equal_true;
} else {
- break;
+ goto is_equal_false;
}
- } 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);
- zval_ptr_dtor_nogc(free_op1);
-
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+ ZEND_VM_TAIL_CALL(zend_is_equal_helper_SPEC(op1, op2 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-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_EQUAL_SPEC_TMPVAR_CONST_JMPNZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zend_free_op free_op1;
- zval *op1, *op2, *result;
+ zval *op1, *op2;
+ double d1, d2;
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_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));
+ if (1 && (IS_TMP_VAR|IS_VAR) == IS_CONST && IS_CONST == IS_CONST) {
+ /* pass */
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_LVAL_P(op1) == Z_LVAL_P(op2))) {
+is_equal_true:
+ ZEND_VM_SMART_BRANCH_TRUE_JMPNZ();
+ ZVAL_TRUE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
} else {
- break;
+is_equal_false:
+ ZEND_VM_SMART_BRANCH_FALSE_JMPNZ();
+ ZVAL_FALSE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
}
- } 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 if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ d1 = (double)Z_LVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+ goto is_equal_double;
+ }
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+is_equal_double:
+ if (d1 == d2) {
+ goto is_equal_true;
} else {
- break;
+ goto is_equal_false;
+ }
+ } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = (double)Z_LVAL_P(op2);
+ goto is_equal_double;
+ }
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
+ if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
+ int result = zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2));
+ if ((IS_TMP_VAR|IS_VAR) & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_str(op1);
+ }
+ if (IS_CONST & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_str(op2);
+ }
+ if (result) {
+ goto is_equal_true;
+ } else {
+ goto is_equal_false;
}
- } 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_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);
-
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+ ZEND_VM_TAIL_CALL(zend_is_equal_helper_SPEC(op1, op2 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-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_NOT_EQUAL_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zend_free_op free_op1;
- zval *op1, *op2, *result;
+ zval *op1, *op2;
+ double d1, d2;
op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
op2 = RT_CONSTANT(opline, opline->op2);
- do {
- int result;
+ if (1 && (IS_TMP_VAR|IS_VAR) == IS_CONST && IS_CONST == IS_CONST) {
+ /* pass */
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_LVAL_P(op1) != Z_LVAL_P(op2))) {
+is_not_equal_true:
+
+ ZVAL_TRUE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
+ } else {
+is_not_equal_false:
- 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));
+ ZVAL_FALSE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
+ }
+ } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ d1 = (double)Z_LVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+ goto is_not_equal_double;
+ }
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+is_not_equal_double:
+ if (d1 != d2) {
+ goto is_not_equal_true;
} else {
- break;
+ goto is_not_equal_false;
+ }
+ } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = (double)Z_LVAL_P(op2);
+ goto is_not_equal_double;
+ }
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
+ if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
+ int result = zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2));
+ if ((IS_TMP_VAR|IS_VAR) & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_str(op1);
}
- } 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)));
+ if (IS_CONST & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_str(op2);
+ }
+ if (!result) {
+ goto is_not_equal_true;
} else {
- break;
+ goto is_not_equal_false;
}
- } 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_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);
-
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+ ZEND_VM_TAIL_CALL(zend_is_not_equal_helper_SPEC(op1, op2 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-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_IS_NOT_EQUAL_SPEC_TMPVAR_CONST_JMPZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zend_free_op free_op1;
zval *op1, *op2;
+ double d1, d2;
- SAVE_OPLINE();
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);
-
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_OR_SPEC_TMPVAR_CONST_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 = 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));
- 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_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
- op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
+ if (1 && (IS_TMP_VAR|IS_VAR) == IS_CONST && IS_CONST == IS_CONST) {
+ /* pass */
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_LVAL_P(op1) != Z_LVAL_P(op2))) {
+is_not_equal_true:
+ ZEND_VM_SMART_BRANCH_TRUE_JMPZ();
+ ZVAL_TRUE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
+ } else {
+is_not_equal_false:
+ ZEND_VM_SMART_BRANCH_FALSE_JMPZ();
+ ZVAL_FALSE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
+ }
+ } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ d1 = (double)Z_LVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+ goto is_not_equal_double;
+ }
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+is_not_equal_double:
+ if (d1 != d2) {
+ goto is_not_equal_true;
+ } else {
+ goto is_not_equal_false;
+ }
+ } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = (double)Z_LVAL_P(op2);
+ goto is_not_equal_double;
+ }
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
+ if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
+ int result = zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2));
+ if ((IS_TMP_VAR|IS_VAR) & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_str(op1);
+ }
+ if (IS_CONST & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_str(op2);
+ }
+ if (!result) {
+ goto is_not_equal_true;
+ } else {
+ goto is_not_equal_false;
+ }
+ }
}
- bitwise_or_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_is_not_equal_helper_SPEC(op1, op2 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-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_IS_NOT_EQUAL_SPEC_TMPVAR_CONST_JMPNZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zend_free_op free_op1;
zval *op1, *op2;
+ double d1, d2;
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));
- 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_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
- op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
+ if (1 && (IS_TMP_VAR|IS_VAR) == IS_CONST && IS_CONST == IS_CONST) {
+ /* pass */
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_LVAL_P(op1) != Z_LVAL_P(op2))) {
+is_not_equal_true:
+ ZEND_VM_SMART_BRANCH_TRUE_JMPNZ();
+ ZVAL_TRUE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
+ } else {
+is_not_equal_false:
+ ZEND_VM_SMART_BRANCH_FALSE_JMPNZ();
+ ZVAL_FALSE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
+ }
+ } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ d1 = (double)Z_LVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+ goto is_not_equal_double;
+ }
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+is_not_equal_double:
+ if (d1 != d2) {
+ goto is_not_equal_true;
+ } else {
+ goto is_not_equal_false;
+ }
+ } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = (double)Z_LVAL_P(op2);
+ goto is_not_equal_double;
+ }
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
+ if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
+ int result = zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2));
+ if ((IS_TMP_VAR|IS_VAR) & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_str(op1);
+ }
+ if (IS_CONST & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_str(op2);
+ }
+ if (!result) {
+ goto is_not_equal_true;
+ } else {
+ goto is_not_equal_false;
+ }
+ }
}
- bitwise_and_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_is_not_equal_helper_SPEC(op1, op2 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-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_SPACESHIP_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 = 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));
- 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_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);
+ compare_function(EX_VAR(opline->result.var), op1, op2);
zval_ptr_dtor_nogc(free_op1);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
@@ -13330,137 +14318,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BOOL_XOR_SPEC_TMPVAR_CONST_HAN
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_TMPVAR_CONST(int type ZEND_OPCODE_HANDLER_ARGS_DC)
-{
- USE_OPLINE
- 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;
+ zval *container, *dim, *value;
SAVE_OPLINE();
container = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
@@ -13469,8 +14331,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_R_SPEC_TMPVAR_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_DEREF(result, value);
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value);
} else if (EXPECTED(Z_TYPE_P(container) == IS_REFERENCE)) {
container = Z_REFVAL_P(container);
if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
@@ -13535,12 +14396,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMPVAR_CONST_
}
}
if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
- GET_OP1_UNDEF_CV(container, BP_VAR_R);
+ ZVAL_UNDEFINED_OP1();
}
if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(offset) == IS_UNDEF)) {
- GET_OP2_UNDEF_CV(offset, BP_VAR_R);
+ ZVAL_UNDEFINED_OP2();
}
- goto fetch_obj_r_no_object;
+ zend_wrong_property_read(offset);
+ ZVAL_NULL(EX_VAR(opline->result.var));
+ goto fetch_obj_r_finish;
} while (0);
}
@@ -13550,7 +14413,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMPVAR_CONST_
zval *retval;
if (IS_CONST == IS_CONST) {
- cache_slot = CACHE_ADDR(opline->extended_value);
+ cache_slot = CACHE_ADDR(opline->extended_value & ~ZEND_FETCH_REF /* FUNC_ARG fetch may contain it */);
if (EXPECTED(zobj->ce == CACHED_PTR_EX(cache_slot))) {
uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1);
@@ -13558,8 +14421,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMPVAR_CONST_
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;
+ if (0 || ((IS_TMP_VAR|IS_VAR) & (IS_TMP_VAR|IS_VAR)) != 0) {
+ goto fetch_obj_r_copy;
+ } else {
+fetch_obj_r_fast_copy:
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
+ ZEND_VM_NEXT_OPCODE();
+ }
}
} else if (EXPECTED(zobj->properties != NULL)) {
if (!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET(prop_offset)) {
@@ -13573,8 +14441,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMPVAR_CONST_
(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;
+ retval = &p->val;
+ if (0 || ((IS_TMP_VAR|IS_VAR) & (IS_TMP_VAR|IS_VAR)) != 0) {
+ goto fetch_obj_r_copy;
+ } else {
+ goto fetch_obj_r_fast_copy;
+ }
}
}
CACHE_PTR_EX(cache_slot + 1, (void*)ZEND_DYNAMIC_PROPERTY_OFFSET);
@@ -13583,30 +14455,30 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMPVAR_CONST_
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;
+ if (0 || ((IS_TMP_VAR|IS_VAR) & (IS_TMP_VAR|IS_VAR)) != 0) {
+ goto fetch_obj_r_copy;
+ } else {
+ goto fetch_obj_r_fast_copy;
+ }
}
}
}
} else if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(offset) == IS_UNDEF)) {
- GET_OP2_UNDEF_CV(offset, BP_VAR_R);
+ ZVAL_UNDEFINED_OP2();
}
- 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));
+ 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);
- }
+ if (retval != EX_VAR(opline->result.var)) {
+fetch_obj_r_copy:
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
+ } else if (UNEXPECTED(Z_ISREF_P(retval))) {
+ zend_unwrap_reference(retval);
}
} while (0);
+fetch_obj_r_finish:
+
zval_ptr_dtor_nogc(free_op1);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
@@ -13638,7 +14510,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_CONST
break;
}
}
- goto fetch_obj_is_no_object;
+ ZVAL_NULL(EX_VAR(opline->result.var));
+ goto fetch_obj_is_finish;
} while (0);
}
@@ -13656,8 +14529,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_CONST
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;
+ if (0 || ((IS_TMP_VAR|IS_VAR) & (IS_TMP_VAR|IS_VAR)) != 0) {
+ goto fetch_obj_is_copy;
+ } else {
+fetch_obj_is_fast_copy:
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
+ ZEND_VM_NEXT_OPCODE();
+ }
}
} else if (EXPECTED(zobj->properties != NULL)) {
if (!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET(prop_offset)) {
@@ -13671,8 +14549,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_CONST
(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;
+ retval = &p->val;
+ if (0 || ((IS_TMP_VAR|IS_VAR) & (IS_TMP_VAR|IS_VAR)) != 0) {
+ goto fetch_obj_is_copy;
+ } else {
+ goto fetch_obj_is_fast_copy;
+ }
}
}
CACHE_PTR_EX(cache_slot + 1, (void*)ZEND_DYNAMIC_PROPERTY_OFFSET);
@@ -13681,26 +14563,28 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_CONST
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 (0 || ((IS_TMP_VAR|IS_VAR) & (IS_TMP_VAR|IS_VAR)) != 0) {
+ goto fetch_obj_is_copy;
+ } else {
+ goto fetch_obj_is_fast_copy;
+ }
}
}
}
}
- 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));
+ 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);
- }
+ if (retval != EX_VAR(opline->result.var)) {
+fetch_obj_is_copy:
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
+ } else if (UNEXPECTED(Z_ISREF_P(retval))) {
+ zend_unwrap_reference(retval);
}
} while (0);
+fetch_obj_is_finish:
+
zval_ptr_dtor_nogc(free_op1);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
@@ -13727,14 +14611,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FAST_CONCAT_SPEC_TMPVAR_CONST_
} else {
ZVAL_STR(EX_VAR(opline->result.var), op2_str);
}
- zval_ptr_dtor_nogc(free_op1);
+ if ((IS_TMP_VAR|IS_VAR) & (IS_TMP_VAR|IS_VAR)) {
+ zend_string_release_ex(op1_str, 0);
+ }
} 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 {
ZVAL_STR(EX_VAR(opline->result.var), op1_str);
}
-
+ if (IS_CONST & (IS_TMP_VAR|IS_VAR)) {
+ zend_string_release_ex(op2_str, 0);
+ }
} 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);
@@ -13742,14 +14630,20 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FAST_CONCAT_SPEC_TMPVAR_CONST_
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);
-
+ if (IS_CONST & (IS_TMP_VAR|IS_VAR)) {
+ zend_string_release_ex(op2_str, 0);
+ }
} 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);
-
+ if ((IS_TMP_VAR|IS_VAR) & (IS_TMP_VAR|IS_VAR)) {
+ zend_string_release_ex(op1_str, 0);
+ }
+ if (IS_CONST & (IS_TMP_VAR|IS_VAR)) {
+ zend_string_release_ex(op2_str, 0);
+ }
}
ZEND_VM_NEXT_OPCODE();
}
@@ -13761,7 +14655,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FAST_CONCAT_SPEC_TMPVAR_CONST_
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);
+ ZVAL_UNDEFINED_OP1();
}
op1_str = zval_get_string_func(op1);
}
@@ -13771,7 +14665,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FAST_CONCAT_SPEC_TMPVAR_CONST_
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);
+ ZVAL_UNDEFINED_OP2();
}
op2_str = zval_get_string_func(op2);
}
@@ -13849,7 +14743,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_C
break;
}
} else if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(function_name) == IS_UNDEF)) {
- GET_OP2_UNDEF_CV(function_name, BP_VAR_R);
+ ZVAL_UNDEFINED_OP2();
if (UNEXPECTED(EG(exception) != NULL)) {
zval_ptr_dtor_nogc(free_op1);
HANDLE_EXCEPTION();
@@ -13872,7 +14766,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_C
}
}
if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
- object = GET_OP1_UNDEF_CV(object, BP_VAR_R);
+ object = ZVAL_UNDEFINED_OP1();
if (UNEXPECTED(EG(exception) != NULL)) {
if (IS_CONST != IS_CONST) {
@@ -13900,13 +14794,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_C
} 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_CONST == IS_CONST) {
function_name = RT_CONSTANT(opline, opline->op2);
}
@@ -13931,7 +14818,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_C
/* Reset "object" to trigger reference counting */
object = NULL;
}
- if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
+ if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!RUN_TIME_CACHE(&fbc->op_array))) {
init_func_run_time_cache(&fbc->op_array);
}
}
@@ -13940,27 +14827,29 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_C
}
- call_info = ZEND_CALL_NESTED_FUNCTION;
+ call_info = ZEND_CALL_NESTED_FUNCTION | ZEND_CALL_HAS_THIS;
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();
}
+ /* call static method */
+ obj = (zend_object*)called_scope;
+ call_info = ZEND_CALL_NESTED_FUNCTION;
} 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);
}
+ /* CV may be changed indirectly (e.g. when it's a reference) */
+ call_info = ZEND_CALL_NESTED_FUNCTION | ZEND_CALL_HAS_THIS | ZEND_CALL_RELEASE_THIS;
}
call = zend_vm_stack_push_call_frame(call_info,
- fbc, opline->extended_value, called_scope, obj);
+ fbc, opline->extended_value, obj);
call->prev_execute_data = EX(call);
EX(call) = call;
@@ -13971,187 +14860,56 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CASE_SPEC_TMPVAR_CONST_HANDLER
{
USE_OPLINE
zend_free_op free_op1;
- zval *op1, *op2, *result;
+ zval *op1, *op2;
+ double d1, d2;
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));
-
+ if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_LVAL_P(op1) == Z_LVAL_P(op2))) {
+case_true:
+ ZEND_VM_SMART_BRANCH_TRUE();
+ ZVAL_TRUE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
} else {
- break;
+case_false:
+ ZEND_VM_SMART_BRANCH_FALSE();
+ ZVAL_FALSE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
}
- } else {
- break;
+ } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ d1 = (double)Z_LVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+ goto case_double;
}
- 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_free_op free_op1;
-
- SAVE_OPLINE();
-
- 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_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
- if (UNEXPECTED(ce == NULL)) {
- ZEND_ASSERT(EG(exception));
- zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
- HANDLE_EXCEPTION();
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+case_double:
+ if (d1 == d2) {
+ goto case_true;
+ } else {
+ goto case_false;
}
- /*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));
- 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);
+ } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = (double)Z_LVAL_P(op2);
+ goto case_double;
}
- 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_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;
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
+ if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
+ int result = zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2));
- 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();
- }
- if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
- CACHE_PTR(opline->extended_value & ~ZEND_ISEMPTY, ce);
- }
- }
- } else {
- if (IS_CONST == IS_UNUSED) {
- ce = zend_fetch_class(NULL, opline->op2.num);
- if (UNEXPECTED(ce == NULL)) {
- ZEND_ASSERT(EG(exception));
- zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
+ if (result) {
+ goto case_true;
+ } else {
+ goto case_false;
}
- } 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();
+ ZEND_VM_TAIL_CALL(zend_case_helper_SPEC(op1, op2 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
@@ -14198,6 +14956,14 @@ num_index_prop:
/* > 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);
+
+ if ((IS_TMP_VAR|IS_VAR) & (IS_CONST|IS_CV)) {
+ /* avoid exception check */
+
+ ZEND_VM_SMART_BRANCH(result, 0);
+ ZVAL_BOOL(EX_VAR(opline->result.var), result);
+ ZEND_VM_NEXT_OPCODE();
+ }
} else {
result = (value == NULL || !i_zend_is_true(value));
}
@@ -14248,21 +15014,20 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TM
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;
+ result = (opline->extended_value & ZEND_ISEMPTY);
+ goto isset_object_finish;
}
} else {
- goto isset_no_object;
+ result = (opline->extended_value & ZEND_ISEMPTY);
+ goto isset_object_finish;
}
}
- 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));
- }
+
+ 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));
+
+isset_object_finish:
zval_ptr_dtor_nogc(free_op1);
ZEND_VM_SMART_BRANCH(result, 1);
@@ -14270,6 +15035,41 @@ isset_no_object:
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ARRAY_KEY_EXISTS_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+
+ zend_free_op free_op1;
+ zval *key, *subject;
+ HashTable *ht;
+ uint32_t result;
+
+ SAVE_OPLINE();
+
+ key = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ subject = RT_CONSTANT(opline, opline->op2);
+
+ if (EXPECTED(Z_TYPE_P(subject) == IS_ARRAY)) {
+array_key_exists_array:
+ ht = Z_ARRVAL_P(subject);
+ result = zend_array_key_exists_fast(ht, key OPLINE_CC EXECUTE_DATA_CC);
+ } else {
+ if ((IS_CONST & (IS_VAR|IS_CV)) && EXPECTED(Z_ISREF_P(subject))) {
+ subject = Z_REFVAL_P(subject);
+ if (EXPECTED(Z_TYPE_P(subject) == IS_ARRAY)) {
+ goto array_key_exists_array;
+ }
+ }
+ result = zend_array_key_exists_slow(subject, key OPLINE_CC EXECUTE_DATA_CC);
+ }
+
+ zval_ptr_dtor_nogc(free_op1);
+ ZEND_VM_SMART_BRANCH(result == IS_TRUE, 1);
+ Z_TYPE_INFO_P(EX_VAR(opline->result.var)) = result;
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+}
+
+/* No specialization for op_types (CONST|TMPVAR|UNUSED|CV, ANY) */
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INSTANCEOF_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -14287,7 +15087,7 @@ try_instanceof:
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);
+ ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op2)), Z_STR_P(RT_CONSTANT(opline, opline->op2) + 1), ZEND_FETCH_CLASS_NO_AUTOLOAD);
if (EXPECTED(ce)) {
CACHE_PTR(opline->extended_value, ce);
}
@@ -14309,7 +15109,7 @@ try_instanceof:
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);
+ ZVAL_UNDEFINED_OP1();
}
result = 0;
}
@@ -14425,138 +15225,6 @@ fetch_dim_r_index_undef:
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-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;
-
- 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();
- 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();
- }
- } 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
@@ -14572,98 +15240,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DIV_SPEC_TMPVAR_TMPVAR_HANDLER
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));
- }
- 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);
- }
- 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
@@ -14700,14 +15276,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CONCAT_SPEC_TMPVAR_TMPVAR_HAND
} else {
ZVAL_STR(EX_VAR(opline->result.var), op2_str);
}
- zval_ptr_dtor_nogc(free_op1);
+ if ((IS_TMP_VAR|IS_VAR) & (IS_TMP_VAR|IS_VAR)) {
+ zend_string_release_ex(op1_str, 0);
+ }
} 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);
+ if ((IS_TMP_VAR|IS_VAR) & (IS_TMP_VAR|IS_VAR)) {
+ zend_string_release_ex(op2_str, 0);
+ }
} 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);
@@ -14715,24 +15295,30 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CONCAT_SPEC_TMPVAR_TMPVAR_HAND
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);
+ if ((IS_TMP_VAR|IS_VAR) & (IS_TMP_VAR|IS_VAR)) {
+ zend_string_release_ex(op2_str, 0);
+ }
} 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);
+ if ((IS_TMP_VAR|IS_VAR) & (IS_TMP_VAR|IS_VAR)) {
+ zend_string_release_ex(op1_str, 0);
+ }
+ if ((IS_TMP_VAR|IS_VAR) & (IS_TMP_VAR|IS_VAR)) {
+ zend_string_release_ex(op2_str, 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);
+ op1 = ZVAL_UNDEFINED_OP1();
}
if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
- op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
+ op2 = ZVAL_UNDEFINED_OP2();
}
concat_function(EX_VAR(opline->result.var), op1, op2);
zval_ptr_dtor_nogc(free_op1);
@@ -14745,309 +15331,390 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_TMPVAR_TMPVAR_HA
{
USE_OPLINE
zend_free_op free_op1, free_op2;
- zval *op1, *op2, *result;
+ zval *op1, *op2;
+ double d1, d2;
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));
+ if (1 && (IS_TMP_VAR|IS_VAR) == IS_CONST && (IS_TMP_VAR|IS_VAR) == IS_CONST) {
+ /* pass */
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_LVAL_P(op1) == Z_LVAL_P(op2))) {
+is_equal_true:
+
+ ZVAL_TRUE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
} else {
- break;
+is_equal_false:
+
+ ZVAL_FALSE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
}
- } 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 if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ d1 = (double)Z_LVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+ goto is_equal_double;
+ }
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+is_equal_double:
+ if (d1 == d2) {
+ goto is_equal_true;
} else {
- break;
+ goto is_equal_false;
}
- } 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 if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = (double)Z_LVAL_P(op2);
+ goto is_equal_double;
+ }
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
+ if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
+ int result = zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2));
+ if ((IS_TMP_VAR|IS_VAR) & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_str(op1);
+ }
+ if ((IS_TMP_VAR|IS_VAR) & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_str(op2);
+ }
+ if (result) {
+ goto is_equal_true;
} else {
- break;
+ goto is_equal_false;
}
- } 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_op1);
- zval_ptr_dtor_nogc(free_op2);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+ ZEND_VM_TAIL_CALL(zend_is_equal_helper_SPEC(op1, op2 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-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_IS_EQUAL_SPEC_TMPVAR_TMPVAR_JMPZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zend_free_op free_op1, free_op2;
- zval *op1, *op2, *result;
+ zval *op1, *op2;
+ double d1, d2;
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));
+ if (1 && (IS_TMP_VAR|IS_VAR) == IS_CONST && (IS_TMP_VAR|IS_VAR) == IS_CONST) {
+ /* pass */
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_LVAL_P(op1) == Z_LVAL_P(op2))) {
+is_equal_true:
+ ZEND_VM_SMART_BRANCH_TRUE_JMPZ();
+ ZVAL_TRUE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
} else {
- break;
+is_equal_false:
+ ZEND_VM_SMART_BRANCH_FALSE_JMPZ();
+ ZVAL_FALSE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
}
- } 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 if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ d1 = (double)Z_LVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+ goto is_equal_double;
+ }
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+is_equal_double:
+ if (d1 == d2) {
+ goto is_equal_true;
} else {
- break;
+ goto is_equal_false;
}
- } 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 if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = (double)Z_LVAL_P(op2);
+ goto is_equal_double;
+ }
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
+ if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
+ int result = zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2));
+ if ((IS_TMP_VAR|IS_VAR) & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_str(op1);
+ }
+ if ((IS_TMP_VAR|IS_VAR) & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_str(op2);
+ }
+ if (result) {
+ goto is_equal_true;
} else {
- break;
+ goto is_equal_false;
}
- } 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_op1);
- zval_ptr_dtor_nogc(free_op2);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+ ZEND_VM_TAIL_CALL(zend_is_equal_helper_SPEC(op1, op2 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_TMPVAR_TMPVAR_JMPNZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zend_free_op free_op1, free_op2;
- zval *op1, *op2, *result;
+ zval *op1, *op2;
+ double d1, d2;
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));
+ if (1 && (IS_TMP_VAR|IS_VAR) == IS_CONST && (IS_TMP_VAR|IS_VAR) == IS_CONST) {
+ /* pass */
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_LVAL_P(op1) == Z_LVAL_P(op2))) {
+is_equal_true:
+ ZEND_VM_SMART_BRANCH_TRUE_JMPNZ();
+ ZVAL_TRUE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
} else {
- break;
+is_equal_false:
+ ZEND_VM_SMART_BRANCH_FALSE_JMPNZ();
+ ZVAL_FALSE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
}
- } 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 if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ d1 = (double)Z_LVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+ goto is_equal_double;
+ }
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+is_equal_double:
+ if (d1 == d2) {
+ goto is_equal_true;
} else {
- break;
+ goto is_equal_false;
+ }
+ } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = (double)Z_LVAL_P(op2);
+ goto is_equal_double;
+ }
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
+ if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
+ int result = zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2));
+ if ((IS_TMP_VAR|IS_VAR) & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_str(op1);
+ }
+ if ((IS_TMP_VAR|IS_VAR) & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_str(op2);
+ }
+ if (result) {
+ goto is_equal_true;
+ } else {
+ goto is_equal_false;
}
- } 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();
+ ZEND_VM_TAIL_CALL(zend_is_equal_helper_SPEC(op1, op2 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-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_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 *op1, *op2;
+ double d1, d2;
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 (1 && (IS_TMP_VAR|IS_VAR) == IS_CONST && (IS_TMP_VAR|IS_VAR) == IS_CONST) {
+ /* pass */
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_LVAL_P(op1) != Z_LVAL_P(op2))) {
+is_not_equal_true:
+
+ ZVAL_TRUE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
+ } else {
+is_not_equal_false:
- 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));
+ ZVAL_FALSE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
+ }
+ } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ d1 = (double)Z_LVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+ goto is_not_equal_double;
+ }
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+is_not_equal_double:
+ if (d1 != d2) {
+ goto is_not_equal_true;
} else {
- break;
+ goto is_not_equal_false;
}
- } 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 if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = (double)Z_LVAL_P(op2);
+ goto is_not_equal_double;
+ }
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
+ if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
+ int result = zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2));
+ if ((IS_TMP_VAR|IS_VAR) & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_str(op1);
+ }
+ if ((IS_TMP_VAR|IS_VAR) & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_str(op2);
+ }
+ if (!result) {
+ goto is_not_equal_true;
} else {
- break;
+ goto is_not_equal_false;
}
- } 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();
+ ZEND_VM_TAIL_CALL(zend_is_not_equal_helper_SPEC(op1, op2 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_OR_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_TMPVAR_JMPZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zend_free_op free_op1, free_op2;
zval *op1, *op2;
+ double d1, d2;
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);
+ if (1 && (IS_TMP_VAR|IS_VAR) == IS_CONST && (IS_TMP_VAR|IS_VAR) == IS_CONST) {
+ /* pass */
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_LVAL_P(op1) != Z_LVAL_P(op2))) {
+is_not_equal_true:
+ ZEND_VM_SMART_BRANCH_TRUE_JMPZ();
+ ZVAL_TRUE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
+ } else {
+is_not_equal_false:
+ ZEND_VM_SMART_BRANCH_FALSE_JMPZ();
+ ZVAL_FALSE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
+ }
+ } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ d1 = (double)Z_LVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+ goto is_not_equal_double;
+ }
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+is_not_equal_double:
+ if (d1 != d2) {
+ goto is_not_equal_true;
+ } else {
+ goto is_not_equal_false;
+ }
+ } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = (double)Z_LVAL_P(op2);
+ goto is_not_equal_double;
+ }
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
+ if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
+ int result = zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2));
+ if ((IS_TMP_VAR|IS_VAR) & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_str(op1);
+ }
+ if ((IS_TMP_VAR|IS_VAR) & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_str(op2);
+ }
+ if (!result) {
+ goto is_not_equal_true;
+ } else {
+ goto is_not_equal_false;
+ }
+ }
}
- 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();
+ ZEND_VM_TAIL_CALL(zend_is_not_equal_helper_SPEC(op1, op2 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-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_IS_NOT_EQUAL_SPEC_TMPVAR_TMPVAR_JMPNZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zend_free_op free_op1, free_op2;
zval *op1, *op2;
+ double d1, d2;
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);
+ if (1 && (IS_TMP_VAR|IS_VAR) == IS_CONST && (IS_TMP_VAR|IS_VAR) == IS_CONST) {
+ /* pass */
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_LVAL_P(op1) != Z_LVAL_P(op2))) {
+is_not_equal_true:
+ ZEND_VM_SMART_BRANCH_TRUE_JMPNZ();
+ ZVAL_TRUE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
+ } else {
+is_not_equal_false:
+ ZEND_VM_SMART_BRANCH_FALSE_JMPNZ();
+ ZVAL_FALSE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
+ }
+ } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ d1 = (double)Z_LVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+ goto is_not_equal_double;
+ }
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+is_not_equal_double:
+ if (d1 != d2) {
+ goto is_not_equal_true;
+ } else {
+ goto is_not_equal_false;
+ }
+ } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = (double)Z_LVAL_P(op2);
+ goto is_not_equal_double;
+ }
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
+ if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
+ int result = zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2));
+ if ((IS_TMP_VAR|IS_VAR) & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_str(op1);
+ }
+ if ((IS_TMP_VAR|IS_VAR) & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_str(op2);
+ }
+ if (!result) {
+ goto is_not_equal_true;
+ } else {
+ goto is_not_equal_false;
+ }
+ }
}
- 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();
+ ZEND_VM_TAIL_CALL(zend_is_not_equal_helper_SPEC(op1, op2 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_XOR_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+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);
- 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);
+ 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();
@@ -15072,7 +15739,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_R_SPEC_TMPVAR_TMPVAR
{
USE_OPLINE
zend_free_op free_op1, free_op2;
- zval *container, *dim, *value, *result;
+ zval *container, *dim, *value;
SAVE_OPLINE();
container = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
@@ -15081,8 +15748,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_R_SPEC_TMPVAR_TMPVAR
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);
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value);
} else if (EXPECTED(Z_TYPE_P(container) == IS_REFERENCE)) {
container = Z_REFVAL_P(container);
if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
@@ -15147,12 +15813,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMPVAR_TMPVAR
}
}
if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
- GET_OP1_UNDEF_CV(container, BP_VAR_R);
+ ZVAL_UNDEFINED_OP1();
}
if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(offset) == IS_UNDEF)) {
- GET_OP2_UNDEF_CV(offset, BP_VAR_R);
+ ZVAL_UNDEFINED_OP2();
}
- goto fetch_obj_r_no_object;
+ zend_wrong_property_read(offset);
+ ZVAL_NULL(EX_VAR(opline->result.var));
+ goto fetch_obj_r_finish;
} while (0);
}
@@ -15162,7 +15830,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMPVAR_TMPVAR
zval *retval;
if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
- cache_slot = CACHE_ADDR(opline->extended_value);
+ cache_slot = CACHE_ADDR(opline->extended_value & ~ZEND_FETCH_REF /* FUNC_ARG fetch may contain it */);
if (EXPECTED(zobj->ce == CACHED_PTR_EX(cache_slot))) {
uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1);
@@ -15170,8 +15838,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMPVAR_TMPVAR
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;
+ if (0 || ((IS_TMP_VAR|IS_VAR) & (IS_TMP_VAR|IS_VAR)) != 0) {
+ goto fetch_obj_r_copy;
+ } else {
+fetch_obj_r_fast_copy:
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
+ ZEND_VM_NEXT_OPCODE();
+ }
}
} else if (EXPECTED(zobj->properties != NULL)) {
if (!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET(prop_offset)) {
@@ -15185,8 +15858,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMPVAR_TMPVAR
(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;
+ retval = &p->val;
+ if (0 || ((IS_TMP_VAR|IS_VAR) & (IS_TMP_VAR|IS_VAR)) != 0) {
+ goto fetch_obj_r_copy;
+ } else {
+ goto fetch_obj_r_fast_copy;
+ }
}
}
CACHE_PTR_EX(cache_slot + 1, (void*)ZEND_DYNAMIC_PROPERTY_OFFSET);
@@ -15195,30 +15872,29 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMPVAR_TMPVAR
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;
+ if (0 || ((IS_TMP_VAR|IS_VAR) & (IS_TMP_VAR|IS_VAR)) != 0) {
+ goto fetch_obj_r_copy;
+ } else {
+ goto fetch_obj_r_fast_copy;
+ }
}
}
}
} 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);
+ ZVAL_UNDEFINED_OP2();
}
- 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));
+ 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);
- }
+ if (retval != EX_VAR(opline->result.var)) {
+fetch_obj_r_copy:
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
+ } else if (UNEXPECTED(Z_ISREF_P(retval))) {
+ zend_unwrap_reference(retval);
}
} while (0);
+fetch_obj_r_finish:
zval_ptr_dtor_nogc(free_op2);
zval_ptr_dtor_nogc(free_op1);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
@@ -15251,7 +15927,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_TMPVA
break;
}
}
- goto fetch_obj_is_no_object;
+ ZVAL_NULL(EX_VAR(opline->result.var));
+ goto fetch_obj_is_finish;
} while (0);
}
@@ -15269,8 +15946,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_TMPVA
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;
+ if (0 || ((IS_TMP_VAR|IS_VAR) & (IS_TMP_VAR|IS_VAR)) != 0) {
+ goto fetch_obj_is_copy;
+ } else {
+fetch_obj_is_fast_copy:
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
+ ZEND_VM_NEXT_OPCODE();
+ }
}
} else if (EXPECTED(zobj->properties != NULL)) {
if (!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET(prop_offset)) {
@@ -15284,8 +15966,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_TMPVA
(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;
+ retval = &p->val;
+ if (0 || ((IS_TMP_VAR|IS_VAR) & (IS_TMP_VAR|IS_VAR)) != 0) {
+ goto fetch_obj_is_copy;
+ } else {
+ goto fetch_obj_is_fast_copy;
+ }
}
}
CACHE_PTR_EX(cache_slot + 1, (void*)ZEND_DYNAMIC_PROPERTY_OFFSET);
@@ -15294,26 +15980,27 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_TMPVA
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 (0 || ((IS_TMP_VAR|IS_VAR) & (IS_TMP_VAR|IS_VAR)) != 0) {
+ goto fetch_obj_is_copy;
+ } else {
+ goto fetch_obj_is_fast_copy;
+ }
}
}
}
}
- 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));
+ 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);
- }
+ if (retval != EX_VAR(opline->result.var)) {
+fetch_obj_is_copy:
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
+ } else if (UNEXPECTED(Z_ISREF_P(retval))) {
+ zend_unwrap_reference(retval);
}
} while (0);
+fetch_obj_is_finish:
zval_ptr_dtor_nogc(free_op2);
zval_ptr_dtor_nogc(free_op1);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
@@ -15341,14 +16028,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FAST_CONCAT_SPEC_TMPVAR_TMPVAR
} else {
ZVAL_STR(EX_VAR(opline->result.var), op2_str);
}
- zval_ptr_dtor_nogc(free_op1);
+ if ((IS_TMP_VAR|IS_VAR) & (IS_TMP_VAR|IS_VAR)) {
+ zend_string_release_ex(op1_str, 0);
+ }
} 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);
+ if ((IS_TMP_VAR|IS_VAR) & (IS_TMP_VAR|IS_VAR)) {
+ zend_string_release_ex(op2_str, 0);
+ }
} 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);
@@ -15356,14 +16047,20 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FAST_CONCAT_SPEC_TMPVAR_TMPVAR
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);
+ if ((IS_TMP_VAR|IS_VAR) & (IS_TMP_VAR|IS_VAR)) {
+ zend_string_release_ex(op2_str, 0);
+ }
} 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);
+ if ((IS_TMP_VAR|IS_VAR) & (IS_TMP_VAR|IS_VAR)) {
+ zend_string_release_ex(op1_str, 0);
+ }
+ if ((IS_TMP_VAR|IS_VAR) & (IS_TMP_VAR|IS_VAR)) {
+ zend_string_release_ex(op2_str, 0);
+ }
}
ZEND_VM_NEXT_OPCODE();
}
@@ -15375,7 +16072,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FAST_CONCAT_SPEC_TMPVAR_TMPVAR
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);
+ ZVAL_UNDEFINED_OP1();
}
op1_str = zval_get_string_func(op1);
}
@@ -15385,7 +16082,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FAST_CONCAT_SPEC_TMPVAR_TMPVAR
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);
+ ZVAL_UNDEFINED_OP2();
}
op2_str = zval_get_string_func(op2);
}
@@ -15463,7 +16160,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_T
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);
+ ZVAL_UNDEFINED_OP2();
if (UNEXPECTED(EG(exception) != NULL)) {
zval_ptr_dtor_nogc(free_op1);
HANDLE_EXCEPTION();
@@ -15486,7 +16183,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_T
}
}
if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
- object = GET_OP1_UNDEF_CV(object, BP_VAR_R);
+ object = ZVAL_UNDEFINED_OP1();
if (UNEXPECTED(EG(exception) != NULL)) {
if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
zval_ptr_dtor_nogc(free_op2);
@@ -15514,13 +16211,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_T
} 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_TMP_VAR|IS_VAR) == IS_CONST) {
function_name = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
}
@@ -15545,7 +16235,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_T
/* Reset "object" to trigger reference counting */
object = NULL;
}
- if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
+ if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!RUN_TIME_CACHE(&fbc->op_array))) {
init_func_run_time_cache(&fbc->op_array);
}
}
@@ -15554,27 +16244,29 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_T
zval_ptr_dtor_nogc(free_op2);
}
- call_info = ZEND_CALL_NESTED_FUNCTION;
+ call_info = ZEND_CALL_NESTED_FUNCTION | ZEND_CALL_HAS_THIS;
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();
}
+ /* call static method */
+ obj = (zend_object*)called_scope;
+ call_info = ZEND_CALL_NESTED_FUNCTION;
} 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);
}
+ /* CV may be changed indirectly (e.g. when it's a reference) */
+ call_info = ZEND_CALL_NESTED_FUNCTION | ZEND_CALL_HAS_THIS | ZEND_CALL_RELEASE_THIS;
}
call = zend_vm_stack_push_call_frame(call_info,
- fbc, opline->extended_value, called_scope, obj);
+ fbc, opline->extended_value, obj);
call->prev_execute_data = EX(call);
EX(call) = call;
@@ -15585,56 +16277,56 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CASE_SPEC_TMPVAR_TMPVAR_HANDLE
{
USE_OPLINE
zend_free_op free_op1, free_op2;
- zval *op1, *op2, *result;
+ zval *op1, *op2;
+ double d1, d2;
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));
+ if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_LVAL_P(op1) == Z_LVAL_P(op2))) {
+case_true:
+ ZEND_VM_SMART_BRANCH_TRUE();
+ ZVAL_TRUE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
} else {
- break;
+case_false:
+ ZEND_VM_SMART_BRANCH_FALSE();
+ ZVAL_FALSE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
}
- } 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 if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ d1 = (double)Z_LVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+ goto case_double;
+ }
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+case_double:
+ if (d1 == d2) {
+ goto case_true;
} else {
- break;
+ goto case_false;
}
- } 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 if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = (double)Z_LVAL_P(op2);
+ goto case_double;
+ }
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
+ if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
+ int result = zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2));
+ zval_ptr_dtor_nogc(free_op2);
+ if (result) {
+ goto case_true;
} else {
- break;
+ goto case_false;
}
- } 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();
+ ZEND_VM_TAIL_CALL(zend_case_helper_SPEC(op1, op2 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
@@ -15681,6 +16373,14 @@ num_index_prop:
/* > 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);
+
+ if ((IS_TMP_VAR|IS_VAR) & (IS_CONST|IS_CV)) {
+ /* avoid exception check */
+ zval_ptr_dtor_nogc(free_op2);
+ ZEND_VM_SMART_BRANCH(result, 0);
+ ZVAL_BOOL(EX_VAR(opline->result.var), result);
+ ZEND_VM_NEXT_OPCODE();
+ }
} else {
result = (value == NULL || !i_zend_is_true(value));
}
@@ -15731,22 +16431,20 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TM
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;
+ result = (opline->extended_value & ZEND_ISEMPTY);
+ goto isset_object_finish;
}
} else {
- goto isset_no_object;
+ result = (opline->extended_value & ZEND_ISEMPTY);
+ goto isset_object_finish;
}
}
- 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));
- }
+ 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));
+
+isset_object_finish:
zval_ptr_dtor_nogc(free_op2);
zval_ptr_dtor_nogc(free_op1);
ZEND_VM_SMART_BRANCH(result, 1);
@@ -15754,263 +16452,42 @@ isset_no_object:
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_TMPVAR_VAR(int type ZEND_OPCODE_HANDLER_ARGS_DC)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ARRAY_KEY_EXISTS_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zend_free_op free_op1;
- zval *varname;
- zval *retval;
- zend_string *name, *tmp_name;
- zend_class_entry *ce;
-
- 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 {
- 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;
- }
- }
-
- 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_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;
+ zend_free_op free_op1, free_op2;
+ zval *key, *subject;
+ HashTable *ht;
+ uint32_t result;
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));
- 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_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC_TMPVAR_VAR_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;
+ key = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ subject = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
- 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);
- }
- }
+ if (EXPECTED(Z_TYPE_P(subject) == IS_ARRAY)) {
+array_key_exists_array:
+ ht = Z_ARRVAL_P(subject);
+ result = zend_array_key_exists_fast(ht, key OPLINE_CC EXECUTE_DATA_CC);
} 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();
+ if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_CV)) && EXPECTED(Z_ISREF_P(subject))) {
+ subject = Z_REFVAL_P(subject);
+ if (EXPECTED(Z_TYPE_P(subject) == IS_ARRAY)) {
+ goto array_key_exists_array;
}
- } 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);
+ result = zend_array_key_exists_slow(subject, key OPLINE_CC EXECUTE_DATA_CC);
}
- if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
- zend_tmp_string_release(tmp_name);
- }
+ zval_ptr_dtor_nogc(free_op2);
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_SMART_BRANCH(result == IS_TRUE, 1);
+ Z_TYPE_INFO_P(EX_VAR(opline->result.var)) = result;
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
+/* No specialization for op_types (CONST|TMPVAR|UNUSED|CV, ANY) */
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INSTANCEOF_SPEC_TMPVAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -16028,7 +16505,7 @@ try_instanceof:
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);
+ ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op2)), Z_STR_P(RT_CONSTANT(opline, opline->op2) + 1), ZEND_FETCH_CLASS_NO_AUTOLOAD);
if (EXPECTED(ce)) {
CACHE_PTR(opline->extended_value, ce);
}
@@ -16050,7 +16527,7 @@ try_instanceof:
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);
+ ZVAL_UNDEFINED_OP1();
}
result = 0;
}
@@ -16060,7 +16537,7 @@ try_instanceof:
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_TMPVAR_UNUSED(int type ZEND_OPCODE_HANDLER_ARGS_DC)
+static zend_never_inline ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_TMPVAR_UNUSED(int type ZEND_OPCODE_HANDLER_ARGS_DC)
{
USE_OPLINE
zend_free_op free_op1;
@@ -16079,9 +16556,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_
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);
+ ZVAL_UNDEFINED_OP1();
+ }
+ name = zval_try_get_tmp_string(varname, &tmp_name);
+ if (UNEXPECTED(!name)) {
+ zval_ptr_dtor_nogc(free_op1);
+ ZVAL_UNDEF(EX_VAR(opline->result.var));
+ HANDLE_EXCEPTION();
}
- name = zval_get_tmp_string(varname, &tmp_name);
}
target_symbol_table = zend_get_target_symbol_table(opline->extended_value EXECUTE_DATA_CC);
@@ -16179,132 +16661,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_IS_SPEC_TMPVAR_UNUSED_HA
ZEND_VM_TAIL_CALL(zend_fetch_var_address_helper_SPEC_TMPVAR_UNUSED(BP_VAR_IS 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)
-{
- USE_OPLINE
- zend_free_op free_op1;
- zval *varname;
- zval *retval;
- zend_string *name, *tmp_name;
- zend_class_entry *ce;
-
- 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_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_STATIC_PROP_R_SPEC_TMPVAR_UNUSED_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));
-}
-
-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_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));
-}
-
+/* No specialization for op_types (CONST|TMPVAR|CV, UNUSED|CONST|VAR) */
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_VAR_SPEC_TMPVAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -16324,67 +16681,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_VAR_SPEC_TMPVAR_UNUSED_H
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_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_STATIC_PROP_SPEC_TMPVAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zval *varname;
- zend_string *name, *tmp_name;
- zend_class_entry *ce;
- zend_free_op free_op1;
-
- SAVE_OPLINE();
-
- 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);*/
+ varname = ZVAL_UNDEFINED_OP1();
}
- } 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));
+ name = zval_try_get_tmp_string(varname, &tmp_name);
+ if (UNEXPECTED(!name)) {
+ zval_ptr_dtor_nogc(free_op1);
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);
+ 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);
@@ -16393,6 +16700,7 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_STATIC_PROP
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
+/* No specialization for op_types (CONST|TMPVAR|CV, UNUSED|CLASS_FETCH|CONST|VAR) */
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_TMPVAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -16440,83 +16748,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_TMPVAR_
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC_TMPVAR_UNUSED_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_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_CHECK_EXCEPTION();
-}
-
+/* No specialization for op_types (CONST|TMPVAR|CV, UNUSED|CLASS_FETCH|CONST|VAR) */
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INSTANCEOF_SPEC_TMPVAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -16534,7 +16766,7 @@ try_instanceof:
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);
+ ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op2)), Z_STR_P(RT_CONSTANT(opline, opline->op2) + 1), ZEND_FETCH_CLASS_NO_AUTOLOAD);
if (EXPECTED(ce)) {
CACHE_PTR(opline->extended_value, ce);
}
@@ -16556,7 +16788,7 @@ try_instanceof:
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);
+ ZVAL_UNDEFINED_OP1();
}
result = 0;
}
@@ -16566,194 +16798,123 @@ try_instanceof:
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-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_COUNT_SPEC_TMPVAR_UNUSED_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_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);
- 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;
+ zend_long count;
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);
+ op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ while (1) {
+ 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 (UNEXPECTED(EG(exception))) {
+ count = 0;
+ break;
+ }
+ }
- ZEND_VM_NEXT_OPCODE_CHECK_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;
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SUB_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1;
- zval *op1, *op2, *result;
+ zend_call_method_with_0_params(op1, NULL, NULL, "count", &retval);
+ count = zval_get_long(&retval);
+ zval_ptr_dtor(&retval);
+ break;
+ }
- op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- 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);
- 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();
+ /* If There's no handler and it doesn't implement Countable then add a warning */
+ count = 1;
+ } else if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_CV)) != 0 && Z_TYPE_P(op1) == IS_REFERENCE) {
+ op1 = Z_REFVAL_P(op1);
+ continue;
+ } else if (Z_TYPE_P(op1) <= IS_NULL) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ ZVAL_UNDEFINED_OP1();
+ }
+ count = 0;
+ } else {
+ count = 1;
}
+ zend_error(E_WARNING, "%s(): Parameter must be an array or an object that implements Countable", opline->extended_value ? "sizeof" : "count");
+ break;
}
- 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_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_DIV_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_GET_CLASS_SPEC_TMPVAR_UNUSED_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);
- 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_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1;
- zval *op1, *op2, *result;
+ if ((IS_TMP_VAR|IS_VAR) == 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 {
+ ZVAL_STR_COPY(EX_VAR(opline->result.var), EX(func)->common.scope->name);
+ ZEND_VM_NEXT_OPCODE();
+ }
+ } else {
+ zend_free_op free_op1;
+ zval *op1;
- op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- 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)) {
- 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);
+ SAVE_OPLINE();
+ op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ while (1) {
+ if (Z_TYPE_P(op1) == IS_OBJECT) {
+ ZVAL_STR_COPY(EX_VAR(opline->result.var), Z_OBJCE_P(op1)->name);
+ } else if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_CV)) != 0 && Z_TYPE_P(op1) == IS_REFERENCE) {
+ op1 = Z_REFVAL_P(op1);
+ continue;
} else {
- ZVAL_LONG(result, Z_LVAL_P(op1) % Z_LVAL_P(op2));
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ ZVAL_UNDEFINED_OP1();
+ }
+ 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));
}
- ZEND_VM_NEXT_OPCODE();
+ break;
}
+ zval_ptr_dtor_nogc(free_op1);
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-
- 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_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SL_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_COPY_TMP_SPEC_TMPVAR_UNUSED_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_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)) {
- 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();
+ zval *value = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ zval *result = EX_VAR(opline->result.var);
+ ZVAL_COPY(result, value);
+ ZEND_VM_NEXT_OPCODE();
}
-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_DIV_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 = 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)) {
- 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_right_function(EX_VAR(opline->result.var), op1, op2);
+ 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);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
@@ -16795,14 +16956,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CONCAT_SPEC_TMPVAR_CV_HANDLER(
} else {
ZVAL_STR(EX_VAR(opline->result.var), op2_str);
}
- zval_ptr_dtor_nogc(free_op1);
+ if ((IS_TMP_VAR|IS_VAR) & (IS_TMP_VAR|IS_VAR)) {
+ zend_string_release_ex(op1_str, 0);
+ }
} 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);
}
-
+ if (IS_CV & (IS_TMP_VAR|IS_VAR)) {
+ zend_string_release_ex(op2_str, 0);
+ }
} 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);
@@ -16810,24 +16975,30 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CONCAT_SPEC_TMPVAR_CV_HANDLER(
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);
-
+ if (IS_CV & (IS_TMP_VAR|IS_VAR)) {
+ zend_string_release_ex(op2_str, 0);
+ }
} 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);
-
+ if ((IS_TMP_VAR|IS_VAR) & (IS_TMP_VAR|IS_VAR)) {
+ zend_string_release_ex(op1_str, 0);
+ }
+ if (IS_CV & (IS_TMP_VAR|IS_VAR)) {
+ zend_string_release_ex(op2_str, 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);
+ op1 = ZVAL_UNDEFINED_OP1();
}
if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
- op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
+ op2 = ZVAL_UNDEFINED_OP2();
}
concat_function(EX_VAR(opline->result.var), op1, op2);
zval_ptr_dtor_nogc(free_op1);
@@ -16836,106 +17007,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CONCAT_SPEC_TMPVAR_CV_HANDLER(
}
}
-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 = EX_VAR(opline->op2.var);
- 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_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;
-
- op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- op2 = EX_VAR(opline->op2.var);
- 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_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SPACESHIP_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -16955,7 +17026,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_R_SPEC_TMPVAR_CV_HAN
{
USE_OPLINE
zend_free_op free_op1;
- zval *container, *dim, *value, *result;
+ zval *container, *dim, *value;
SAVE_OPLINE();
container = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
@@ -16964,8 +17035,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_R_SPEC_TMPVAR_CV_HAN
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);
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value);
} else if (EXPECTED(Z_TYPE_P(container) == IS_REFERENCE)) {
container = Z_REFVAL_P(container);
if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
@@ -17030,12 +17100,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMPVAR_CV_HAN
}
}
if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
- GET_OP1_UNDEF_CV(container, BP_VAR_R);
+ ZVAL_UNDEFINED_OP1();
}
if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(offset) == IS_UNDEF)) {
- GET_OP2_UNDEF_CV(offset, BP_VAR_R);
+ ZVAL_UNDEFINED_OP2();
}
- goto fetch_obj_r_no_object;
+ zend_wrong_property_read(offset);
+ ZVAL_NULL(EX_VAR(opline->result.var));
+ goto fetch_obj_r_finish;
} while (0);
}
@@ -17045,7 +17117,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMPVAR_CV_HAN
zval *retval;
if (IS_CV == IS_CONST) {
- cache_slot = CACHE_ADDR(opline->extended_value);
+ cache_slot = CACHE_ADDR(opline->extended_value & ~ZEND_FETCH_REF /* FUNC_ARG fetch may contain it */);
if (EXPECTED(zobj->ce == CACHED_PTR_EX(cache_slot))) {
uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1);
@@ -17053,8 +17125,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMPVAR_CV_HAN
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;
+ if (0 || ((IS_TMP_VAR|IS_VAR) & (IS_TMP_VAR|IS_VAR)) != 0) {
+ goto fetch_obj_r_copy;
+ } else {
+fetch_obj_r_fast_copy:
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
+ ZEND_VM_NEXT_OPCODE();
+ }
}
} else if (EXPECTED(zobj->properties != NULL)) {
if (!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET(prop_offset)) {
@@ -17068,8 +17145,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMPVAR_CV_HAN
(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;
+ retval = &p->val;
+ if (0 || ((IS_TMP_VAR|IS_VAR) & (IS_TMP_VAR|IS_VAR)) != 0) {
+ goto fetch_obj_r_copy;
+ } else {
+ goto fetch_obj_r_fast_copy;
+ }
}
}
CACHE_PTR_EX(cache_slot + 1, (void*)ZEND_DYNAMIC_PROPERTY_OFFSET);
@@ -17078,30 +17159,30 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMPVAR_CV_HAN
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;
+ if (0 || ((IS_TMP_VAR|IS_VAR) & (IS_TMP_VAR|IS_VAR)) != 0) {
+ goto fetch_obj_r_copy;
+ } else {
+ goto fetch_obj_r_fast_copy;
+ }
}
}
}
} else if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(offset) == IS_UNDEF)) {
- GET_OP2_UNDEF_CV(offset, BP_VAR_R);
+ ZVAL_UNDEFINED_OP2();
}
- 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));
+ 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);
- }
+ if (retval != EX_VAR(opline->result.var)) {
+fetch_obj_r_copy:
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
+ } else if (UNEXPECTED(Z_ISREF_P(retval))) {
+ zend_unwrap_reference(retval);
}
} while (0);
+fetch_obj_r_finish:
+
zval_ptr_dtor_nogc(free_op1);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
@@ -17133,7 +17214,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_CV_HA
break;
}
}
- goto fetch_obj_is_no_object;
+ ZVAL_NULL(EX_VAR(opline->result.var));
+ goto fetch_obj_is_finish;
} while (0);
}
@@ -17151,8 +17233,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_CV_HA
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;
+ if (0 || ((IS_TMP_VAR|IS_VAR) & (IS_TMP_VAR|IS_VAR)) != 0) {
+ goto fetch_obj_is_copy;
+ } else {
+fetch_obj_is_fast_copy:
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
+ ZEND_VM_NEXT_OPCODE();
+ }
}
} else if (EXPECTED(zobj->properties != NULL)) {
if (!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET(prop_offset)) {
@@ -17166,8 +17253,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_CV_HA
(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;
+ retval = &p->val;
+ if (0 || ((IS_TMP_VAR|IS_VAR) & (IS_TMP_VAR|IS_VAR)) != 0) {
+ goto fetch_obj_is_copy;
+ } else {
+ goto fetch_obj_is_fast_copy;
+ }
}
}
CACHE_PTR_EX(cache_slot + 1, (void*)ZEND_DYNAMIC_PROPERTY_OFFSET);
@@ -17176,26 +17267,28 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_CV_HA
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 (0 || ((IS_TMP_VAR|IS_VAR) & (IS_TMP_VAR|IS_VAR)) != 0) {
+ goto fetch_obj_is_copy;
+ } else {
+ goto fetch_obj_is_fast_copy;
+ }
}
}
}
}
- 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));
+ 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);
- }
+ if (retval != EX_VAR(opline->result.var)) {
+fetch_obj_is_copy:
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
+ } else if (UNEXPECTED(Z_ISREF_P(retval))) {
+ zend_unwrap_reference(retval);
}
} while (0);
+fetch_obj_is_finish:
+
zval_ptr_dtor_nogc(free_op1);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
@@ -17222,14 +17315,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FAST_CONCAT_SPEC_TMPVAR_CV_HAN
} else {
ZVAL_STR(EX_VAR(opline->result.var), op2_str);
}
- zval_ptr_dtor_nogc(free_op1);
+ if ((IS_TMP_VAR|IS_VAR) & (IS_TMP_VAR|IS_VAR)) {
+ zend_string_release_ex(op1_str, 0);
+ }
} 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);
}
-
+ if (IS_CV & (IS_TMP_VAR|IS_VAR)) {
+ zend_string_release_ex(op2_str, 0);
+ }
} 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);
@@ -17237,14 +17334,20 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FAST_CONCAT_SPEC_TMPVAR_CV_HAN
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);
-
+ if (IS_CV & (IS_TMP_VAR|IS_VAR)) {
+ zend_string_release_ex(op2_str, 0);
+ }
} 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);
-
+ if ((IS_TMP_VAR|IS_VAR) & (IS_TMP_VAR|IS_VAR)) {
+ zend_string_release_ex(op1_str, 0);
+ }
+ if (IS_CV & (IS_TMP_VAR|IS_VAR)) {
+ zend_string_release_ex(op2_str, 0);
+ }
}
ZEND_VM_NEXT_OPCODE();
}
@@ -17256,7 +17359,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FAST_CONCAT_SPEC_TMPVAR_CV_HAN
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);
+ ZVAL_UNDEFINED_OP1();
}
op1_str = zval_get_string_func(op1);
}
@@ -17266,7 +17369,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FAST_CONCAT_SPEC_TMPVAR_CV_HAN
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);
+ ZVAL_UNDEFINED_OP2();
}
op2_str = zval_get_string_func(op2);
}
@@ -17344,7 +17447,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_C
break;
}
} else if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(function_name) == IS_UNDEF)) {
- GET_OP2_UNDEF_CV(function_name, BP_VAR_R);
+ ZVAL_UNDEFINED_OP2();
if (UNEXPECTED(EG(exception) != NULL)) {
zval_ptr_dtor_nogc(free_op1);
HANDLE_EXCEPTION();
@@ -17367,7 +17470,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_C
}
}
if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
- object = GET_OP1_UNDEF_CV(object, BP_VAR_R);
+ object = ZVAL_UNDEFINED_OP1();
if (UNEXPECTED(EG(exception) != NULL)) {
if (IS_CV != IS_CONST) {
@@ -17395,13 +17498,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_C
} 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);
}
@@ -17426,7 +17522,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_C
/* Reset "object" to trigger reference counting */
object = NULL;
}
- if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
+ if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!RUN_TIME_CACHE(&fbc->op_array))) {
init_func_run_time_cache(&fbc->op_array);
}
}
@@ -17435,27 +17531,29 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_C
}
- call_info = ZEND_CALL_NESTED_FUNCTION;
+ call_info = ZEND_CALL_NESTED_FUNCTION | ZEND_CALL_HAS_THIS;
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();
}
+ /* call static method */
+ obj = (zend_object*)called_scope;
+ call_info = ZEND_CALL_NESTED_FUNCTION;
} 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);
}
+ /* CV may be changed indirectly (e.g. when it's a reference) */
+ call_info = ZEND_CALL_NESTED_FUNCTION | ZEND_CALL_HAS_THIS | ZEND_CALL_RELEASE_THIS;
}
call = zend_vm_stack_push_call_frame(call_info,
- fbc, opline->extended_value, called_scope, obj);
+ fbc, opline->extended_value, obj);
call->prev_execute_data = EX(call);
EX(call) = call;
@@ -17466,56 +17564,56 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CASE_SPEC_TMPVAR_CV_HANDLER(ZE
{
USE_OPLINE
zend_free_op free_op1;
- zval *op1, *op2, *result;
+ zval *op1, *op2;
+ double d1, d2;
op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
op2 = EX_VAR(opline->op2.var);
- 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));
+ if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_LVAL_P(op1) == Z_LVAL_P(op2))) {
+case_true:
+ ZEND_VM_SMART_BRANCH_TRUE();
+ ZVAL_TRUE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
} else {
- break;
+case_false:
+ ZEND_VM_SMART_BRANCH_FALSE();
+ ZVAL_FALSE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
}
- } 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 if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ d1 = (double)Z_LVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+ goto case_double;
+ }
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+case_double:
+ if (d1 == d2) {
+ goto case_true;
} else {
- break;
+ goto case_false;
}
- } 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 if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = (double)Z_LVAL_P(op2);
+ goto case_double;
+ }
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
+ if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
+ int result = zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2));
+ if (result) {
+ goto case_true;
} else {
- break;
+ goto case_false;
}
- } 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();
+ ZEND_VM_TAIL_CALL(zend_case_helper_SPEC(op1, op2 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
@@ -17562,6 +17660,14 @@ num_index_prop:
/* > 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);
+
+ if ((IS_TMP_VAR|IS_VAR) & (IS_CONST|IS_CV)) {
+ /* avoid exception check */
+
+ ZEND_VM_SMART_BRANCH(result, 0);
+ ZVAL_BOOL(EX_VAR(opline->result.var), result);
+ ZEND_VM_NEXT_OPCODE();
+ }
} else {
result = (value == NULL || !i_zend_is_true(value));
}
@@ -17612,21 +17718,20 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TM
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;
+ result = (opline->extended_value & ZEND_ISEMPTY);
+ goto isset_object_finish;
}
} else {
- goto isset_no_object;
+ result = (opline->extended_value & ZEND_ISEMPTY);
+ goto isset_object_finish;
}
}
- 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));
- }
+
+ 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));
+
+isset_object_finish:
zval_ptr_dtor_nogc(free_op1);
ZEND_VM_SMART_BRANCH(result, 1);
@@ -17634,6 +17739,41 @@ isset_no_object:
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ARRAY_KEY_EXISTS_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+
+ zend_free_op free_op1;
+ zval *key, *subject;
+ HashTable *ht;
+ uint32_t result;
+
+ SAVE_OPLINE();
+
+ key = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ subject = EX_VAR(opline->op2.var);
+
+ if (EXPECTED(Z_TYPE_P(subject) == IS_ARRAY)) {
+array_key_exists_array:
+ ht = Z_ARRVAL_P(subject);
+ result = zend_array_key_exists_fast(ht, key OPLINE_CC EXECUTE_DATA_CC);
+ } else {
+ if ((IS_CV & (IS_VAR|IS_CV)) && EXPECTED(Z_ISREF_P(subject))) {
+ subject = Z_REFVAL_P(subject);
+ if (EXPECTED(Z_TYPE_P(subject) == IS_ARRAY)) {
+ goto array_key_exists_array;
+ }
+ }
+ result = zend_array_key_exists_slow(subject, key OPLINE_CC EXECUTE_DATA_CC);
+ }
+
+ zval_ptr_dtor_nogc(free_op1);
+ ZEND_VM_SMART_BRANCH(result == IS_TRUE, 1);
+ Z_TYPE_INFO_P(EX_VAR(opline->result.var)) = result;
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+}
+
+/* No specialization for op_types (CONST|TMPVAR|UNUSED|CV, ANY) */
static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -17645,7 +17785,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_SPEC_TMP_HA
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);
+ retval_ptr = ZVAL_UNDEFINED_OP1();
if (return_value) {
ZVAL_NULL(return_value);
}
@@ -17665,25 +17805,29 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_SPEC_TMP_HA
}
}
} 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))) {
- zend_refcounted *ref = Z_COUNTED_P(retval_ptr);
- if (GC_MAY_LEAK(ref)) {
- gc_possible_root(ref);
+ do {
+ if (Z_OPT_REFCOUNTED_P(retval_ptr)) {
+ if (EXPECTED(!Z_OPT_ISREF_P(retval_ptr))) {
+ if (EXPECTED(!(EX_CALL_INFO() & ZEND_CALL_CODE))) {
+ zend_refcounted *ref = Z_COUNTED_P(retval_ptr);
+ ZVAL_COPY_VALUE(return_value, retval_ptr);
+ if (GC_MAY_LEAK(ref)) {
+ gc_possible_root(ref);
+ }
+ ZVAL_NULL(retval_ptr);
+ break;
+ } else {
+ Z_ADDREF_P(retval_ptr);
}
- ZVAL_NULL(retval_ptr);
} else {
- Z_ADDREF_P(return_value);
+ retval_ptr = Z_REFVAL_P(retval_ptr);
+ if (Z_OPT_REFCOUNTED_P(retval_ptr)) {
+ Z_ADDREF_P(retval_ptr);
+ }
}
- } else {
- retval_ptr = Z_REFVAL_P(retval_ptr);
- ZVAL_COPY(return_value, retval_ptr);
}
- } else {
ZVAL_COPY_VALUE(return_value, retval_ptr);
- }
+ } while (0);
} else /* if (IS_TMP_VAR == IS_VAR) */ {
if (UNEXPECTED(Z_ISREF_P(retval_ptr))) {
zend_refcounted *ref = Z_COUNTED_P(retval_ptr);
@@ -17737,8 +17881,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_BY_REF_SPEC_TMP_HANDLER
retval_ptr = NULL;
if (IS_TMP_VAR == IS_VAR) {
- if (retval_ptr == &EG(uninitialized_zval) ||
- (opline->extended_value == ZEND_RETURNS_FUNCTION && !Z_ISREF_P(retval_ptr))) {
+ ZEND_ASSERT(retval_ptr != &EG(uninitialized_zval));
+ if (opline->extended_value == ZEND_RETURNS_FUNCTION && !Z_ISREF_P(retval_ptr)) {
zend_error(E_NOTICE, "Only variable references should be returned by reference");
if (EX(return_value)) {
ZVAL_NEW_REF(EX(return_value), retval_ptr);
@@ -17825,7 +17969,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_THROW_SPEC_TMP_HANDLER(ZEND_OP
}
}
if (IS_TMP_VAR == IS_CV && UNEXPECTED(Z_TYPE_P(value) == IS_UNDEF)) {
- GET_OP1_UNDEF_CV(value, BP_VAR_R);
+ ZVAL_UNDEFINED_OP1();
if (UNEXPECTED(EG(exception) != NULL)) {
HANDLE_EXCEPTION();
}
@@ -17906,15 +18050,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_USER_SPEC_TMP_HANDLER(ZEN
zend_free_op free_op1;
SAVE_OPLINE();
- arg = _get_zval_ptr_tmp(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_param_must_be_ref(EX(call)->func, opline->op2.num);
}
+ arg = _get_zval_ptr_tmp(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ param = ZEND_CALL_VAR(EX(call), opline->result.var);
ZVAL_COPY(param, arg);
-
zval_ptr_dtor_nogc(free_op1);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
@@ -17975,22 +18118,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CAST_SPEC_TMP_HANDLER(ZEND_OPC
} 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);
+ } else {
+ HashTable *obj_ht = zend_get_properties_for(expr, ZEND_PROP_PURPOSE_ARRAY_CAST);
if (obj_ht) {
/* fast copy */
- obj_ht = zend_proptable_to_symtable(obj_ht,
+ ZVAL_ARR(result, 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);
+ GC_IS_RECURSIVE(obj_ht))));
+ zend_release_properties(obj_ht);
} else {
ZVAL_EMPTY_ARRAY(result);
}
- } else {
- ZVAL_COPY_VALUE(result, expr);
- Z_ADDREF_P(result);
- convert_to_array(result);
}
} else {
ZVAL_OBJ(result, zend_objects_new(zend_standard_class_def));
@@ -18226,6 +18365,46 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMP_SET_SPEC_TMP_HANDLER(ZEND_
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_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_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_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_QM_ASSIGN_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -18236,7 +18415,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_QM_ASSIGN_SPEC_TMP
value = _get_zval_ptr_tmp(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
if (IS_TMP_VAR == IS_CV && UNEXPECTED(Z_TYPE_P(value) == IS_UNDEF)) {
SAVE_OPLINE();
- GET_OP1_UNDEF_CV(value, BP_VAR_R);
+ ZVAL_UNDEFINED_OP1();
ZVAL_NULL(result);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
@@ -18375,7 +18554,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_IDENTICAL_SPEC_TMP_CONST_HA
USE_OPLINE
zend_free_op free_op1;
zval *op1, *op2;
- int result;
+ zend_bool result;
SAVE_OPLINE();
op1 = _get_zval_ptr_tmp(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
@@ -18393,7 +18572,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_SPEC_TMP_CONS
USE_OPLINE
zend_free_op free_op1;
zval *op1, *op2;
- int result;
+ zend_bool result;
SAVE_OPLINE();
op1 = _get_zval_ptr_tmp(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
@@ -18408,6 +18587,10 @@ 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)
{
+#if 0
+ USE_OPLINE
+#endif
+
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));
@@ -18423,12 +18606,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_TMP_CO
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
+#if 0
+ USE_OPLINE
+#endif
+
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_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
@@ -18461,7 +18647,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ROPE_ADD_SPEC_TMP_CONST_HANDLE
} else {
SAVE_OPLINE();
if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(var) == IS_UNDEF)) {
- GET_OP2_UNDEF_CV(var, BP_VAR_R);
+ ZVAL_UNDEFINED_OP2();
}
rope[opline->extended_value] = zval_get_string_func(var);
@@ -18499,7 +18685,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ROPE_END_SPEC_TMP_CONST_HANDLE
} else {
SAVE_OPLINE();
if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(var) == IS_UNDEF)) {
- GET_OP2_UNDEF_CV(var, BP_VAR_R);
+ ZVAL_UNDEFINED_OP2();
}
rope[opline->extended_value] = zval_get_string_func(var);
@@ -18604,8 +18790,12 @@ num_index:
} else if (Z_TYPE_P(offset) == IS_TRUE) {
hval = 1;
goto num_index;
+ } else if (Z_TYPE_P(offset) == IS_RESOURCE) {
+ zend_use_resource_as_offset(offset);
+ hval = Z_RES_HANDLE_P(offset);
+ goto num_index;
} else if (IS_CONST == IS_CV && Z_TYPE_P(offset) == IS_UNDEF) {
- GET_OP2_UNDEF_CV(offset, BP_VAR_R);
+ ZVAL_UNDEFINED_OP2();
str = ZSTR_EMPTY_ALLOC();
goto str_index;
} else {
@@ -18638,7 +18828,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_TMP_CONST_HAND
}
ZEND_VM_TAIL_CALL(ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
} else {
- ZVAL_EMPTY_ARRAY(array);
+ ZVAL_ARR(array, zend_new_array(0));
ZEND_VM_NEXT_OPCODE();
}
}
@@ -18684,20 +18874,23 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_TMP_CONST_HANDLER(Z
/* If a function call result is yielded and the function did
* not return by reference we throw a notice. */
- if (IS_TMP_VAR == 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 {
+ do {
+ if (IS_TMP_VAR == IS_VAR) {
+ ZEND_ASSERT(value_ptr != &EG(uninitialized_zval));
+ if (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);
+ break;
+ }
+ }
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));
- }
+ } while (0);
}
} else {
@@ -18786,42 +18979,46 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IN_ARRAY_SPEC_TMP_CONST_HANDLE
zend_free_op free_op1;
zval *op1;
HashTable *ht = Z_ARRVAL_P(RT_CONSTANT(opline, opline->op2));
- int result;
+ zval *result;
SAVE_OPLINE();
op1 = _get_zval_ptr_tmp(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
- result = zend_hash_exists(ht, Z_STR_P(op1));
+ result = zend_hash_find_ex(ht, Z_STR_P(op1), IS_TMP_VAR == IS_CONST);
} else if (opline->extended_value) {
if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
- result = zend_hash_index_exists(ht, Z_LVAL_P(op1));
+ result = zend_hash_index_find(ht, Z_LVAL_P(op1));
} else {
- result = 0;
+ result = NULL;
}
} else if (Z_TYPE_P(op1) <= IS_FALSE) {
- result = zend_hash_exists(ht, ZSTR_EMPTY_ALLOC());
+ result = zend_hash_find_ex(ht, ZSTR_EMPTY_ALLOC(), 1);
} else {
zend_string *key;
- zval key_tmp, result_tmp;
+ zval key_tmp, result_tmp, *val;
- result = 0;
- ZEND_HASH_FOREACH_STR_KEY(ht, key) {
+ result = NULL;
+ ZEND_HASH_FOREACH_STR_KEY_VAL(ht, key, val) {
ZVAL_STR(&key_tmp, key);
compare_function(&result_tmp, op1, &key_tmp);
if (Z_LVAL(result_tmp) == 0) {
- result = 1;
+ result = val;
break;
}
} ZEND_HASH_FOREACH_END();
}
zval_ptr_dtor_nogc(free_op1);
ZEND_VM_SMART_BRANCH(result, 1);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
+ ZVAL_BOOL(EX_VAR(opline->result.var), result != NULL);
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 0
+ USE_OPLINE
+#endif
+
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));
@@ -18837,12 +19034,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_TMP_TM
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMP_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
+#if 0
+ USE_OPLINE
+#endif
+
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));
@@ -18875,7 +19075,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ROPE_ADD_SPEC_TMP_TMPVAR_HANDL
} 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);
+ ZVAL_UNDEFINED_OP2();
}
rope[opline->extended_value] = zval_get_string_func(var);
zval_ptr_dtor_nogc(free_op2);
@@ -18913,7 +19113,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ROPE_END_SPEC_TMP_TMPVAR_HANDL
} 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);
+ ZVAL_UNDEFINED_OP2();
}
rope[opline->extended_value] = zval_get_string_func(var);
zval_ptr_dtor_nogc(free_op2);
@@ -19018,8 +19218,12 @@ num_index:
} else if (Z_TYPE_P(offset) == IS_TRUE) {
hval = 1;
goto num_index;
+ } else if (Z_TYPE_P(offset) == IS_RESOURCE) {
+ zend_use_resource_as_offset(offset);
+ hval = Z_RES_HANDLE_P(offset);
+ 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);
+ ZVAL_UNDEFINED_OP2();
str = ZSTR_EMPTY_ALLOC();
goto str_index;
} else {
@@ -19052,7 +19256,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_TMP_TMPVAR_HAN
}
ZEND_VM_TAIL_CALL(ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
} else {
- ZVAL_EMPTY_ARRAY(array);
+ ZVAL_ARR(array, zend_new_array(0));
ZEND_VM_NEXT_OPCODE();
}
}
@@ -19062,7 +19266,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_IDENTICAL_SPEC_TMP_TMP_HAND
USE_OPLINE
zend_free_op free_op1, free_op2;
zval *op1, *op2;
- int result;
+ zend_bool result;
SAVE_OPLINE();
op1 = _get_zval_ptr_tmp(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
@@ -19080,7 +19284,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_SPEC_TMP_TMP_
USE_OPLINE
zend_free_op free_op1, free_op2;
zval *op1, *op2;
- int result;
+ zend_bool result;
SAVE_OPLINE();
op1 = _get_zval_ptr_tmp(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
@@ -19134,20 +19338,23 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_TMP_TMP_HANDLER(ZEN
/* If a function call result is yielded and the function did
* not return by reference we throw a notice. */
- if (IS_TMP_VAR == 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 {
+ do {
+ if (IS_TMP_VAR == IS_VAR) {
+ ZEND_ASSERT(value_ptr != &EG(uninitialized_zval));
+ if (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);
+ break;
+ }
+ }
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));
- }
+ } while (0);
}
} else {
@@ -19271,20 +19478,23 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_TMP_VAR_HANDLER(ZEN
/* If a function call result is yielded and the function did
* not return by reference we throw a notice. */
- if (IS_TMP_VAR == 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 {
+ do {
+ if (IS_TMP_VAR == IS_VAR) {
+ ZEND_ASSERT(value_ptr != &EG(uninitialized_zval));
+ if (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);
+ break;
+ }
+ }
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));
- }
+ } while (0);
}
} else {
@@ -19369,6 +19579,10 @@ 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)
{
+#if 0
+ USE_OPLINE
+#endif
+
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));
@@ -19508,8 +19722,12 @@ num_index:
} else if (Z_TYPE_P(offset) == IS_TRUE) {
hval = 1;
goto num_index;
+ } else if (Z_TYPE_P(offset) == IS_RESOURCE) {
+ zend_use_resource_as_offset(offset);
+ hval = Z_RES_HANDLE_P(offset);
+ goto num_index;
} else if (IS_UNUSED == IS_CV && Z_TYPE_P(offset) == IS_UNDEF) {
- GET_OP2_UNDEF_CV(offset, BP_VAR_R);
+ ZVAL_UNDEFINED_OP2();
str = ZSTR_EMPTY_ALLOC();
goto str_index;
} else {
@@ -19542,7 +19760,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_TMP_UNUSED_HAN
}
ZEND_VM_TAIL_CALL(ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
} else {
- ZVAL_EMPTY_ARRAY(array);
+ ZVAL_ARR(array, zend_new_array(0));
ZEND_VM_NEXT_OPCODE();
}
}
@@ -19588,20 +19806,23 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_TMP_UNUSED_HANDLER(
/* If a function call result is yielded and the function did
* not return by reference we throw a notice. */
- if (IS_TMP_VAR == 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 {
+ do {
+ if (IS_TMP_VAR == IS_VAR) {
+ ZEND_ASSERT(value_ptr != &EG(uninitialized_zval));
+ if (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);
+ break;
+ }
+ }
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));
- }
+ } while (0);
}
} else {
@@ -19684,83 +19905,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_TMP_UNUSED_HANDLER(
ZEND_VM_RETURN();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_COUNT_SPEC_TMP_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1;
- zval *op1;
- zend_long count;
-
- SAVE_OPLINE();
- op1 = _get_zval_ptr_tmp(opline->op1.var, &free_op1 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_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);
- zval_ptr_dtor_nogc(free_op1);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_GET_CLASS_SPEC_TMP_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
-
- if (IS_TMP_VAR == 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 {
- ZVAL_STR_COPY(EX_VAR(opline->result.var), EX(func)->common.scope->name);
- ZEND_VM_NEXT_OPCODE();
- }
- } else {
- zend_free_op free_op1;
- zval *op1;
-
- SAVE_OPLINE();
- op1 = _get_zval_ptr_tmp(opline->op1.var, &free_op1 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));
- }
- zval_ptr_dtor_nogc(free_op1);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
-}
-
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_GET_TYPE_SPEC_TMP_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -19782,6 +19926,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_GET_TYPE_SPEC_TMP_UNUSED_HANDL
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
+#if 0
+ USE_OPLINE
+#endif
+
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));
@@ -19797,12 +19945,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_TMP_CV
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
+#if 0
+ USE_OPLINE
+#endif
+
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_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
@@ -19835,7 +19986,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ROPE_ADD_SPEC_TMP_CV_HANDLER(Z
} else {
SAVE_OPLINE();
if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(var) == IS_UNDEF)) {
- GET_OP2_UNDEF_CV(var, BP_VAR_R);
+ ZVAL_UNDEFINED_OP2();
}
rope[opline->extended_value] = zval_get_string_func(var);
@@ -19873,7 +20024,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ROPE_END_SPEC_TMP_CV_HANDLER(Z
} else {
SAVE_OPLINE();
if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(var) == IS_UNDEF)) {
- GET_OP2_UNDEF_CV(var, BP_VAR_R);
+ ZVAL_UNDEFINED_OP2();
}
rope[opline->extended_value] = zval_get_string_func(var);
@@ -19978,8 +20129,12 @@ num_index:
} else if (Z_TYPE_P(offset) == IS_TRUE) {
hval = 1;
goto num_index;
+ } else if (Z_TYPE_P(offset) == IS_RESOURCE) {
+ zend_use_resource_as_offset(offset);
+ hval = Z_RES_HANDLE_P(offset);
+ goto num_index;
} else if (IS_CV == IS_CV && Z_TYPE_P(offset) == IS_UNDEF) {
- GET_OP2_UNDEF_CV(offset, BP_VAR_R);
+ ZVAL_UNDEFINED_OP2();
str = ZSTR_EMPTY_ALLOC();
goto str_index;
} else {
@@ -20012,7 +20167,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_TMP_CV_HANDLER
}
ZEND_VM_TAIL_CALL(ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
} else {
- ZVAL_EMPTY_ARRAY(array);
+ ZVAL_ARR(array, zend_new_array(0));
ZEND_VM_NEXT_OPCODE();
}
}
@@ -20058,20 +20213,23 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_TMP_CV_HANDLER(ZEND
/* If a function call result is yielded and the function did
* not return by reference we throw a notice. */
- if (IS_TMP_VAR == 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 {
+ do {
+ if (IS_TMP_VAR == IS_VAR) {
+ ZEND_ASSERT(value_ptr != &EG(uninitialized_zval));
+ if (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);
+ break;
+ }
+ }
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));
- }
+ } while (0);
}
} else {
@@ -20171,9 +20329,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BIND_LEXICAL_SPEC_TMP_CV_HANDL
}
} else {
var = EX_VAR(opline->op2.var);
- if (UNEXPECTED(Z_ISUNDEF_P(var))) {
+ if (UNEXPECTED(Z_ISUNDEF_P(var)) && !(opline->extended_value & ZEND_BIND_IMPLICIT)) {
SAVE_OPLINE();
- var = GET_OP2_UNDEF_CV(var, BP_VAR_R);
+ var = ZVAL_UNDEFINED_OP2();
if (UNEXPECTED(EG(exception))) {
HANDLE_EXCEPTION();
}
@@ -20182,11 +20340,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BIND_LEXICAL_SPEC_TMP_CV_HANDL
Z_TRY_ADDREF_P(var);
}
- zend_closure_bind_var_ex(closure, (opline->extended_value & ~ZEND_BIND_REF), var);
+ zend_closure_bind_var_ex(closure,
+ (opline->extended_value & ~(ZEND_BIND_REF|ZEND_BIND_IMPLICIT)), var);
ZEND_VM_NEXT_OPCODE();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_SPEC_VAR_RETVAL_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static zend_never_inline ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_inc_helper_SPEC_VAR(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zend_free_op free_op1;
@@ -20194,16 +20353,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_SPEC_VAR_RETVAL_UNUSED
var_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
- if (EXPECTED(Z_TYPE_P(var_ptr) == IS_LONG)) {
- fast_long_increment_function(var_ptr);
- if (UNEXPECTED(0)) {
- ZVAL_COPY_VALUE(EX_VAR(opline->result.var), var_ptr);
- }
- ZEND_VM_NEXT_OPCODE();
- }
-
if (IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(var_ptr))) {
- if (UNEXPECTED(0)) {
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_NULL(EX_VAR(opline->result.var));
}
ZEND_VM_NEXT_OPCODE();
@@ -20211,13 +20362,23 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_SPEC_VAR_RETVAL_UNUSED
SAVE_OPLINE();
if (IS_VAR == IS_CV && UNEXPECTED(Z_TYPE_P(var_ptr) == IS_UNDEF)) {
- var_ptr = GET_OP1_UNDEF_CV(var_ptr, BP_VAR_RW);
+ ZVAL_NULL(var_ptr);
+ ZVAL_UNDEFINED_OP1();
}
- ZVAL_DEREF(var_ptr);
- increment_function(var_ptr);
+ do {
+ if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) {
+ zend_reference *ref = Z_REF_P(var_ptr);
+ var_ptr = Z_REFVAL_P(var_ptr);
+ if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) {
+ zend_incdec_typed_ref(ref, NULL OPLINE_CC EXECUTE_DATA_CC);
+ break;
+ }
+ }
+ increment_function(var_ptr);
+ } while (0);
- if (UNEXPECTED(0)) {
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);
}
@@ -20225,7 +20386,26 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_SPEC_VAR_RETVAL_UNUSED
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_SPEC_VAR_RETVAL_USED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_SPEC_VAR_RETVAL_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op1;
+ zval *var_ptr;
+
+ var_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+
+ if (EXPECTED(Z_TYPE_P(var_ptr) == IS_LONG)) {
+ fast_long_increment_function(var_ptr);
+ if (UNEXPECTED(0)) {
+ ZVAL_COPY_VALUE(EX_VAR(opline->result.var), var_ptr);
+ }
+ ZEND_VM_NEXT_OPCODE();
+ }
+
+ ZEND_VM_TAIL_CALL(zend_pre_inc_helper_SPEC_VAR(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
+}
+
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_SPEC_VAR_RETVAL_USED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zend_free_op free_op1;
@@ -20241,8 +20421,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_SPEC_VAR_RETVAL_USED_H
ZEND_VM_NEXT_OPCODE();
}
+ ZEND_VM_TAIL_CALL(zend_pre_inc_helper_SPEC_VAR(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
+}
+
+static zend_never_inline ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_dec_helper_SPEC_VAR(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op1;
+ zval *var_ptr;
+
+ 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(1)) {
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_NULL(EX_VAR(opline->result.var));
}
ZEND_VM_NEXT_OPCODE();
@@ -20250,13 +20441,24 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_SPEC_VAR_RETVAL_USED_H
SAVE_OPLINE();
if (IS_VAR == IS_CV && UNEXPECTED(Z_TYPE_P(var_ptr) == IS_UNDEF)) {
- var_ptr = GET_OP1_UNDEF_CV(var_ptr, BP_VAR_RW);
+ ZVAL_NULL(var_ptr);
+ ZVAL_UNDEFINED_OP1();
}
- ZVAL_DEREF(var_ptr);
- increment_function(var_ptr);
+ do {
+ if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) {
+ zend_reference *ref = Z_REF_P(var_ptr);
+ var_ptr = Z_REFVAL_P(var_ptr);
- if (UNEXPECTED(1)) {
+ if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) {
+ zend_incdec_typed_ref(ref, NULL OPLINE_CC EXECUTE_DATA_CC);
+ break;
+ }
+ }
+ decrement_function(var_ptr);
+ } while (0);
+
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);
}
@@ -20264,7 +20466,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_SPEC_VAR_RETVAL_USED_H
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_SPEC_VAR_RETVAL_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_SPEC_VAR_RETVAL_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zend_free_op free_op1;
@@ -20280,30 +20482,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_SPEC_VAR_RETVAL_UNUSED
ZEND_VM_NEXT_OPCODE();
}
- if (IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(var_ptr))) {
- if (UNEXPECTED(0)) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
- ZEND_VM_NEXT_OPCODE();
- }
-
- SAVE_OPLINE();
- if (IS_VAR == IS_CV && UNEXPECTED(Z_TYPE_P(var_ptr) == IS_UNDEF)) {
- var_ptr = GET_OP1_UNDEF_CV(var_ptr, BP_VAR_RW);
- }
- ZVAL_DEREF(var_ptr);
-
- decrement_function(var_ptr);
-
- if (UNEXPECTED(0)) {
- ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);
- }
-
- if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+ ZEND_VM_TAIL_CALL(zend_pre_dec_helper_SPEC_VAR(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_SPEC_VAR_RETVAL_USED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_SPEC_VAR_RETVAL_USED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zend_free_op free_op1;
@@ -20319,30 +20501,48 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_SPEC_VAR_RETVAL_USED_H
ZEND_VM_NEXT_OPCODE();
}
+ ZEND_VM_TAIL_CALL(zend_pre_dec_helper_SPEC_VAR(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
+}
+
+static zend_never_inline ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_inc_helper_SPEC_VAR(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op1;
+ zval *var_ptr;
+
+ 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(1)) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
+ ZVAL_NULL(EX_VAR(opline->result.var));
ZEND_VM_NEXT_OPCODE();
}
SAVE_OPLINE();
if (IS_VAR == IS_CV && UNEXPECTED(Z_TYPE_P(var_ptr) == IS_UNDEF)) {
- var_ptr = GET_OP1_UNDEF_CV(var_ptr, BP_VAR_RW);
+ ZVAL_NULL(var_ptr);
+ ZVAL_UNDEFINED_OP1();
}
- ZVAL_DEREF(var_ptr);
- decrement_function(var_ptr);
+ do {
+ if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) {
+ zend_reference *ref = Z_REF_P(var_ptr);
+ var_ptr = Z_REFVAL_P(var_ptr);
- if (UNEXPECTED(1)) {
+ if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) {
+ zend_incdec_typed_ref(ref, EX_VAR(opline->result.var) OPLINE_CC EXECUTE_DATA_CC);
+ break;
+ }
+ }
ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);
- }
+
+ increment_function(var_ptr);
+ } while (0);
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_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zend_free_op free_op1;
@@ -20356,6 +20556,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_SPEC_VAR_HANDLER(ZEND
ZEND_VM_NEXT_OPCODE();
}
+ ZEND_VM_TAIL_CALL(zend_post_inc_helper_SPEC_VAR(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
+}
+
+static zend_never_inline ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_dec_helper_SPEC_VAR(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op1;
+ zval *var_ptr;
+
+ 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))) {
ZVAL_NULL(EX_VAR(opline->result.var));
ZEND_VM_NEXT_OPCODE();
@@ -20363,18 +20574,30 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_SPEC_VAR_HANDLER(ZEND
SAVE_OPLINE();
if (IS_VAR == IS_CV && UNEXPECTED(Z_TYPE_P(var_ptr) == IS_UNDEF)) {
- var_ptr = GET_OP1_UNDEF_CV(var_ptr, BP_VAR_RW);
+ ZVAL_NULL(var_ptr);
+ ZVAL_UNDEFINED_OP1();
}
- ZVAL_DEREF(var_ptr);
- ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);
- increment_function(var_ptr);
+ do {
+ if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) {
+ zend_reference *ref = Z_REF_P(var_ptr);
+ var_ptr = Z_REFVAL_P(var_ptr);
+
+ if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) {
+ zend_incdec_typed_ref(ref, EX_VAR(opline->result.var) OPLINE_CC EXECUTE_DATA_CC);
+ break;
+ }
+ }
+ ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);
+
+ decrement_function(var_ptr);
+ } while (0);
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_DEC_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_DEC_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zend_free_op free_op1;
@@ -20388,22 +20611,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_DEC_SPEC_VAR_HANDLER(ZEND
ZEND_VM_NEXT_OPCODE();
}
- if (IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(var_ptr))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- ZEND_VM_NEXT_OPCODE();
- }
-
- SAVE_OPLINE();
- if (IS_VAR == IS_CV && UNEXPECTED(Z_TYPE_P(var_ptr) == IS_UNDEF)) {
- var_ptr = GET_OP1_UNDEF_CV(var_ptr, BP_VAR_RW);
- }
- ZVAL_DEREF(var_ptr);
- ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);
-
- decrement_function(var_ptr);
-
- if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+ ZEND_VM_TAIL_CALL(zend_post_dec_helper_SPEC_VAR(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
@@ -20417,7 +20625,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_SPEC_VAR_HA
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);
+ retval_ptr = ZVAL_UNDEFINED_OP1();
if (return_value) {
ZVAL_NULL(return_value);
}
@@ -20437,25 +20645,29 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_SPEC_VAR_HA
}
}
} 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))) {
- zend_refcounted *ref = Z_COUNTED_P(retval_ptr);
- if (GC_MAY_LEAK(ref)) {
- gc_possible_root(ref);
+ do {
+ if (Z_OPT_REFCOUNTED_P(retval_ptr)) {
+ if (EXPECTED(!Z_OPT_ISREF_P(retval_ptr))) {
+ if (EXPECTED(!(EX_CALL_INFO() & ZEND_CALL_CODE))) {
+ zend_refcounted *ref = Z_COUNTED_P(retval_ptr);
+ ZVAL_COPY_VALUE(return_value, retval_ptr);
+ if (GC_MAY_LEAK(ref)) {
+ gc_possible_root(ref);
+ }
+ ZVAL_NULL(retval_ptr);
+ break;
+ } else {
+ Z_ADDREF_P(retval_ptr);
}
- ZVAL_NULL(retval_ptr);
} else {
- Z_ADDREF_P(return_value);
+ retval_ptr = Z_REFVAL_P(retval_ptr);
+ if (Z_OPT_REFCOUNTED_P(retval_ptr)) {
+ Z_ADDREF_P(retval_ptr);
+ }
}
- } else {
- retval_ptr = Z_REFVAL_P(retval_ptr);
- ZVAL_COPY(return_value, retval_ptr);
}
- } else {
ZVAL_COPY_VALUE(return_value, retval_ptr);
- }
+ } while (0);
} else /* if (IS_VAR == IS_VAR) */ {
if (UNEXPECTED(Z_ISREF_P(retval_ptr))) {
zend_refcounted *ref = Z_COUNTED_P(retval_ptr);
@@ -20509,8 +20721,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_BY_REF_SPEC_VAR_HANDLER
retval_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
if (IS_VAR == IS_VAR) {
- if (retval_ptr == &EG(uninitialized_zval) ||
- (opline->extended_value == ZEND_RETURNS_FUNCTION && !Z_ISREF_P(retval_ptr))) {
+ ZEND_ASSERT(retval_ptr != &EG(uninitialized_zval));
+ if (opline->extended_value == ZEND_RETURNS_FUNCTION && !Z_ISREF_P(retval_ptr)) {
zend_error(E_NOTICE, "Only variable references should be returned by reference");
if (EX(return_value)) {
ZVAL_NEW_REF(EX(return_value), retval_ptr);
@@ -20598,7 +20810,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_THROW_SPEC_VAR_HANDLER(ZEND_OP
}
}
if (IS_VAR == IS_CV && UNEXPECTED(Z_TYPE_P(value) == IS_UNDEF)) {
- GET_OP1_UNDEF_CV(value, BP_VAR_R);
+ ZVAL_UNDEFINED_OP1();
if (UNEXPECTED(EG(exception) != NULL)) {
HANDLE_EXCEPTION();
}
@@ -20620,7 +20832,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_THROW_SPEC_VAR_HANDLER(ZEND_OP
HANDLE_EXCEPTION();
}
-static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAR_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static zend_always_inline ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAR_SPEC_VAR_INLINE_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zval *varptr, *arg;
@@ -20629,7 +20841,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAR_SPEC_VAR_
varptr = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
if (IS_VAR == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(varptr) == IS_UNDEF)) {
SAVE_OPLINE();
- GET_OP1_UNDEF_CV(varptr, BP_VAR_R);
+ ZVAL_UNDEFINED_OP1();
arg = ZEND_CALL_VAR(EX(call), opline->result.var);
ZVAL_NULL(arg);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
@@ -20658,6 +20870,11 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAR_SPEC_VAR_
ZEND_VM_NEXT_OPCODE();
}
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAR_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ ZEND_VM_TAIL_CALL(ZEND_SEND_VAR_SPEC_VAR_INLINE_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
+}
+
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAR_NO_REF_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -20673,6 +20890,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAR_NO_REF_SPEC_VAR_HANDL
}
SAVE_OPLINE();
+ ZVAL_NEW_REF(arg, arg);
zend_error(E_NOTICE, "Only variables should be passed by reference");
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
@@ -20713,6 +20931,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAR_NO_REF_EX_SPEC_VAR_HA
}
SAVE_OPLINE();
+ ZVAL_NEW_REF(arg, arg);
zend_error(E_NOTICE, "Only variables should be passed by reference");
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
@@ -20726,7 +20945,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAR_NO_REF_EX
if (EXPECTED(1)) {
if (!QUICK_ARG_SHOULD_BE_SENT_BY_REF(EX(call)->func, arg_num)) {
- ZEND_VM_TAIL_CALL(ZEND_SEND_VAR_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
+ ZEND_VM_TAIL_CALL(ZEND_SEND_VAR_SPEC_VAR_INLINE_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
varptr = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
@@ -20739,7 +20958,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAR_NO_REF_EX
}
} else {
if (!ARG_SHOULD_BE_SENT_BY_REF(EX(call)->func, arg_num)) {
- ZEND_VM_TAIL_CALL(ZEND_SEND_VAR_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
+ ZEND_VM_TAIL_CALL(ZEND_SEND_VAR_SPEC_VAR_INLINE_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
varptr = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
@@ -20753,6 +20972,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAR_NO_REF_EX
}
SAVE_OPLINE();
+ ZVAL_NEW_REF(arg, arg);
zend_error(E_NOTICE, "Only variables should be passed by reference");
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
@@ -20803,7 +21023,7 @@ send_var_by_ref:
varptr = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
if (IS_VAR == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(varptr) == IS_UNDEF)) {
SAVE_OPLINE();
- GET_OP1_UNDEF_CV(varptr, BP_VAR_R);
+ ZVAL_UNDEFINED_OP1();
arg = ZEND_CALL_VAR(EX(call), opline->result.var);
ZVAL_NULL(arg);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
@@ -20851,7 +21071,7 @@ send_var_by_ref:
varptr = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
if (IS_VAR == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(varptr) == IS_UNDEF)) {
SAVE_OPLINE();
- GET_OP1_UNDEF_CV(varptr, BP_VAR_R);
+ ZVAL_UNDEFINED_OP1();
arg = ZEND_CALL_VAR(EX(call), opline->result.var);
ZVAL_NULL(arg);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
@@ -20917,15 +21137,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_USER_SPEC_VAR_HANDLER(ZEN
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_param_must_be_ref(EX(call)->func, opline->op2.num);
}
+ arg = _get_zval_ptr_var_deref(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ param = ZEND_CALL_VAR(EX(call), opline->result.var);
ZVAL_COPY(param, arg);
-
zval_ptr_dtor_nogc(free_op1);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
@@ -20987,22 +21206,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CAST_SPEC_VAR_HANDLER(ZEND_OPC
} 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);
+ } else {
+ HashTable *obj_ht = zend_get_properties_for(expr, ZEND_PROP_PURPOSE_ARRAY_CAST);
if (obj_ht) {
/* fast copy */
- obj_ht = zend_proptable_to_symtable(obj_ht,
+ ZVAL_ARR(result, 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);
+ GC_IS_RECURSIVE(obj_ht))));
+ zend_release_properties(obj_ht);
} else {
ZVAL_EMPTY_ARRAY(result);
}
- } else {
- ZVAL_COPY_VALUE(result, expr);
- Z_ADDREF_P(result);
- convert_to_array(result);
}
} else {
ZVAL_OBJ(result, zend_objects_new(zend_standard_class_def));
@@ -21251,10 +21466,12 @@ fe_fetch_r_exit:
value = Z_INDIRECT_P(value);
value_type = Z_TYPE_INFO_P(value);
if (EXPECTED(value_type != IS_UNDEF)
- && EXPECTED(zend_check_property_access(Z_OBJ_P(array), p->key) == SUCCESS)) {
+ && EXPECTED(zend_check_property_access(Z_OBJ_P(array), p->key, 0) == SUCCESS)) {
break;
}
- } else {
+ } else if (EXPECTED(Z_OBJCE_P(array)->default_properties_count == 0)
+ || !p->key
+ || zend_check_property_access(Z_OBJ_P(array), p->key, 1) == SUCCESS) {
break;
}
}
@@ -21319,7 +21536,7 @@ fe_fetch_r_exit:
if (EXPECTED(opline->op2_type == IS_CV)) {
zval *variable_ptr = EX_VAR(opline->op2.var);
- zend_assign_to_variable(variable_ptr, value, IS_CV);
+ zend_assign_to_variable(variable_ptr, value, IS_CV, EX_USES_STRICT_TYPES());
} else {
zval *res = EX_VAR(opline->op2.var);
zend_refcounted *gc = Z_COUNTED_P(value);
@@ -21401,10 +21618,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_FETCH_RW_SPEC_VAR_HANDLER(Z
value = Z_INDIRECT_P(value);
value_type = Z_TYPE_INFO_P(value);
if (EXPECTED(value_type != IS_UNDEF)
- && EXPECTED(zend_check_property_access(Z_OBJ_P(array), p->key) == SUCCESS)) {
+ && EXPECTED(zend_check_property_access(Z_OBJ_P(array), p->key, 0) == SUCCESS)) {
+ if ((value_type & Z_TYPE_MASK) != IS_REFERENCE) {
+ zend_property_info *prop_info =
+ zend_get_typed_property_info_for_slot(Z_OBJ_P(array), value);
+ if (UNEXPECTED(prop_info)) {
+ ZVAL_NEW_REF(value, value);
+ ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(value), prop_info);
+ value_type = IS_REFERENCE_EX;
+ }
+ }
break;
}
- } else {
+ } else if (EXPECTED(Z_OBJCE_P(array)->default_properties_count == 0)
+ || !p->key
+ || zend_check_property_access(Z_OBJ_P(array), p->key, 1) == SUCCESS) {
break;
}
}
@@ -21490,7 +21718,7 @@ fe_fetch_w_exit:
ref = Z_REF_P(value);
GC_ADDREF(ref);
- zval_ptr_dtor(variable_ptr);
+ i_zval_ptr_dtor(variable_ptr);
ZVAL_REF(variable_ptr, ref);
}
} else {
@@ -21550,6 +21778,46 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMP_SET_SPEC_VAR_HANDLER(ZEND_
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_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_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_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_QM_ASSIGN_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -21560,7 +21828,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_QM_ASSIGN_SPEC_VAR
value = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
if (IS_VAR == IS_CV && UNEXPECTED(Z_TYPE_P(value) == IS_UNDEF)) {
SAVE_OPLINE();
- GET_OP1_UNDEF_CV(value, BP_VAR_R);
+ ZVAL_UNDEFINED_OP1();
ZVAL_NULL(result);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
@@ -21742,7 +22010,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_IDENTICAL_SPEC_VAR_CONST_HA
USE_OPLINE
zend_free_op free_op1;
zval *op1, *op2;
- int result;
+ zend_bool result;
SAVE_OPLINE();
op1 = _get_zval_ptr_var_deref(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
@@ -21760,7 +22028,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_SPEC_VAR_CONS
USE_OPLINE
zend_free_op free_op1;
zval *op1, *op2;
- int result;
+ zend_bool result;
SAVE_OPLINE();
op1 = _get_zval_ptr_var_deref(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
@@ -21773,14 +22041,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_SPEC_VAR_CONS
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_VAR_CONST(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_OP_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zend_free_op free_op1, free_op_data1;
+ zend_free_op free_op1, free_op_data;
zval *object;
zval *property;
zval *value;
zval *zptr;
+ void **cache_slot;
+ zend_property_info *prop_info;
SAVE_OPLINE();
object = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
@@ -21792,49 +22062,76 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP
property = RT_CONSTANT(opline, opline->op2);
do {
- value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data1);
+ value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data);
if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
- if (Z_ISREF_P(object)) {
+ if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) {
object = Z_REFVAL_P(object);
- if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
- goto assign_op_object;
- }
+ goto assign_op_object;
+ }
+ if (IS_VAR == IS_CV
+ && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
+ ZVAL_UNDEFINED_OP1();
}
- if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
+ object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC);
+ if (UNEXPECTED(!object)) {
break;
}
}
- /* here we are sure we are dealing with an object */
assign_op_object:
- if (EXPECTED(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)) {
+ /* here we are sure we are dealing with an object */
+ cache_slot = (IS_CONST == IS_CONST) ? CACHE_ADDR((opline+1)->extended_value) : NULL;
+ if (EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, cache_slot)) != NULL)) {
if (UNEXPECTED(Z_ISERROR_P(zptr))) {
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_NULL(EX_VAR(opline->result.var));
}
} else {
- ZVAL_DEREF(zptr);
+ zval *orig_zptr = zptr;
+ zend_reference *ref;
+
+ do {
+ if (UNEXPECTED(Z_ISREF_P(zptr))) {
+ ref = Z_REF_P(zptr);
+ zptr = Z_REFVAL_P(zptr);
+ if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) {
+ zend_binary_assign_op_typed_ref(ref, value OPLINE_CC EXECUTE_DATA_CC);
+ break;
+ }
+ }
+
+ if (IS_CONST == IS_CONST) {
+ prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2);
+ } else {
+ prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(object), orig_zptr);
+ }
+ if (UNEXPECTED(prop_info)) {
+ /* special case for typed properties */
+ zend_binary_assign_op_typed_prop(prop_info, zptr, value OPLINE_CC EXECUTE_DATA_CC);
+ } else {
+ zend_binary_op(zptr, zptr, value OPLINE_CC);
+ }
+ } while (0);
- binary_op(zptr, zptr, value);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), zptr);
}
}
} else {
- zend_assign_op_overloaded_property(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR((opline+1)->extended_value) : NULL), value, binary_op OPLINE_CC EXECUTE_DATA_CC);
+ zend_assign_op_overloaded_property(object, property, cache_slot, value OPLINE_CC EXECUTE_DATA_CC);
}
} while (0);
- FREE_OP(free_op_data1);
+ FREE_OP(free_op_data);
if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
/* assign_obj has two opcodes! */
ZEND_VM_NEXT_OPCODE_EX(1, 2);
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SPEC_VAR_CONST(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC)
+/* No specialization for op_types (CONST|TMP|VAR|CV, UNUSED|CONST|TMPVAR) */
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_OP_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zend_free_op free_op1, free_op_data1;
@@ -21864,67 +22161,61 @@ assign_dim_op_new_array:
if (UNEXPECTED(!var_ptr)) {
goto assign_dim_op_ret_null;
}
- ZVAL_DEREF(var_ptr);
}
value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data1);
- binary_op(var_ptr, var_ptr, value);
+ do {
+ if (IS_CONST != IS_UNUSED && UNEXPECTED(Z_ISREF_P(var_ptr))) {
+ zend_reference *ref = Z_REF_P(var_ptr);
+ var_ptr = Z_REFVAL_P(var_ptr);
+ if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) {
+ zend_binary_assign_op_typed_ref(ref, value OPLINE_CC EXECUTE_DATA_CC);
+ break;
+ }
+ }
+ zend_binary_op(var_ptr, var_ptr, value OPLINE_CC);
+ } while (0);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);
}
+ FREE_OP(free_op_data1);
} 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 = RT_CONSTANT(opline, opline->op2);
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_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);
+ zend_binary_assign_op_obj_dim(container, dim OPLINE_CC EXECUTE_DATA_CC);
+ } else if (EXPECTED(Z_TYPE_P(container) <= IS_FALSE)) {
+ if (IS_VAR == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(container) == IS_UNDEF)) {
+ ZVAL_UNDEFINED_OP1();
+ }
+ ZVAL_ARR(container, zend_new_array(8));
+ goto assign_dim_op_new_array;
} else {
- if (UNEXPECTED(Z_TYPE_P(container) == IS_STRING)) {
- if (IS_CONST == 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();
- }
+ zend_binary_assign_op_dim_slow(container, dim OPLINE_CC EXECUTE_DATA_CC);
assign_dim_op_ret_null:
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
+ 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);
}
}
- 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_CONST(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OP_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zend_free_op free_op1;
@@ -21940,9 +22231,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_simple_helper
ZVAL_NULL(EX_VAR(opline->result.var));
}
} else {
- ZVAL_DEREF(var_ptr);
-
- binary_op(var_ptr, var_ptr, value);
+ do {
+ if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) {
+ zend_reference *ref = Z_REF_P(var_ptr);
+ var_ptr = Z_REFVAL_P(var_ptr);
+ if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) {
+ zend_binary_assign_op_typed_ref(ref, value OPLINE_CC EXECUTE_DATA_CC);
+ break;
+ }
+ }
+ zend_binary_op(var_ptr, var_ptr, value OPLINE_CC);
+ } while (0);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);
@@ -21953,262 +22252,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_simple_helper
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_SPEC_VAR_CONST(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC)
-{
-#if 1 && IS_CONST == IS_UNUSED
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_VAR_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-#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));
- }
- if (EXPECTED(0)) {
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_VAR_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
- }
-# endif
-
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_VAR_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-#endif
-}
-
-static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_SPEC_VAR_CONST_DIM(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC)
-{
-#if 1 && IS_CONST == IS_UNUSED
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_VAR_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-#else
-# if 0 || IS_VAR != IS_UNUSED
-# if 0
- /* opline->extended_value checks are specialized, don't need opline */
- USE_OPLINE
-# endif
-
- if (EXPECTED(0)) {
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_simple_helper_SPEC_VAR_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
- }
- if (EXPECTED(1)) {
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_VAR_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
- }
-# endif
-
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_VAR_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-#endif
-}
-
-static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_SPEC_VAR_CONST_OBJ(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC)
-{
-#if 1 && IS_CONST == IS_UNUSED
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_VAR_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-#else
-# if 0 || IS_VAR != IS_UNUSED
-# if 0
- /* opline->extended_value checks are specialized, don't need opline */
- USE_OPLINE
-# endif
-
- if (EXPECTED(0)) {
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_simple_helper_SPEC_VAR_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
- }
- if (EXPECTED(0)) {
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_VAR_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
- }
-# endif
-
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_VAR_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-#endif
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST(add_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_VAR_CONST_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST_DIM(add_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_VAR_CONST_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST_OBJ(add_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SUB_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST(sub_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SUB_SPEC_VAR_CONST_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST_DIM(sub_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SUB_SPEC_VAR_CONST_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST_OBJ(sub_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MUL_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST(mul_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MUL_SPEC_VAR_CONST_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST_DIM(mul_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MUL_SPEC_VAR_CONST_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST_OBJ(mul_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIV_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST(div_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIV_SPEC_VAR_CONST_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST_DIM(div_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIV_SPEC_VAR_CONST_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST_OBJ(div_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MOD_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST(mod_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MOD_SPEC_VAR_CONST_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST_DIM(mod_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MOD_SPEC_VAR_CONST_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST_OBJ(mod_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SL_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST(shift_left_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SL_SPEC_VAR_CONST_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST_DIM(shift_left_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SL_SPEC_VAR_CONST_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST_OBJ(shift_left_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SR_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST(shift_right_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SR_SPEC_VAR_CONST_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST_DIM(shift_right_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SR_SPEC_VAR_CONST_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST_OBJ(shift_right_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_CONCAT_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST(concat_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_CONCAT_SPEC_VAR_CONST_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST_DIM(concat_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_CONCAT_SPEC_VAR_CONST_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST_OBJ(concat_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_OR_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST(bitwise_or_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_OR_SPEC_VAR_CONST_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST_DIM(bitwise_or_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_OR_SPEC_VAR_CONST_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST_OBJ(bitwise_or_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_AND_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST(bitwise_and_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_AND_SPEC_VAR_CONST_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST_DIM(bitwise_and_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_AND_SPEC_VAR_CONST_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST_OBJ(bitwise_and_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST(bitwise_xor_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_VAR_CONST_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST_DIM(bitwise_xor_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_VAR_CONST_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST_OBJ(bitwise_xor_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_POW_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST(pow_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_POW_SPEC_VAR_CONST_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST_DIM(pow_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_POW_SPEC_VAR_CONST_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST_OBJ(pow_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_VAR_CONST(int inc ZEND_OPCODE_HANDLER_ARGS_DC)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_OBJ_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zend_free_op free_op1;
zval *object;
zval *property;
zval *zptr;
+ void **cache_slot;
+ zend_property_info *prop_info;
SAVE_OPLINE();
object = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
@@ -22221,47 +22273,38 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE
do {
if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
- if (Z_ISREF_P(object)) {
+ if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) {
object = Z_REFVAL_P(object);
- if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
- goto pre_incdec_object;
- }
+ goto pre_incdec_object;
}
- if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
+ if (IS_VAR == IS_CV
+ && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
+ ZVAL_UNDEFINED_OP1();
+ }
+ object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC);
+ if (UNEXPECTED(!object)) {
break;
}
}
- /* here we are sure we are dealing with an object */
pre_incdec_object:
- if (EXPECTED(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->extended_value) : NULL))) != NULL)) {
+ /* here we are sure we are dealing with an object */
+ cache_slot = (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL;
+ if (EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, cache_slot)) != NULL)) {
if (UNEXPECTED(Z_ISERROR_P(zptr))) {
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_NULL(EX_VAR(opline->result.var));
}
} else {
- if (EXPECTED(Z_TYPE_P(zptr) == IS_LONG)) {
- if (inc) {
- fast_long_increment_function(zptr);
- } else {
- fast_long_decrement_function(zptr);
- }
+ if (IS_CONST == IS_CONST) {
+ prop_info = (zend_property_info *) CACHED_PTR_EX(cache_slot + 2);
} else {
- ZVAL_DEREF(zptr);
-
- if (inc) {
- increment_function(zptr);
- } else {
- decrement_function(zptr);
- }
- }
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY(EX_VAR(opline->result.var), zptr);
+ prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(object), zptr);
}
+ zend_pre_incdec_property_zval(zptr, prop_info OPLINE_CC EXECUTE_DATA_CC);
}
} else {
- zend_pre_incdec_overloaded_property(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), inc OPLINE_CC EXECUTE_DATA_CC);
+ zend_pre_incdec_overloaded_property(object, property, cache_slot OPLINE_CC EXECUTE_DATA_CC);
}
} while (0);
@@ -22269,23 +22312,15 @@ pre_incdec_object:
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_OBJ_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_pre_incdec_property_helper_SPEC_VAR_CONST(1 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_OBJ_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_pre_incdec_property_helper_SPEC_VAR_CONST(0 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_VAR_CONST(int inc ZEND_OPCODE_HANDLER_ARGS_DC)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_OBJ_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zend_free_op free_op1;
zval *object;
zval *property;
zval *zptr;
+ void **cache_slot;
+ zend_property_info *prop_info;
SAVE_OPLINE();
object = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
@@ -22298,43 +22333,37 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP
do {
if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
- if (Z_ISREF_P(object)) {
+ if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) {
object = Z_REFVAL_P(object);
- if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
- goto post_incdec_object;
- }
+ goto post_incdec_object;
}
- if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
+ if (IS_VAR == IS_CV
+ && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
+ ZVAL_UNDEFINED_OP1();
+ }
+ object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC);
+ if (UNEXPECTED(!object)) {
break;
}
}
- /* here we are sure we are dealing with an object */
post_incdec_object:
- if (EXPECTED(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->extended_value) : NULL))) != NULL)) {
+ /* here we are sure we are dealing with an object */
+ cache_slot = (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL;
+ if (EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, cache_slot)) != NULL)) {
if (UNEXPECTED(Z_ISERROR_P(zptr))) {
ZVAL_NULL(EX_VAR(opline->result.var));
} else {
- if (EXPECTED(Z_TYPE_P(zptr) == IS_LONG)) {
- ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(zptr));
- if (inc) {
- fast_long_increment_function(zptr);
- } else {
- fast_long_decrement_function(zptr);
- }
+ if (IS_CONST == IS_CONST) {
+ prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2);
} else {
- ZVAL_DEREF(zptr);
- ZVAL_COPY(EX_VAR(opline->result.var), zptr);
- if (inc) {
- increment_function(zptr);
- } else {
- decrement_function(zptr);
- }
+ prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(object), zptr);
}
+
+ zend_post_incdec_property_zval(zptr, prop_info OPLINE_CC EXECUTE_DATA_CC);
}
} else {
- zend_post_incdec_overloaded_property(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), inc OPLINE_CC EXECUTE_DATA_CC);
+ zend_post_incdec_overloaded_property(object, property, cache_slot OPLINE_CC EXECUTE_DATA_CC);
}
} while (0);
@@ -22342,16 +22371,6 @@ post_incdec_object:
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_OBJ_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_post_incdec_property_helper_SPEC_VAR_CONST(1 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_DEC_OBJ_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_post_incdec_property_helper_SPEC_VAR_CONST(0 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_W_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -22388,6 +22407,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_RW_SPEC_VAR_CONST_HA
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
+#if 0
+ USE_OPLINE
+#endif
+
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));
@@ -22433,7 +22456,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_CONST_HAN
property = RT_CONSTANT(opline, opline->op2);
result = EX_VAR(opline->result.var);
- zend_fetch_property_address(result, container, IS_VAR, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_W OPLINE_CC);
+ zend_fetch_property_address(
+ result, container, IS_VAR, property, IS_CONST,
+ ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_FETCH_OBJ_FLAGS) : NULL),
+ BP_VAR_W, opline->extended_value & ZEND_FETCH_OBJ_FLAGS, 1 OPLINE_CC EXECUTE_DATA_CC);
if (IS_VAR == IS_VAR) {
FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result);
@@ -22455,7 +22481,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_VAR_CONST_HA
}
property = RT_CONSTANT(opline, opline->op2);
result = EX_VAR(opline->result.var);
- zend_fetch_property_address(result, container, IS_VAR, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_RW OPLINE_CC);
+ zend_fetch_property_address(result, container, IS_VAR, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_RW, 0, 1 OPLINE_CC EXECUTE_DATA_CC);
if (IS_VAR == IS_VAR) {
FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result);
@@ -22465,12 +22491,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_VAR_CONST_HA
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
+#if 0
+ USE_OPLINE
+#endif
+
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_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
} else {
ZEND_VM_TAIL_CALL(ZEND_FETCH_OBJ_R_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
@@ -22492,7 +22521,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_VAR_CONST
property = RT_CONSTANT(opline, opline->op2);
result = EX_VAR(opline->result.var);
- zend_fetch_property_address(result, container, IS_VAR, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_UNSET OPLINE_CC);
+ zend_fetch_property_address(result, container, IS_VAR, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_UNSET, 0, 1 OPLINE_CC EXECUTE_DATA_CC);
if (IS_VAR == IS_VAR) {
FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result);
@@ -22540,34 +22569,52 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D
value = RT_CONSTANT((opline+1), (opline+1)->op1);
if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
- if (Z_ISREF_P(object)) {
+ if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) {
object = Z_REFVAL_P(object);
- if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
- goto assign_object;
- }
+ goto assign_object;
}
- if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
-
- goto exit_assign_obj;
+ object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC);
+ if (UNEXPECTED(!object)) {
+ value = &EG(uninitialized_zval);
+ goto free_and_exit_assign_obj;
}
}
assign_object:
if (IS_CONST == IS_CONST &&
EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(opline->extended_value))) {
- uintptr_t prop_offset = (uintptr_t)CACHED_PTR(opline->extended_value + sizeof(void*));
+ void **cache_slot = CACHE_ADDR(opline->extended_value);
+ uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1);
zend_object *zobj = Z_OBJ_P(object);
zval *property_val;
if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
property_val = OBJ_PROP(zobj, prop_offset);
if (Z_TYPE_P(property_val) != IS_UNDEF) {
+ zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2);
+
+ if (UNEXPECTED(prop_info != NULL)) {
+ zend_uchar orig_type = IS_UNDEF;
+
+ if (IS_CONST == IS_CONST) {
+ orig_type = Z_TYPE_P(value);
+ }
+
+ value = zend_assign_to_typed_prop(prop_info, property_val, value EXECUTE_DATA_CC);
+
+ /* will remain valid, thus no need to check prop_info in future here */
+ if (IS_CONST == IS_CONST && Z_TYPE_P(value) == orig_type) {
+ CACHE_PTR_EX(cache_slot + 2, NULL);
+ }
+ goto free_and_exit_assign_obj;
+ } else {
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);
+ value = zend_assign_to_variable(property_val, value, IS_CONST, EX_USES_STRICT_TYPES());
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+ ZVAL_COPY(EX_VAR(opline->result.var), value);
+ }
+ goto exit_assign_obj;
}
- goto exit_assign_obj;
}
} else {
if (EXPECTED(zobj->properties != NULL)) {
@@ -22621,18 +22668,13 @@ fast_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_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL);
+ value = Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL);
+free_and_exit_assign_obj:
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
}
@@ -22644,6 +22686,7 @@ exit_assign_obj:
ZEND_VM_NEXT_OPCODE_EX(1, 2);
}
+/* No specialization for op_types (CONST|TMPVAR|CV, UNUSED|CONST|VAR) */
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_DATA_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -22661,34 +22704,52 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D
value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
- if (Z_ISREF_P(object)) {
+ if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) {
object = Z_REFVAL_P(object);
- if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
- goto assign_object;
- }
+ goto assign_object;
}
- if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
- zval_ptr_dtor_nogc(free_op_data);
- goto exit_assign_obj;
+ object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC);
+ if (UNEXPECTED(!object)) {
+ value = &EG(uninitialized_zval);
+ goto free_and_exit_assign_obj;
}
}
assign_object:
if (IS_CONST == IS_CONST &&
EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(opline->extended_value))) {
- uintptr_t prop_offset = (uintptr_t)CACHED_PTR(opline->extended_value + sizeof(void*));
+ void **cache_slot = CACHE_ADDR(opline->extended_value);
+ uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1);
zend_object *zobj = Z_OBJ_P(object);
zval *property_val;
if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
property_val = OBJ_PROP(zobj, prop_offset);
if (Z_TYPE_P(property_val) != IS_UNDEF) {
+ zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2);
+
+ if (UNEXPECTED(prop_info != NULL)) {
+ zend_uchar orig_type = IS_UNDEF;
+
+ if (IS_TMP_VAR == IS_CONST) {
+ orig_type = Z_TYPE_P(value);
+ }
+
+ value = zend_assign_to_typed_prop(prop_info, property_val, value EXECUTE_DATA_CC);
+
+ /* will remain valid, thus no need to check prop_info in future here */
+ if (IS_TMP_VAR == IS_CONST && Z_TYPE_P(value) == orig_type) {
+ CACHE_PTR_EX(cache_slot + 2, NULL);
+ }
+ goto free_and_exit_assign_obj;
+ } else {
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);
+ value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES());
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+ ZVAL_COPY(EX_VAR(opline->result.var), value);
+ }
+ goto exit_assign_obj;
}
- goto exit_assign_obj;
}
} else {
if (EXPECTED(zobj->properties != NULL)) {
@@ -22742,18 +22803,13 @@ fast_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_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL);
+ value = Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL);
+free_and_exit_assign_obj:
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
}
@@ -22765,6 +22821,7 @@ exit_assign_obj:
ZEND_VM_NEXT_OPCODE_EX(1, 2);
}
+/* No specialization for op_types (CONST|TMPVAR|CV, UNUSED|CONST|VAR) */
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -22782,34 +22839,52 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D
value = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
- if (Z_ISREF_P(object)) {
+ if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) {
object = Z_REFVAL_P(object);
- if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
- goto assign_object;
- }
+ goto assign_object;
}
- if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
- zval_ptr_dtor_nogc(free_op_data);
- goto exit_assign_obj;
+ object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC);
+ if (UNEXPECTED(!object)) {
+ value = &EG(uninitialized_zval);
+ goto free_and_exit_assign_obj;
}
}
assign_object:
if (IS_CONST == IS_CONST &&
EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(opline->extended_value))) {
- uintptr_t prop_offset = (uintptr_t)CACHED_PTR(opline->extended_value + sizeof(void*));
+ void **cache_slot = CACHE_ADDR(opline->extended_value);
+ uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1);
zend_object *zobj = Z_OBJ_P(object);
zval *property_val;
if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
property_val = OBJ_PROP(zobj, prop_offset);
if (Z_TYPE_P(property_val) != IS_UNDEF) {
+ zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2);
+
+ if (UNEXPECTED(prop_info != NULL)) {
+ zend_uchar orig_type = IS_UNDEF;
+
+ if (IS_VAR == IS_CONST) {
+ orig_type = Z_TYPE_P(value);
+ }
+
+ value = zend_assign_to_typed_prop(prop_info, property_val, value EXECUTE_DATA_CC);
+
+ /* will remain valid, thus no need to check prop_info in future here */
+ if (IS_VAR == IS_CONST && Z_TYPE_P(value) == orig_type) {
+ CACHE_PTR_EX(cache_slot + 2, NULL);
+ }
+ goto free_and_exit_assign_obj;
+ } else {
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);
+ value = zend_assign_to_variable(property_val, value, IS_VAR, EX_USES_STRICT_TYPES());
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+ ZVAL_COPY(EX_VAR(opline->result.var), value);
+ }
+ goto exit_assign_obj;
}
- goto exit_assign_obj;
}
} else {
if (EXPECTED(zobj->properties != NULL)) {
@@ -22863,18 +22938,13 @@ fast_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_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL);
+ value = Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL);
+free_and_exit_assign_obj:
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
}
@@ -22886,6 +22956,7 @@ exit_assign_obj:
ZEND_VM_NEXT_OPCODE_EX(1, 2);
}
+/* No specialization for op_types (CONST|TMPVAR|CV, UNUSED|CONST|VAR) */
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -22903,34 +22974,52 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D
value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC);
if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
- if (Z_ISREF_P(object)) {
+ if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) {
object = Z_REFVAL_P(object);
- if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
- goto assign_object;
- }
+ goto assign_object;
}
- if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
-
- goto exit_assign_obj;
+ object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC);
+ if (UNEXPECTED(!object)) {
+ value = &EG(uninitialized_zval);
+ goto free_and_exit_assign_obj;
}
}
assign_object:
if (IS_CONST == IS_CONST &&
EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(opline->extended_value))) {
- uintptr_t prop_offset = (uintptr_t)CACHED_PTR(opline->extended_value + sizeof(void*));
+ void **cache_slot = CACHE_ADDR(opline->extended_value);
+ uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1);
zend_object *zobj = Z_OBJ_P(object);
zval *property_val;
if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
property_val = OBJ_PROP(zobj, prop_offset);
if (Z_TYPE_P(property_val) != IS_UNDEF) {
+ zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2);
+
+ if (UNEXPECTED(prop_info != NULL)) {
+ zend_uchar orig_type = IS_UNDEF;
+
+ if (IS_CV == IS_CONST) {
+ orig_type = Z_TYPE_P(value);
+ }
+
+ value = zend_assign_to_typed_prop(prop_info, property_val, value EXECUTE_DATA_CC);
+
+ /* will remain valid, thus no need to check prop_info in future here */
+ if (IS_CV == IS_CONST && Z_TYPE_P(value) == orig_type) {
+ CACHE_PTR_EX(cache_slot + 2, NULL);
+ }
+ goto free_and_exit_assign_obj;
+ } else {
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);
+ value = zend_assign_to_variable(property_val, value, IS_CV, EX_USES_STRICT_TYPES());
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+ ZVAL_COPY(EX_VAR(opline->result.var), value);
+ }
+ goto exit_assign_obj;
}
- goto exit_assign_obj;
}
} else {
if (EXPECTED(zobj->properties != NULL)) {
@@ -22984,18 +23073,13 @@ fast_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_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL);
+ value = Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL);
+free_and_exit_assign_obj:
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
}
@@ -23007,30 +23091,30 @@ exit_assign_obj:
ZEND_VM_NEXT_OPCODE_EX(1, 2);
}
+/* No specialization for op_types (CONST|TMPVAR|CV, UNUSED|CONST|VAR) */
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_DATA_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zend_free_op free_op1;
- zval *object_ptr;
+ zval *object_ptr, *orig_object_ptr;
zend_free_op free_op_data;
zval *value;
zval *variable_ptr;
zval *dim;
SAVE_OPLINE();
- object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ orig_object_ptr = object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) {
try_assign_dim_array:
+ value = RT_CONSTANT((opline+1), (opline+1)->op1);
SEPARATE_ARRAY(object_ptr);
if (IS_CONST == 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) {
@@ -23059,8 +23143,7 @@ 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 = zend_assign_to_variable(variable_ptr, value, IS_CONST, EX_USES_STRICT_TYPES());
}
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
@@ -23085,9 +23168,7 @@ try_assign_dim_array:
if (IS_CONST == IS_UNUSED) {
zend_use_new_element_for_string();
- if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
UNDEF_RESULT();
- HANDLE_EXCEPTION();
} else {
dim = RT_CONSTANT(opline, opline->op2);
value = RT_CONSTANT((opline+1), (opline+1)->op1);
@@ -23095,8 +23176,16 @@ try_assign_dim_array:
}
} else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) {
- ZVAL_ARR(object_ptr, zend_new_array(8));
- goto try_assign_dim_array;
+ if (Z_ISREF_P(orig_object_ptr)
+ && ZEND_REF_HAS_TYPE_SOURCES(Z_REF_P(orig_object_ptr))
+ && !zend_verify_ref_array_assignable(Z_REF_P(orig_object_ptr))) {
+ dim = RT_CONSTANT(opline, opline->op2);
+
+ UNDEF_RESULT();
+ } else {
+ 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();
@@ -23121,26 +23210,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D
{
USE_OPLINE
zend_free_op free_op1;
- zval *object_ptr;
+ zval *object_ptr, *orig_object_ptr;
zend_free_op free_op_data;
zval *value;
zval *variable_ptr;
zval *dim;
SAVE_OPLINE();
- object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ orig_object_ptr = object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) {
try_assign_dim_array:
+ value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
SEPARATE_ARRAY(object_ptr);
if (IS_CONST == 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) {
@@ -23169,8 +23257,7 @@ 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 = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR, EX_USES_STRICT_TYPES());
}
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
@@ -23196,9 +23283,7 @@ try_assign_dim_array:
if (IS_CONST == 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 = RT_CONSTANT(opline, opline->op2);
value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
@@ -23206,8 +23291,16 @@ try_assign_dim_array:
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;
+ if (Z_ISREF_P(orig_object_ptr)
+ && ZEND_REF_HAS_TYPE_SOURCES(Z_REF_P(orig_object_ptr))
+ && !zend_verify_ref_array_assignable(Z_REF_P(orig_object_ptr))) {
+ dim = RT_CONSTANT(opline, opline->op2);
+ zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
+ UNDEF_RESULT();
+ } else {
+ 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();
@@ -23232,26 +23325,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D
{
USE_OPLINE
zend_free_op free_op1;
- zval *object_ptr;
+ zval *object_ptr, *orig_object_ptr;
zend_free_op free_op_data;
zval *value;
zval *variable_ptr;
zval *dim;
SAVE_OPLINE();
- object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ orig_object_ptr = object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) {
try_assign_dim_array:
+ value = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
SEPARATE_ARRAY(object_ptr);
if (IS_CONST == 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) {
@@ -23280,8 +23372,7 @@ 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 = zend_assign_to_variable(variable_ptr, value, IS_VAR, EX_USES_STRICT_TYPES());
}
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
@@ -23307,9 +23398,7 @@ try_assign_dim_array:
if (IS_CONST == 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 = RT_CONSTANT(opline, opline->op2);
value = _get_zval_ptr_var_deref((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
@@ -23317,8 +23406,16 @@ try_assign_dim_array:
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;
+ if (Z_ISREF_P(orig_object_ptr)
+ && ZEND_REF_HAS_TYPE_SOURCES(Z_REF_P(orig_object_ptr))
+ && !zend_verify_ref_array_assignable(Z_REF_P(orig_object_ptr))) {
+ dim = RT_CONSTANT(opline, opline->op2);
+ zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
+ UNDEF_RESULT();
+ } else {
+ 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();
@@ -23343,26 +23440,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D
{
USE_OPLINE
zend_free_op free_op1;
- zval *object_ptr;
+ zval *object_ptr, *orig_object_ptr;
zend_free_op free_op_data;
zval *value;
zval *variable_ptr;
zval *dim;
SAVE_OPLINE();
- object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ orig_object_ptr = object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) {
try_assign_dim_array:
+ value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC);
SEPARATE_ARRAY(object_ptr);
if (IS_CONST == 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) {
@@ -23391,8 +23487,7 @@ 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 = zend_assign_to_variable(variable_ptr, value, IS_CV, EX_USES_STRICT_TYPES());
}
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
@@ -23417,9 +23512,7 @@ try_assign_dim_array:
if (IS_CONST == IS_UNUSED) {
zend_use_new_element_for_string();
- if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
UNDEF_RESULT();
- HANDLE_EXCEPTION();
} else {
dim = RT_CONSTANT(opline, opline->op2);
value = _get_zval_ptr_cv_deref_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC);
@@ -23427,8 +23520,16 @@ try_assign_dim_array:
}
} else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) {
- ZVAL_ARR(object_ptr, zend_new_array(8));
- goto try_assign_dim_array;
+ if (Z_ISREF_P(orig_object_ptr)
+ && ZEND_REF_HAS_TYPE_SOURCES(Z_REF_P(orig_object_ptr))
+ && !zend_verify_ref_array_assignable(Z_REF_P(orig_object_ptr))) {
+ dim = RT_CONSTANT(opline, opline->op2);
+
+ UNDEF_RESULT();
+ } else {
+ 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();
@@ -23466,7 +23567,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SPEC_VAR_CONST_RETVAL_U
ZVAL_NULL(EX_VAR(opline->result.var));
}
} else {
- value = zend_assign_to_variable(variable_ptr, value, IS_CONST);
+ value = zend_assign_to_variable(variable_ptr, value, IS_CONST, EX_USES_STRICT_TYPES());
if (UNEXPECTED(0)) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
}
@@ -23494,7 +23595,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SPEC_VAR_CONST_RETVAL_U
ZVAL_NULL(EX_VAR(opline->result.var));
}
} else {
- value = zend_assign_to_variable(variable_ptr, value, IS_CONST);
+ value = zend_assign_to_variable(variable_ptr, value, IS_CONST, EX_USES_STRICT_TYPES());
if (UNEXPECTED(1)) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
}
@@ -23505,12 +23606,98 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SPEC_VAR_CONST_RETVAL_U
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op1, free_op_data;
+ zval *property, *container, *value_ptr;
+
+ SAVE_OPLINE();
+
+ container = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+
+ if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
+ ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
+ }
+
+ property = RT_CONSTANT(opline, opline->op2);
+
+ value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
+
+ if (1) {
+ if (IS_VAR == IS_UNUSED) {
+ if (IS_CONST == IS_CONST) {
+ zend_assign_to_property_reference_this_const(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ } else {
+ zend_assign_to_property_reference_this_var(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ }
+ } else {
+ if (IS_CONST == IS_CONST) {
+ zend_assign_to_property_reference_var_const(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ } else {
+ zend_assign_to_property_reference_var_var(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ }
+ }
+ } else {
+ zend_assign_to_property_reference(container, IS_VAR, property, IS_CONST, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ }
+
+ if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
+
+ if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);};
+ ZEND_VM_NEXT_OPCODE_EX(1, 2);
+}
+
+/* No specialization for op_types (CONST|TMPVAR|CV, UNUSED|CONST|VAR) */
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op1;
+ zval *property, *container, *value_ptr;
+
+ SAVE_OPLINE();
+
+ container = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+
+ if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
+ ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
+ }
+
+ property = RT_CONSTANT(opline, opline->op2);
+
+ value_ptr = _get_zval_ptr_cv_BP_VAR_W((opline+1)->op1.var EXECUTE_DATA_CC);
+
+ if (1) {
+ if (IS_VAR == IS_UNUSED) {
+ if (IS_CONST == IS_CONST) {
+ zend_assign_to_property_reference_this_const(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ } else {
+ zend_assign_to_property_reference_this_var(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ }
+ } else {
+ if (IS_CONST == IS_CONST) {
+ zend_assign_to_property_reference_var_const(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ } else {
+ zend_assign_to_property_reference_var_var(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ }
+ }
+ } else {
+ zend_assign_to_property_reference(container, IS_VAR, property, IS_CONST, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ }
+
+ if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
+
+
+ ZEND_VM_NEXT_OPCODE_EX(1, 2);
+}
+
+/* No specialization for op_types (CONST|TMPVAR|CV, UNUSED|CONST|VAR) */
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zval *function_name;
zend_class_entry *ce;
- zend_object *object;
+ uint32_t call_info;
zend_function *fbc;
zend_execute_data *call;
@@ -23520,7 +23707,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_V
/* 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);
+ ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op1)), Z_STR_P(RT_CONSTANT(opline, opline->op1) + 1), ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
if (UNEXPECTED(ce == NULL)) {
ZEND_ASSERT(EG(exception));
@@ -23562,7 +23749,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_V
break;
}
} else if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(function_name) == IS_UNDEF)) {
- GET_OP2_UNDEF_CV(function_name, BP_VAR_R);
+ ZVAL_UNDEFINED_OP2();
if (UNEXPECTED(EG(exception) != NULL)) {
HANDLE_EXCEPTION();
}
@@ -23591,7 +23778,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_V
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)) {
+ if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!RUN_TIME_CACHE(&fbc->op_array))) {
init_func_run_time_cache(&fbc->op_array);
}
if (IS_CONST != IS_CONST) {
@@ -23607,38 +23794,39 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_V
HANDLE_EXCEPTION();
}
fbc = ce->constructor;
- if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
+ if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!RUN_TIME_CACHE(&fbc->op_array))) {
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;
+ ce = (zend_class_entry*)Z_OBJ(EX(This));
+ call_info = ZEND_CALL_NESTED_FUNCTION | ZEND_CALL_HAS_THIS;
} else {
zend_non_static_method_call(fbc);
if (UNEXPECTED(EG(exception) != NULL)) {
HANDLE_EXCEPTION();
}
+ goto check_parent_and_self;
}
- }
-
- if (IS_VAR == IS_UNUSED) {
+ } else {
+check_parent_and_self:
/* 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 (IS_VAR == IS_UNUSED
+ && ((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_info = ZEND_CALL_NESTED_FUNCTION;
}
- call = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
- fbc, opline->extended_value, ce, object);
+ call = zend_vm_stack_push_call_frame(call_info,
+ fbc, opline->extended_value, ce);
call->prev_execute_data = EX(call);
EX(call) = call;
@@ -23662,7 +23850,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_CLASS_CONSTANT_SPEC_VAR_
} 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);
+ ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op1)), Z_STR_P(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));
@@ -23792,8 +23980,12 @@ num_index:
} else if (Z_TYPE_P(offset) == IS_TRUE) {
hval = 1;
goto num_index;
+ } else if (Z_TYPE_P(offset) == IS_RESOURCE) {
+ zend_use_resource_as_offset(offset);
+ hval = Z_RES_HANDLE_P(offset);
+ goto num_index;
} else if (IS_CONST == IS_CV && Z_TYPE_P(offset) == IS_UNDEF) {
- GET_OP2_UNDEF_CV(offset, BP_VAR_R);
+ ZVAL_UNDEFINED_OP2();
str = ZSTR_EMPTY_ALLOC();
goto str_index;
} else {
@@ -23826,7 +24018,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_VAR_CONST_HAND
}
ZEND_VM_TAIL_CALL(ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
} else {
- ZVAL_EMPTY_ARRAY(array);
+ ZVAL_ARR(array, zend_new_array(0));
ZEND_VM_NEXT_OPCODE();
}
}
@@ -23888,7 +24080,7 @@ num_index_dim:
hval = Z_RES_HANDLE_P(offset);
goto num_index_dim;
} else if (IS_CONST == IS_CV && Z_TYPE_P(offset) == IS_UNDEF) {
- GET_OP2_UNDEF_CV(offset, BP_VAR_R);
+ ZVAL_UNDEFINED_OP2();
key = ZSTR_EMPTY_ALLOC();
goto str_index_dim;
} else {
@@ -23902,20 +24094,16 @@ num_index_dim:
}
}
if (IS_VAR == IS_CV && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
- container = GET_OP1_UNDEF_CV(container, BP_VAR_R);
+ container = ZVAL_UNDEFINED_OP1();
}
if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(offset) == IS_UNDEF)) {
- offset = GET_OP2_UNDEF_CV(offset, BP_VAR_R);
+ offset = ZVAL_UNDEFINED_OP2();
}
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_CONST == IS_CONST && Z_EXTRA_P(offset) == ZEND_EXTRA_VALUE) {
- offset++;
- }
- Z_OBJ_HT_P(container)->unset_dimension(container, offset);
+ 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)) {
zend_throw_error(NULL, "Cannot unset string offsets");
}
@@ -23944,17 +24132,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_VAR_CONST_HANDL
if (Z_ISREF_P(container)) {
container = Z_REFVAL_P(container);
if (Z_TYPE_P(container) != IS_OBJECT) {
+ if (IS_VAR == IS_CV
+ && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
+ ZVAL_UNDEFINED_OP1();
+ }
break;
}
} else {
break;
}
}
- if (Z_OBJ_HT_P(container)->unset_property) {
- Z_OBJ_HT_P(container)->unset_property(container, offset, ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL));
- } else {
- zend_wrong_property_unset(offset);
- }
+ Z_OBJ_HT_P(container)->unset_property(container, offset, ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL));
} while (0);
if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
@@ -24002,20 +24190,23 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_VAR_CONST_HANDLER(Z
/* If a function call result is yielded and the function did
* not return by reference we throw a notice. */
- if (IS_VAR == 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 {
+ do {
+ if (IS_VAR == IS_VAR) {
+ ZEND_ASSERT(value_ptr != &EG(uninitialized_zval));
+ if (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);
+ break;
+ }
+ }
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));
- }
+ } while (0);
if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
}
@@ -24105,48 +24296,50 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IN_ARRAY_SPEC_VAR_CONST_HANDLE
zend_free_op free_op1;
zval *op1;
HashTable *ht = Z_ARRVAL_P(RT_CONSTANT(opline, opline->op2));
- int result;
+ zval *result;
SAVE_OPLINE();
op1 = _get_zval_ptr_var_deref(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
- result = zend_hash_exists(ht, Z_STR_P(op1));
+ result = zend_hash_find_ex(ht, Z_STR_P(op1), IS_VAR == IS_CONST);
} else if (opline->extended_value) {
if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
- result = zend_hash_index_exists(ht, Z_LVAL_P(op1));
+ result = zend_hash_index_find(ht, Z_LVAL_P(op1));
} else {
- result = 0;
+ result = NULL;
}
} else if (Z_TYPE_P(op1) <= IS_FALSE) {
- result = zend_hash_exists(ht, ZSTR_EMPTY_ALLOC());
+ result = zend_hash_find_ex(ht, ZSTR_EMPTY_ALLOC(), 1);
} else {
zend_string *key;
- zval key_tmp, result_tmp;
+ zval key_tmp, result_tmp, *val;
- result = 0;
- ZEND_HASH_FOREACH_STR_KEY(ht, key) {
+ result = NULL;
+ ZEND_HASH_FOREACH_STR_KEY_VAL(ht, key, val) {
ZVAL_STR(&key_tmp, key);
compare_function(&result_tmp, op1, &key_tmp);
if (Z_LVAL(result_tmp) == 0) {
- result = 1;
+ result = val;
break;
}
} ZEND_HASH_FOREACH_END();
}
zval_ptr_dtor_nogc(free_op1);
ZEND_VM_SMART_BRANCH(result, 1);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
+ ZVAL_BOOL(EX_VAR(opline->result.var), result != NULL);
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_ASSIGN_OBJ_OP_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zend_free_op free_op1, free_op2, free_op_data1;
+ zend_free_op free_op1, free_op2, free_op_data;
zval *object;
zval *property;
zval *value;
zval *zptr;
+ void **cache_slot;
+ zend_property_info *prop_info;
SAVE_OPLINE();
object = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
@@ -24158,49 +24351,76 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP
property = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
do {
- value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data1);
+ value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data);
if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
- if (Z_ISREF_P(object)) {
+ if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) {
object = Z_REFVAL_P(object);
- if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
- goto assign_op_object;
- }
+ goto assign_op_object;
}
- if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
+ if (IS_VAR == IS_CV
+ && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
+ ZVAL_UNDEFINED_OP1();
+ }
+ object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC);
+ if (UNEXPECTED(!object)) {
break;
}
}
- /* here we are sure we are dealing with an object */
assign_op_object:
- if (EXPECTED(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)) {
+ /* here we are sure we are dealing with an object */
+ cache_slot = ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR((opline+1)->extended_value) : NULL;
+ if (EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, cache_slot)) != NULL)) {
if (UNEXPECTED(Z_ISERROR_P(zptr))) {
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_NULL(EX_VAR(opline->result.var));
}
} else {
- ZVAL_DEREF(zptr);
+ zval *orig_zptr = zptr;
+ zend_reference *ref;
+
+ do {
+ if (UNEXPECTED(Z_ISREF_P(zptr))) {
+ ref = Z_REF_P(zptr);
+ zptr = Z_REFVAL_P(zptr);
+ if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) {
+ zend_binary_assign_op_typed_ref(ref, value OPLINE_CC EXECUTE_DATA_CC);
+ break;
+ }
+ }
+
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
+ prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2);
+ } else {
+ prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(object), orig_zptr);
+ }
+ if (UNEXPECTED(prop_info)) {
+ /* special case for typed properties */
+ zend_binary_assign_op_typed_prop(prop_info, zptr, value OPLINE_CC EXECUTE_DATA_CC);
+ } else {
+ zend_binary_op(zptr, zptr, value OPLINE_CC);
+ }
+ } while (0);
- binary_op(zptr, zptr, value);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), zptr);
}
}
} else {
- zend_assign_op_overloaded_property(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR((opline+1)->extended_value) : NULL), value, binary_op OPLINE_CC EXECUTE_DATA_CC);
+ zend_assign_op_overloaded_property(object, property, cache_slot, value OPLINE_CC EXECUTE_DATA_CC);
}
} while (0);
- FREE_OP(free_op_data1);
+ FREE_OP(free_op_data);
zval_ptr_dtor_nogc(free_op2);
if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
/* assign_obj has two opcodes! */
ZEND_VM_NEXT_OPCODE_EX(1, 2);
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SPEC_VAR_TMPVAR(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC)
+/* No specialization for op_types (CONST|TMP|VAR|CV, UNUSED|CONST|TMPVAR) */
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_OP_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zend_free_op free_op1, free_op2, free_op_data1;
@@ -24230,68 +24450,62 @@ assign_dim_op_new_array:
if (UNEXPECTED(!var_ptr)) {
goto assign_dim_op_ret_null;
}
- ZVAL_DEREF(var_ptr);
}
value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data1);
- binary_op(var_ptr, var_ptr, value);
+ do {
+ if ((IS_TMP_VAR|IS_VAR) != IS_UNUSED && UNEXPECTED(Z_ISREF_P(var_ptr))) {
+ zend_reference *ref = Z_REF_P(var_ptr);
+ var_ptr = Z_REFVAL_P(var_ptr);
+ if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) {
+ zend_binary_assign_op_typed_ref(ref, value OPLINE_CC EXECUTE_DATA_CC);
+ break;
+ }
+ }
+ zend_binary_op(var_ptr, var_ptr, value OPLINE_CC);
+ } while (0);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);
}
+ FREE_OP(free_op_data1);
} 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);
+ zend_binary_assign_op_obj_dim(container, dim OPLINE_CC EXECUTE_DATA_CC);
+ } else if (EXPECTED(Z_TYPE_P(container) <= IS_FALSE)) {
+ if (IS_VAR == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(container) == IS_UNDEF)) {
+ ZVAL_UNDEFINED_OP1();
+ }
+ ZVAL_ARR(container, zend_new_array(8));
+ goto assign_dim_op_new_array;
} 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();
- }
+ zend_binary_assign_op_dim_slow(container, dim OPLINE_CC EXECUTE_DATA_CC);
assign_dim_op_ret_null:
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
+ 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)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OP_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zend_free_op free_op1, free_op2;
@@ -24307,9 +24521,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_simple_helper
ZVAL_NULL(EX_VAR(opline->result.var));
}
} else {
- ZVAL_DEREF(var_ptr);
-
- binary_op(var_ptr, var_ptr, value);
+ do {
+ if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) {
+ zend_reference *ref = Z_REF_P(var_ptr);
+ var_ptr = Z_REFVAL_P(var_ptr);
+ if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) {
+ zend_binary_assign_op_typed_ref(ref, value OPLINE_CC EXECUTE_DATA_CC);
+ break;
+ }
+ }
+ zend_binary_op(var_ptr, var_ptr, value OPLINE_CC);
+ } while (0);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);
@@ -24321,262 +24543,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_simple_helper
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)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_OBJ_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zend_free_op free_op1, free_op2;
zval *object;
zval *property;
zval *zptr;
+ void **cache_slot;
+ zend_property_info *prop_info;
SAVE_OPLINE();
object = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
@@ -24589,47 +24564,38 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE
do {
if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
- if (Z_ISREF_P(object)) {
+ if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) {
object = Z_REFVAL_P(object);
- if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
- goto pre_incdec_object;
- }
+ goto pre_incdec_object;
}
- if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
+ if (IS_VAR == IS_CV
+ && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
+ ZVAL_UNDEFINED_OP1();
+ }
+ object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC);
+ if (UNEXPECTED(!object)) {
break;
}
}
- /* here we are sure we are dealing with an object */
pre_incdec_object:
- if (EXPECTED(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)) {
+ /* here we are sure we are dealing with an object */
+ cache_slot = ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL;
+ if (EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, cache_slot)) != NULL)) {
if (UNEXPECTED(Z_ISERROR_P(zptr))) {
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_NULL(EX_VAR(opline->result.var));
}
} else {
- if (EXPECTED(Z_TYPE_P(zptr) == IS_LONG)) {
- if (inc) {
- fast_long_increment_function(zptr);
- } else {
- fast_long_decrement_function(zptr);
- }
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
+ prop_info = (zend_property_info *) CACHED_PTR_EX(cache_slot + 2);
} else {
- ZVAL_DEREF(zptr);
-
- if (inc) {
- increment_function(zptr);
- } else {
- decrement_function(zptr);
- }
- }
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY(EX_VAR(opline->result.var), zptr);
+ prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(object), zptr);
}
+ zend_pre_incdec_property_zval(zptr, prop_info OPLINE_CC EXECUTE_DATA_CC);
}
} else {
- zend_pre_incdec_overloaded_property(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), inc OPLINE_CC EXECUTE_DATA_CC);
+ zend_pre_incdec_overloaded_property(object, property, cache_slot OPLINE_CC EXECUTE_DATA_CC);
}
} while (0);
@@ -24638,23 +24604,15 @@ pre_incdec_object:
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)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_OBJ_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zend_free_op free_op1, free_op2;
zval *object;
zval *property;
zval *zptr;
+ void **cache_slot;
+ zend_property_info *prop_info;
SAVE_OPLINE();
object = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
@@ -24667,43 +24625,37 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP
do {
if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
- if (Z_ISREF_P(object)) {
+ if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) {
object = Z_REFVAL_P(object);
- if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
- goto post_incdec_object;
- }
+ goto post_incdec_object;
}
- if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
+ if (IS_VAR == IS_CV
+ && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
+ ZVAL_UNDEFINED_OP1();
+ }
+ object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC);
+ if (UNEXPECTED(!object)) {
break;
}
}
- /* here we are sure we are dealing with an object */
post_incdec_object:
- if (EXPECTED(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)) {
+ /* here we are sure we are dealing with an object */
+ cache_slot = ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL;
+ if (EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, cache_slot)) != NULL)) {
if (UNEXPECTED(Z_ISERROR_P(zptr))) {
ZVAL_NULL(EX_VAR(opline->result.var));
} else {
- if (EXPECTED(Z_TYPE_P(zptr) == IS_LONG)) {
- ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(zptr));
- if (inc) {
- fast_long_increment_function(zptr);
- } else {
- fast_long_decrement_function(zptr);
- }
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
+ prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2);
} else {
- ZVAL_DEREF(zptr);
- ZVAL_COPY(EX_VAR(opline->result.var), zptr);
- if (inc) {
- increment_function(zptr);
- } else {
- decrement_function(zptr);
- }
+ prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(object), zptr);
}
+
+ zend_post_incdec_property_zval(zptr, prop_info OPLINE_CC EXECUTE_DATA_CC);
}
} else {
- zend_post_incdec_overloaded_property(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), inc OPLINE_CC EXECUTE_DATA_CC);
+ zend_post_incdec_overloaded_property(object, property, cache_slot OPLINE_CC EXECUTE_DATA_CC);
}
} while (0);
@@ -24712,16 +24664,6 @@ post_incdec_object:
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
@@ -24758,6 +24700,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_RW_SPEC_VAR_TMPVAR_H
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
+#if 0
+ USE_OPLINE
+#endif
+
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));
@@ -24803,7 +24749,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_TMPVAR_HA
property = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
result = EX_VAR(opline->result.var);
- zend_fetch_property_address(result, container, IS_VAR, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_W OPLINE_CC);
+ zend_fetch_property_address(
+ result, container, IS_VAR, property, (IS_TMP_VAR|IS_VAR),
+ (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_FETCH_OBJ_FLAGS) : NULL),
+ BP_VAR_W, opline->extended_value & ZEND_FETCH_OBJ_FLAGS, 1 OPLINE_CC EXECUTE_DATA_CC);
zval_ptr_dtor_nogc(free_op2);
if (IS_VAR == IS_VAR) {
FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result);
@@ -24825,7 +24774,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_VAR_TMPVAR_H
}
property = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
result = EX_VAR(opline->result.var);
- zend_fetch_property_address(result, container, IS_VAR, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_RW OPLINE_CC);
+ zend_fetch_property_address(result, container, IS_VAR, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_RW, 0, 1 OPLINE_CC EXECUTE_DATA_CC);
zval_ptr_dtor_nogc(free_op2);
if (IS_VAR == IS_VAR) {
FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result);
@@ -24835,12 +24784,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_VAR_TMPVAR_H
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
+#if 0
+ USE_OPLINE
+#endif
+
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));
@@ -24862,7 +24814,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_VAR_TMPVA
property = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
result = EX_VAR(opline->result.var);
- zend_fetch_property_address(result, container, IS_VAR, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_UNSET OPLINE_CC);
+ zend_fetch_property_address(result, container, IS_VAR, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_UNSET, 0, 1 OPLINE_CC EXECUTE_DATA_CC);
zval_ptr_dtor_nogc(free_op2);
if (IS_VAR == IS_VAR) {
FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result);
@@ -24911,34 +24863,52 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_
value = RT_CONSTANT((opline+1), (opline+1)->op1);
if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
- if (Z_ISREF_P(object)) {
+ if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) {
object = Z_REFVAL_P(object);
- if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
- goto assign_object;
- }
+ goto assign_object;
}
- if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
-
- goto exit_assign_obj;
+ object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC);
+ if (UNEXPECTED(!object)) {
+ value = &EG(uninitialized_zval);
+ goto free_and_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*));
+ void **cache_slot = CACHE_ADDR(opline->extended_value);
+ uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1);
zend_object *zobj = Z_OBJ_P(object);
zval *property_val;
if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
property_val = OBJ_PROP(zobj, prop_offset);
if (Z_TYPE_P(property_val) != IS_UNDEF) {
+ zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2);
+
+ if (UNEXPECTED(prop_info != NULL)) {
+ zend_uchar orig_type = IS_UNDEF;
+
+ if (IS_CONST == IS_CONST) {
+ orig_type = Z_TYPE_P(value);
+ }
+
+ value = zend_assign_to_typed_prop(prop_info, property_val, value EXECUTE_DATA_CC);
+
+ /* will remain valid, thus no need to check prop_info in future here */
+ if (IS_CONST == IS_CONST && Z_TYPE_P(value) == orig_type) {
+ CACHE_PTR_EX(cache_slot + 2, NULL);
+ }
+ goto free_and_exit_assign_obj;
+ } else {
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);
+ value = zend_assign_to_variable(property_val, value, IS_CONST, EX_USES_STRICT_TYPES());
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+ ZVAL_COPY(EX_VAR(opline->result.var), value);
+ }
+ goto exit_assign_obj;
}
- goto exit_assign_obj;
}
} else {
if (EXPECTED(zobj->properties != NULL)) {
@@ -24992,18 +24962,13 @@ fast_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);
+ value = Z_OBJ_HT_P(object)->write_property(object, property, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL);
+free_and_exit_assign_obj:
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
}
@@ -25015,6 +24980,7 @@ exit_assign_obj:
ZEND_VM_NEXT_OPCODE_EX(1, 2);
}
+/* No specialization for op_types (CONST|TMPVAR|CV, UNUSED|CONST|VAR) */
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_DATA_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -25032,34 +24998,52 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_
value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
- if (Z_ISREF_P(object)) {
+ if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) {
object = Z_REFVAL_P(object);
- if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
- goto assign_object;
- }
+ goto assign_object;
}
- if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
- zval_ptr_dtor_nogc(free_op_data);
- goto exit_assign_obj;
+ object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC);
+ if (UNEXPECTED(!object)) {
+ value = &EG(uninitialized_zval);
+ goto free_and_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*));
+ void **cache_slot = CACHE_ADDR(opline->extended_value);
+ uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1);
zend_object *zobj = Z_OBJ_P(object);
zval *property_val;
if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
property_val = OBJ_PROP(zobj, prop_offset);
if (Z_TYPE_P(property_val) != IS_UNDEF) {
+ zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2);
+
+ if (UNEXPECTED(prop_info != NULL)) {
+ zend_uchar orig_type = IS_UNDEF;
+
+ if (IS_TMP_VAR == IS_CONST) {
+ orig_type = Z_TYPE_P(value);
+ }
+
+ value = zend_assign_to_typed_prop(prop_info, property_val, value EXECUTE_DATA_CC);
+
+ /* will remain valid, thus no need to check prop_info in future here */
+ if (IS_TMP_VAR == IS_CONST && Z_TYPE_P(value) == orig_type) {
+ CACHE_PTR_EX(cache_slot + 2, NULL);
+ }
+ goto free_and_exit_assign_obj;
+ } else {
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);
+ value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES());
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+ ZVAL_COPY(EX_VAR(opline->result.var), value);
+ }
+ goto exit_assign_obj;
}
- goto exit_assign_obj;
}
} else {
if (EXPECTED(zobj->properties != NULL)) {
@@ -25113,18 +25097,13 @@ fast_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);
+ value = Z_OBJ_HT_P(object)->write_property(object, property, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL);
+free_and_exit_assign_obj:
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
}
@@ -25136,6 +25115,7 @@ exit_assign_obj:
ZEND_VM_NEXT_OPCODE_EX(1, 2);
}
+/* No specialization for op_types (CONST|TMPVAR|CV, UNUSED|CONST|VAR) */
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -25153,34 +25133,52 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_
value = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
- if (Z_ISREF_P(object)) {
+ if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) {
object = Z_REFVAL_P(object);
- if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
- goto assign_object;
- }
+ goto assign_object;
}
- if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
- zval_ptr_dtor_nogc(free_op_data);
- goto exit_assign_obj;
+ object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC);
+ if (UNEXPECTED(!object)) {
+ value = &EG(uninitialized_zval);
+ goto free_and_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*));
+ void **cache_slot = CACHE_ADDR(opline->extended_value);
+ uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1);
zend_object *zobj = Z_OBJ_P(object);
zval *property_val;
if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
property_val = OBJ_PROP(zobj, prop_offset);
if (Z_TYPE_P(property_val) != IS_UNDEF) {
+ zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2);
+
+ if (UNEXPECTED(prop_info != NULL)) {
+ zend_uchar orig_type = IS_UNDEF;
+
+ if (IS_VAR == IS_CONST) {
+ orig_type = Z_TYPE_P(value);
+ }
+
+ value = zend_assign_to_typed_prop(prop_info, property_val, value EXECUTE_DATA_CC);
+
+ /* will remain valid, thus no need to check prop_info in future here */
+ if (IS_VAR == IS_CONST && Z_TYPE_P(value) == orig_type) {
+ CACHE_PTR_EX(cache_slot + 2, NULL);
+ }
+ goto free_and_exit_assign_obj;
+ } else {
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);
+ value = zend_assign_to_variable(property_val, value, IS_VAR, EX_USES_STRICT_TYPES());
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+ ZVAL_COPY(EX_VAR(opline->result.var), value);
+ }
+ goto exit_assign_obj;
}
- goto exit_assign_obj;
}
} else {
if (EXPECTED(zobj->properties != NULL)) {
@@ -25234,18 +25232,13 @@ fast_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);
+ value = Z_OBJ_HT_P(object)->write_property(object, property, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL);
+free_and_exit_assign_obj:
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
}
@@ -25257,6 +25250,7 @@ exit_assign_obj:
ZEND_VM_NEXT_OPCODE_EX(1, 2);
}
+/* No specialization for op_types (CONST|TMPVAR|CV, UNUSED|CONST|VAR) */
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -25274,34 +25268,52 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_
value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC);
if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
- if (Z_ISREF_P(object)) {
+ if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) {
object = Z_REFVAL_P(object);
- if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
- goto assign_object;
- }
+ goto assign_object;
}
- if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
-
- goto exit_assign_obj;
+ object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC);
+ if (UNEXPECTED(!object)) {
+ value = &EG(uninitialized_zval);
+ goto free_and_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*));
+ void **cache_slot = CACHE_ADDR(opline->extended_value);
+ uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1);
zend_object *zobj = Z_OBJ_P(object);
zval *property_val;
if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
property_val = OBJ_PROP(zobj, prop_offset);
if (Z_TYPE_P(property_val) != IS_UNDEF) {
+ zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2);
+
+ if (UNEXPECTED(prop_info != NULL)) {
+ zend_uchar orig_type = IS_UNDEF;
+
+ if (IS_CV == IS_CONST) {
+ orig_type = Z_TYPE_P(value);
+ }
+
+ value = zend_assign_to_typed_prop(prop_info, property_val, value EXECUTE_DATA_CC);
+
+ /* will remain valid, thus no need to check prop_info in future here */
+ if (IS_CV == IS_CONST && Z_TYPE_P(value) == orig_type) {
+ CACHE_PTR_EX(cache_slot + 2, NULL);
+ }
+ goto free_and_exit_assign_obj;
+ } else {
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);
+ value = zend_assign_to_variable(property_val, value, IS_CV, EX_USES_STRICT_TYPES());
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+ ZVAL_COPY(EX_VAR(opline->result.var), value);
+ }
+ goto exit_assign_obj;
}
- goto exit_assign_obj;
}
} else {
if (EXPECTED(zobj->properties != NULL)) {
@@ -25355,18 +25367,13 @@ fast_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);
+ value = Z_OBJ_HT_P(object)->write_property(object, property, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL);
+free_and_exit_assign_obj:
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
}
@@ -25378,30 +25385,30 @@ exit_assign_obj:
ZEND_VM_NEXT_OPCODE_EX(1, 2);
}
+/* No specialization for op_types (CONST|TMPVAR|CV, UNUSED|CONST|VAR) */
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;
+ zval *object_ptr, *orig_object_ptr;
zend_free_op free_op2, free_op_data;
zval *value;
zval *variable_ptr;
zval *dim;
SAVE_OPLINE();
- object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ orig_object_ptr = object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) {
try_assign_dim_array:
+ value = RT_CONSTANT((opline+1), (opline+1)->op1);
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) {
@@ -25430,8 +25437,7 @@ 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 = zend_assign_to_variable(variable_ptr, value, IS_CONST, EX_USES_STRICT_TYPES());
}
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
@@ -25456,9 +25462,7 @@ try_assign_dim_array:
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);
@@ -25466,8 +25470,16 @@ try_assign_dim_array:
}
} else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) {
- ZVAL_ARR(object_ptr, zend_new_array(8));
- goto try_assign_dim_array;
+ if (Z_ISREF_P(orig_object_ptr)
+ && ZEND_REF_HAS_TYPE_SOURCES(Z_REF_P(orig_object_ptr))
+ && !zend_verify_ref_array_assignable(Z_REF_P(orig_object_ptr))) {
+ dim = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+
+ UNDEF_RESULT();
+ } else {
+ 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();
@@ -25492,26 +25504,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_
{
USE_OPLINE
zend_free_op free_op1;
- zval *object_ptr;
+ zval *object_ptr, *orig_object_ptr;
zend_free_op free_op2, free_op_data;
zval *value;
zval *variable_ptr;
zval *dim;
SAVE_OPLINE();
- object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ orig_object_ptr = object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) {
try_assign_dim_array:
+ value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
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) {
@@ -25540,8 +25551,7 @@ 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 = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR, EX_USES_STRICT_TYPES());
}
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
@@ -25567,9 +25577,7 @@ try_assign_dim_array:
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);
@@ -25577,8 +25585,16 @@ try_assign_dim_array:
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;
+ if (Z_ISREF_P(orig_object_ptr)
+ && ZEND_REF_HAS_TYPE_SOURCES(Z_REF_P(orig_object_ptr))
+ && !zend_verify_ref_array_assignable(Z_REF_P(orig_object_ptr))) {
+ dim = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
+ UNDEF_RESULT();
+ } else {
+ 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();
@@ -25603,26 +25619,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_
{
USE_OPLINE
zend_free_op free_op1;
- zval *object_ptr;
+ zval *object_ptr, *orig_object_ptr;
zend_free_op free_op2, free_op_data;
zval *value;
zval *variable_ptr;
zval *dim;
SAVE_OPLINE();
- object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ orig_object_ptr = object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) {
try_assign_dim_array:
+ value = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
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) {
@@ -25651,8 +25666,7 @@ 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 = zend_assign_to_variable(variable_ptr, value, IS_VAR, EX_USES_STRICT_TYPES());
}
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
@@ -25678,9 +25692,7 @@ try_assign_dim_array:
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);
@@ -25688,8 +25700,16 @@ try_assign_dim_array:
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;
+ if (Z_ISREF_P(orig_object_ptr)
+ && ZEND_REF_HAS_TYPE_SOURCES(Z_REF_P(orig_object_ptr))
+ && !zend_verify_ref_array_assignable(Z_REF_P(orig_object_ptr))) {
+ dim = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
+ UNDEF_RESULT();
+ } else {
+ 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();
@@ -25714,26 +25734,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_
{
USE_OPLINE
zend_free_op free_op1;
- zval *object_ptr;
+ zval *object_ptr, *orig_object_ptr;
zend_free_op free_op2, free_op_data;
zval *value;
zval *variable_ptr;
zval *dim;
SAVE_OPLINE();
- object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ orig_object_ptr = object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) {
try_assign_dim_array:
+ value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC);
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) {
@@ -25762,8 +25781,7 @@ 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 = zend_assign_to_variable(variable_ptr, value, IS_CV, EX_USES_STRICT_TYPES());
}
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
@@ -25788,9 +25806,7 @@ try_assign_dim_array:
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);
@@ -25798,8 +25814,16 @@ try_assign_dim_array:
}
} else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) {
- ZVAL_ARR(object_ptr, zend_new_array(8));
- goto try_assign_dim_array;
+ if (Z_ISREF_P(orig_object_ptr)
+ && ZEND_REF_HAS_TYPE_SOURCES(Z_REF_P(orig_object_ptr))
+ && !zend_verify_ref_array_assignable(Z_REF_P(orig_object_ptr))) {
+ dim = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+
+ UNDEF_RESULT();
+ } else {
+ 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();
@@ -25820,12 +25844,98 @@ assign_dim_error:
ZEND_VM_NEXT_OPCODE_EX(1, 2);
}
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op1, free_op2, free_op_data;
+ zval *property, *container, *value_ptr;
+
+ 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);
+
+ value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
+
+ if (1) {
+ if (IS_VAR == IS_UNUSED) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
+ zend_assign_to_property_reference_this_const(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ } else {
+ zend_assign_to_property_reference_this_var(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ }
+ } else {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
+ zend_assign_to_property_reference_var_const(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ } else {
+ zend_assign_to_property_reference_var_var(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ }
+ }
+ } else {
+ zend_assign_to_property_reference(container, IS_VAR, property, (IS_TMP_VAR|IS_VAR), value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ }
+
+ if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
+ zval_ptr_dtor_nogc(free_op2);
+ if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);};
+ ZEND_VM_NEXT_OPCODE_EX(1, 2);
+}
+
+/* No specialization for op_types (CONST|TMPVAR|CV, UNUSED|CONST|VAR) */
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op1, free_op2;
+ zval *property, *container, *value_ptr;
+
+ 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);
+
+ value_ptr = _get_zval_ptr_cv_BP_VAR_W((opline+1)->op1.var EXECUTE_DATA_CC);
+
+ if (1) {
+ if (IS_VAR == IS_UNUSED) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
+ zend_assign_to_property_reference_this_const(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ } else {
+ zend_assign_to_property_reference_this_var(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ }
+ } else {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
+ zend_assign_to_property_reference_var_const(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ } else {
+ zend_assign_to_property_reference_var_var(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ }
+ }
+ } else {
+ zend_assign_to_property_reference(container, IS_VAR, property, (IS_TMP_VAR|IS_VAR), value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ }
+
+ if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
+ zval_ptr_dtor_nogc(free_op2);
+
+ ZEND_VM_NEXT_OPCODE_EX(1, 2);
+}
+
+/* No specialization for op_types (CONST|TMPVAR|CV, UNUSED|CONST|VAR) */
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;
+ uint32_t call_info;
zend_function *fbc;
zend_execute_data *call;
@@ -25835,7 +25945,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_V
/* 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);
+ ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op1)), Z_STR_P(RT_CONSTANT(opline, opline->op1) + 1), ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
if (UNEXPECTED(ce == NULL)) {
ZEND_ASSERT(EG(exception));
zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
@@ -25877,7 +25987,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_V
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);
+ ZVAL_UNDEFINED_OP2();
if (UNEXPECTED(EG(exception) != NULL)) {
HANDLE_EXCEPTION();
}
@@ -25906,7 +26016,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_V
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)) {
+ if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!RUN_TIME_CACHE(&fbc->op_array))) {
init_func_run_time_cache(&fbc->op_array);
}
if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
@@ -25922,38 +26032,39 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_V
HANDLE_EXCEPTION();
}
fbc = ce->constructor;
- if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
+ if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!RUN_TIME_CACHE(&fbc->op_array))) {
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;
+ ce = (zend_class_entry*)Z_OBJ(EX(This));
+ call_info = ZEND_CALL_NESTED_FUNCTION | ZEND_CALL_HAS_THIS;
} else {
zend_non_static_method_call(fbc);
if (UNEXPECTED(EG(exception) != NULL)) {
HANDLE_EXCEPTION();
}
+ goto check_parent_and_self;
}
- }
-
- if (IS_VAR == IS_UNUSED) {
+ } else {
+check_parent_and_self:
/* 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 (IS_VAR == IS_UNUSED
+ && ((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_info = ZEND_CALL_NESTED_FUNCTION;
}
- call = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
- fbc, opline->extended_value, ce, object);
+ call = zend_vm_stack_push_call_frame(call_info,
+ fbc, opline->extended_value, ce);
call->prev_execute_data = EX(call);
EX(call) = call;
@@ -26036,8 +26147,12 @@ num_index:
} else if (Z_TYPE_P(offset) == IS_TRUE) {
hval = 1;
goto num_index;
+ } else if (Z_TYPE_P(offset) == IS_RESOURCE) {
+ zend_use_resource_as_offset(offset);
+ hval = Z_RES_HANDLE_P(offset);
+ 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);
+ ZVAL_UNDEFINED_OP2();
str = ZSTR_EMPTY_ALLOC();
goto str_index;
} else {
@@ -26070,7 +26185,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_VAR_TMPVAR_HAN
}
ZEND_VM_TAIL_CALL(ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
} else {
- ZVAL_EMPTY_ARRAY(array);
+ ZVAL_ARR(array, zend_new_array(0));
ZEND_VM_NEXT_OPCODE();
}
}
@@ -26132,7 +26247,7 @@ num_index_dim:
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);
+ ZVAL_UNDEFINED_OP2();
key = ZSTR_EMPTY_ALLOC();
goto str_index_dim;
} else {
@@ -26146,20 +26261,16 @@ num_index_dim:
}
}
if (IS_VAR == IS_CV && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
- container = GET_OP1_UNDEF_CV(container, BP_VAR_R);
+ container = ZVAL_UNDEFINED_OP1();
}
if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(offset) == IS_UNDEF)) {
- offset = GET_OP2_UNDEF_CV(offset, BP_VAR_R);
+ offset = ZVAL_UNDEFINED_OP2();
}
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);
+ 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");
}
@@ -26189,17 +26300,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_VAR_TMPVAR_HAND
if (Z_ISREF_P(container)) {
container = Z_REFVAL_P(container);
if (Z_TYPE_P(container) != IS_OBJECT) {
+ if (IS_VAR == IS_CV
+ && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
+ ZVAL_UNDEFINED_OP1();
+ }
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);
- }
+ Z_OBJ_HT_P(container)->unset_property(container, offset, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL));
} while (0);
zval_ptr_dtor_nogc(free_op2);
@@ -26212,7 +26323,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_IDENTICAL_SPEC_VAR_TMP_HAND
USE_OPLINE
zend_free_op free_op1, free_op2;
zval *op1, *op2;
- int result;
+ zend_bool result;
SAVE_OPLINE();
op1 = _get_zval_ptr_var_deref(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
@@ -26230,7 +26341,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_SPEC_VAR_TMP_
USE_OPLINE
zend_free_op free_op1, free_op2;
zval *op1, *op2;
- int result;
+ zend_bool result;
SAVE_OPLINE();
op1 = _get_zval_ptr_var_deref(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
@@ -26260,7 +26371,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SPEC_VAR_TMP_RETVAL_UNU
ZVAL_NULL(EX_VAR(opline->result.var));
}
} else {
- value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR);
+ value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR, EX_USES_STRICT_TYPES());
if (UNEXPECTED(0)) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
}
@@ -26288,7 +26399,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SPEC_VAR_TMP_RETVAL_USE
ZVAL_NULL(EX_VAR(opline->result.var));
}
} else {
- value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR);
+ value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR, EX_USES_STRICT_TYPES());
if (UNEXPECTED(1)) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
}
@@ -26340,20 +26451,23 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_VAR_TMP_HANDLER(ZEN
/* If a function call result is yielded and the function did
* not return by reference we throw a notice. */
- if (IS_VAR == 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 {
+ do {
+ if (IS_VAR == IS_VAR) {
+ ZEND_ASSERT(value_ptr != &EG(uninitialized_zval));
+ if (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);
+ break;
+ }
+ }
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));
- }
+ } while (0);
if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
}
@@ -26442,7 +26556,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_IDENTICAL_SPEC_VAR_VAR_HAND
USE_OPLINE
zend_free_op free_op1, free_op2;
zval *op1, *op2;
- int result;
+ zend_bool result;
SAVE_OPLINE();
op1 = _get_zval_ptr_var_deref(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
@@ -26460,7 +26574,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_SPEC_VAR_VAR_
USE_OPLINE
zend_free_op free_op1, free_op2;
zval *op1, *op2;
- int result;
+ zend_bool result;
SAVE_OPLINE();
op1 = _get_zval_ptr_var_deref(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
@@ -26490,7 +26604,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SPEC_VAR_VAR_RETVAL_UNU
ZVAL_NULL(EX_VAR(opline->result.var));
}
} else {
- value = zend_assign_to_variable(variable_ptr, value, IS_VAR);
+ value = zend_assign_to_variable(variable_ptr, value, IS_VAR, EX_USES_STRICT_TYPES());
if (UNEXPECTED(0)) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
}
@@ -26518,7 +26632,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SPEC_VAR_VAR_RETVAL_USE
ZVAL_NULL(EX_VAR(opline->result.var));
}
} else {
- value = zend_assign_to_variable(variable_ptr, value, IS_VAR);
+ value = zend_assign_to_variable(variable_ptr, value, IS_VAR, EX_USES_STRICT_TYPES());
if (UNEXPECTED(1)) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
}
@@ -26545,26 +26659,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_VAR_VAR_HANDLE
} else if (IS_VAR == IS_VAR &&
UNEXPECTED(Z_TYPE_P(EX_VAR(opline->op1.var)) != IS_INDIRECT)) {
- zend_throw_error(NULL, "Cannot assign by reference to overloaded object");
- if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
- if (UNEXPECTED(free_op2)) {zval_ptr_dtor_nogc(free_op2);};
- UNDEF_RESULT();
- HANDLE_EXCEPTION();
+ zend_throw_error(NULL, "Cannot assign by reference to an array dimension of an object");
+ variable_ptr = &EG(uninitialized_zval);
} 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();
+ if (UNEXPECTED(!zend_wrong_assign_to_variable_reference(variable_ptr, value_ptr OPLINE_CC EXECUTE_DATA_CC))) {
+ variable_ptr = &EG(uninitialized_zval);
}
-
- /* 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);
}
@@ -26619,20 +26724,23 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_VAR_VAR_HANDLER(ZEN
/* If a function call result is yielded and the function did
* not return by reference we throw a notice. */
- if (IS_VAR == 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 {
+ do {
+ if (IS_VAR == IS_VAR) {
+ ZEND_ASSERT(value_ptr != &EG(uninitialized_zval));
+ if (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);
+ break;
+ }
+ }
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));
- }
+ } while (0);
if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
}
@@ -26716,7 +26824,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_VAR_VAR_HANDLER(ZEN
ZEND_VM_RETURN();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SPEC_VAR_UNUSED(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_OP_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zend_free_op free_op1, free_op_data1;
@@ -26746,149 +26854,60 @@ assign_dim_op_new_array:
if (UNEXPECTED(!var_ptr)) {
goto assign_dim_op_ret_null;
}
- ZVAL_DEREF(var_ptr);
}
value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data1);
- binary_op(var_ptr, var_ptr, value);
+ do {
+ if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_ISREF_P(var_ptr))) {
+ zend_reference *ref = Z_REF_P(var_ptr);
+ var_ptr = Z_REFVAL_P(var_ptr);
+ if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) {
+ zend_binary_assign_op_typed_ref(ref, value OPLINE_CC EXECUTE_DATA_CC);
+ break;
+ }
+ }
+ zend_binary_op(var_ptr, var_ptr, value OPLINE_CC);
+ } while (0);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);
}
+ FREE_OP(free_op_data1);
} 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 = NULL;
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_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);
+ zend_binary_assign_op_obj_dim(container, dim OPLINE_CC EXECUTE_DATA_CC);
+ } else if (EXPECTED(Z_TYPE_P(container) <= IS_FALSE)) {
+ if (IS_VAR == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(container) == IS_UNDEF)) {
+ ZVAL_UNDEFINED_OP1();
+ }
+ ZVAL_ARR(container, zend_new_array(8));
+ goto assign_dim_op_new_array;
} else {
- if (UNEXPECTED(Z_TYPE_P(container) == IS_STRING)) {
- if (IS_UNUSED == 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();
- }
+ zend_binary_assign_op_dim_slow(container, dim OPLINE_CC EXECUTE_DATA_CC);
assign_dim_op_ret_null:
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
+ 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);
}
}
- FREE_OP(free_op_data1);
if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
ZEND_VM_NEXT_OPCODE_EX(1, 2);
}
-static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_SPEC_VAR_UNUSED_DIM(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC)
-{
-#if 1 && IS_UNUSED == IS_UNUSED
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_VAR_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-#else
-# if 0 || IS_VAR != IS_UNUSED
-# if 0
- /* opline->extended_value checks are specialized, don't need opline */
- USE_OPLINE
-# endif
-
- if (EXPECTED(0)) {
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_simple_helper_SPEC_VAR_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
- }
- if (EXPECTED(1)) {
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_VAR_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
- }
-# endif
-
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_VAR_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-#endif
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_VAR_UNUSED_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_UNUSED_DIM(add_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SUB_SPEC_VAR_UNUSED_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_UNUSED_DIM(sub_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MUL_SPEC_VAR_UNUSED_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_UNUSED_DIM(mul_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIV_SPEC_VAR_UNUSED_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_UNUSED_DIM(div_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MOD_SPEC_VAR_UNUSED_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_UNUSED_DIM(mod_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SL_SPEC_VAR_UNUSED_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_UNUSED_DIM(shift_left_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SR_SPEC_VAR_UNUSED_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_UNUSED_DIM(shift_right_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_CONCAT_SPEC_VAR_UNUSED_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_UNUSED_DIM(concat_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_OR_SPEC_VAR_UNUSED_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_UNUSED_DIM(bitwise_or_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_AND_SPEC_VAR_UNUSED_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_UNUSED_DIM(bitwise_and_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_VAR_UNUSED_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_UNUSED_DIM(bitwise_xor_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_POW_SPEC_VAR_UNUSED_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_UNUSED_DIM(pow_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_W_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -26925,6 +26944,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_RW_SPEC_VAR_UNUSED_H
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
+#if 0
+ USE_OPLINE
+#endif
+
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));
@@ -26942,26 +26965,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_
{
USE_OPLINE
zend_free_op free_op1;
- zval *object_ptr;
+ zval *object_ptr, *orig_object_ptr;
zend_free_op free_op_data;
zval *value;
zval *variable_ptr;
zval *dim;
SAVE_OPLINE();
- object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ orig_object_ptr = object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) {
try_assign_dim_array:
+ value = RT_CONSTANT((opline+1), (opline+1)->op1);
SEPARATE_ARRAY(object_ptr);
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_cannot_add_element();
goto assign_dim_error;
} else if (IS_CONST == IS_CV) {
@@ -26990,8 +27012,7 @@ 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 = zend_assign_to_variable(variable_ptr, value, IS_CONST, EX_USES_STRICT_TYPES());
}
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
@@ -27016,9 +27037,7 @@ try_assign_dim_array:
if (IS_UNUSED == IS_UNUSED) {
zend_use_new_element_for_string();
- if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
UNDEF_RESULT();
- HANDLE_EXCEPTION();
} else {
dim = NULL;
value = RT_CONSTANT((opline+1), (opline+1)->op1);
@@ -27026,8 +27045,16 @@ try_assign_dim_array:
}
} else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) {
- ZVAL_ARR(object_ptr, zend_new_array(8));
- goto try_assign_dim_array;
+ if (Z_ISREF_P(orig_object_ptr)
+ && ZEND_REF_HAS_TYPE_SOURCES(Z_REF_P(orig_object_ptr))
+ && !zend_verify_ref_array_assignable(Z_REF_P(orig_object_ptr))) {
+ dim = NULL;
+
+ UNDEF_RESULT();
+ } else {
+ 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();
@@ -27052,26 +27079,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_
{
USE_OPLINE
zend_free_op free_op1;
- zval *object_ptr;
+ zval *object_ptr, *orig_object_ptr;
zend_free_op free_op_data;
zval *value;
zval *variable_ptr;
zval *dim;
SAVE_OPLINE();
- object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ orig_object_ptr = object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) {
try_assign_dim_array:
+ value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
SEPARATE_ARRAY(object_ptr);
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)) {
- zval_ptr_dtor_nogc(free_op_data);
zend_cannot_add_element();
goto assign_dim_error;
} else if (IS_TMP_VAR == IS_CV) {
@@ -27100,8 +27126,7 @@ 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 = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR, EX_USES_STRICT_TYPES());
}
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
@@ -27127,9 +27152,7 @@ try_assign_dim_array:
if (IS_UNUSED == 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 = NULL;
value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
@@ -27137,8 +27160,16 @@ try_assign_dim_array:
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;
+ if (Z_ISREF_P(orig_object_ptr)
+ && ZEND_REF_HAS_TYPE_SOURCES(Z_REF_P(orig_object_ptr))
+ && !zend_verify_ref_array_assignable(Z_REF_P(orig_object_ptr))) {
+ dim = NULL;
+ zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
+ UNDEF_RESULT();
+ } else {
+ 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();
@@ -27163,26 +27194,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_
{
USE_OPLINE
zend_free_op free_op1;
- zval *object_ptr;
+ zval *object_ptr, *orig_object_ptr;
zend_free_op free_op_data;
zval *value;
zval *variable_ptr;
zval *dim;
SAVE_OPLINE();
- object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ orig_object_ptr = object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) {
try_assign_dim_array:
+ value = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
SEPARATE_ARRAY(object_ptr);
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)) {
- zval_ptr_dtor_nogc(free_op_data);
zend_cannot_add_element();
goto assign_dim_error;
} else if (IS_VAR == IS_CV) {
@@ -27211,8 +27241,7 @@ 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 = zend_assign_to_variable(variable_ptr, value, IS_VAR, EX_USES_STRICT_TYPES());
}
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
@@ -27238,9 +27267,7 @@ try_assign_dim_array:
if (IS_UNUSED == 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 = NULL;
value = _get_zval_ptr_var_deref((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
@@ -27248,8 +27275,16 @@ try_assign_dim_array:
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;
+ if (Z_ISREF_P(orig_object_ptr)
+ && ZEND_REF_HAS_TYPE_SOURCES(Z_REF_P(orig_object_ptr))
+ && !zend_verify_ref_array_assignable(Z_REF_P(orig_object_ptr))) {
+ dim = NULL;
+ zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
+ UNDEF_RESULT();
+ } else {
+ 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();
@@ -27274,26 +27309,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_
{
USE_OPLINE
zend_free_op free_op1;
- zval *object_ptr;
+ zval *object_ptr, *orig_object_ptr;
zend_free_op free_op_data;
zval *value;
zval *variable_ptr;
zval *dim;
SAVE_OPLINE();
- object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ orig_object_ptr = object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) {
try_assign_dim_array:
+ value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC);
SEPARATE_ARRAY(object_ptr);
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_cannot_add_element();
goto assign_dim_error;
} else if (IS_CV == IS_CV) {
@@ -27322,8 +27356,7 @@ 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 = zend_assign_to_variable(variable_ptr, value, IS_CV, EX_USES_STRICT_TYPES());
}
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
@@ -27348,9 +27381,7 @@ try_assign_dim_array:
if (IS_UNUSED == IS_UNUSED) {
zend_use_new_element_for_string();
- if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
UNDEF_RESULT();
- HANDLE_EXCEPTION();
} else {
dim = NULL;
value = _get_zval_ptr_cv_deref_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC);
@@ -27358,8 +27389,16 @@ try_assign_dim_array:
}
} else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) {
- ZVAL_ARR(object_ptr, zend_new_array(8));
- goto try_assign_dim_array;
+ if (Z_ISREF_P(orig_object_ptr)
+ && ZEND_REF_HAS_TYPE_SOURCES(Z_REF_P(orig_object_ptr))
+ && !zend_verify_ref_array_assignable(Z_REF_P(orig_object_ptr))) {
+ dim = NULL;
+
+ UNDEF_RESULT();
+ } else {
+ 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();
@@ -27385,7 +27424,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_V
USE_OPLINE
zval *function_name;
zend_class_entry *ce;
- zend_object *object;
+ uint32_t call_info;
zend_function *fbc;
zend_execute_data *call;
@@ -27395,7 +27434,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_V
/* 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);
+ ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op1)), Z_STR_P(RT_CONSTANT(opline, opline->op1) + 1), ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
if (UNEXPECTED(ce == NULL)) {
ZEND_ASSERT(EG(exception));
@@ -27437,7 +27476,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_V
break;
}
} else if (IS_UNUSED == IS_CV && UNEXPECTED(Z_TYPE_P(function_name) == IS_UNDEF)) {
- GET_OP2_UNDEF_CV(function_name, BP_VAR_R);
+ ZVAL_UNDEFINED_OP2();
if (UNEXPECTED(EG(exception) != NULL)) {
HANDLE_EXCEPTION();
}
@@ -27466,7 +27505,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_V
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)) {
+ if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!RUN_TIME_CACHE(&fbc->op_array))) {
init_func_run_time_cache(&fbc->op_array);
}
if (IS_UNUSED != IS_CONST) {
@@ -27482,38 +27521,39 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_V
HANDLE_EXCEPTION();
}
fbc = ce->constructor;
- if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
+ if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!RUN_TIME_CACHE(&fbc->op_array))) {
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;
+ ce = (zend_class_entry*)Z_OBJ(EX(This));
+ call_info = ZEND_CALL_NESTED_FUNCTION | ZEND_CALL_HAS_THIS;
} else {
zend_non_static_method_call(fbc);
if (UNEXPECTED(EG(exception) != NULL)) {
HANDLE_EXCEPTION();
}
+ goto check_parent_and_self;
}
- }
-
- if (IS_VAR == IS_UNUSED) {
+ } else {
+check_parent_and_self:
/* 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 (IS_VAR == IS_UNUSED
+ && ((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_info = ZEND_CALL_NESTED_FUNCTION;
}
- call = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
- fbc, opline->extended_value, ce, object);
+ call = zend_vm_stack_push_call_frame(call_info,
+ fbc, opline->extended_value, ce);
call->prev_execute_data = EX(call);
EX(call) = call;
@@ -27582,7 +27622,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_NEW_SPEC_VAR_UNUSED_HANDLER(ZE
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);
+ ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op1)), Z_STR_P(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));
@@ -27622,17 +27662,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_NEW_SPEC_VAR_UNUSED_HANDLER(ZE
/* 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);
+ opline->extended_value, NULL);
} else {
- if (EXPECTED(constructor->type == ZEND_USER_FUNCTION) && UNEXPECTED(!constructor->op_array.run_time_cache)) {
+ if (EXPECTED(constructor->type == ZEND_USER_FUNCTION) && UNEXPECTED(!RUN_TIME_CACHE(&constructor->op_array))) {
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,
+ ZEND_CALL_FUNCTION | ZEND_CALL_RELEASE_THIS | ZEND_CALL_HAS_THIS,
constructor,
opline->extended_value,
- ce,
Z_OBJ_P(result));
Z_ADDREF_P(result);
}
@@ -27718,8 +27757,12 @@ num_index:
} else if (Z_TYPE_P(offset) == IS_TRUE) {
hval = 1;
goto num_index;
+ } else if (Z_TYPE_P(offset) == IS_RESOURCE) {
+ zend_use_resource_as_offset(offset);
+ hval = Z_RES_HANDLE_P(offset);
+ goto num_index;
} else if (IS_UNUSED == IS_CV && Z_TYPE_P(offset) == IS_UNDEF) {
- GET_OP2_UNDEF_CV(offset, BP_VAR_R);
+ ZVAL_UNDEFINED_OP2();
str = ZSTR_EMPTY_ALLOC();
goto str_index;
} else {
@@ -27752,7 +27795,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_VAR_UNUSED_HAN
}
ZEND_VM_TAIL_CALL(ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
} else {
- ZVAL_EMPTY_ARRAY(array);
+ ZVAL_ARR(array, zend_new_array(0));
ZEND_VM_NEXT_OPCODE();
}
}
@@ -27813,20 +27856,23 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_VAR_UNUSED_HANDLER(
/* If a function call result is yielded and the function did
* not return by reference we throw a notice. */
- if (IS_VAR == 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 {
+ do {
+ if (IS_VAR == IS_VAR) {
+ ZEND_ASSERT(value_ptr != &EG(uninitialized_zval));
+ if (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);
+ break;
+ }
+ }
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));
- }
+ } while (0);
if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
}
@@ -27943,83 +27989,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MAKE_REF_SPEC_VAR_UNUSED_HANDL
ZEND_VM_NEXT_OPCODE();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_COUNT_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1;
- zval *op1;
- zend_long count;
-
- SAVE_OPLINE();
- op1 = _get_zval_ptr_var_deref(opline->op1.var, &free_op1 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_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);
- zval_ptr_dtor_nogc(free_op1);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_GET_CLASS_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
-
- if (IS_VAR == 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 {
- ZVAL_STR_COPY(EX_VAR(opline->result.var), EX(func)->common.scope->name);
- ZEND_VM_NEXT_OPCODE();
- }
- } else {
- zend_free_op free_op1;
- zval *op1;
-
- SAVE_OPLINE();
- op1 = _get_zval_ptr_var_deref(opline->op1.var, &free_op1 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));
- }
- zval_ptr_dtor_nogc(free_op1);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
-}
-
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_GET_TYPE_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -28039,14 +28008,16 @@ 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_binary_assign_op_obj_helper_SPEC_VAR_CV(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_OP_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zend_free_op free_op1, free_op_data1;
+ zend_free_op free_op1, free_op_data;
zval *object;
zval *property;
zval *value;
zval *zptr;
+ void **cache_slot;
+ zend_property_info *prop_info;
SAVE_OPLINE();
object = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
@@ -28058,49 +28029,76 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP
property = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
do {
- value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data1);
+ value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data);
if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
- if (Z_ISREF_P(object)) {
+ if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) {
object = Z_REFVAL_P(object);
- if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
- goto assign_op_object;
- }
+ goto assign_op_object;
}
- if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
+ if (IS_VAR == IS_CV
+ && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
+ ZVAL_UNDEFINED_OP1();
+ }
+ object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC);
+ if (UNEXPECTED(!object)) {
break;
}
}
- /* here we are sure we are dealing with an object */
assign_op_object:
- if (EXPECTED(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)) {
+ /* here we are sure we are dealing with an object */
+ cache_slot = (IS_CV == IS_CONST) ? CACHE_ADDR((opline+1)->extended_value) : NULL;
+ if (EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, cache_slot)) != NULL)) {
if (UNEXPECTED(Z_ISERROR_P(zptr))) {
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_NULL(EX_VAR(opline->result.var));
}
} else {
- ZVAL_DEREF(zptr);
+ zval *orig_zptr = zptr;
+ zend_reference *ref;
+
+ do {
+ if (UNEXPECTED(Z_ISREF_P(zptr))) {
+ ref = Z_REF_P(zptr);
+ zptr = Z_REFVAL_P(zptr);
+ if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) {
+ zend_binary_assign_op_typed_ref(ref, value OPLINE_CC EXECUTE_DATA_CC);
+ break;
+ }
+ }
+
+ if (IS_CV == IS_CONST) {
+ prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2);
+ } else {
+ prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(object), orig_zptr);
+ }
+ if (UNEXPECTED(prop_info)) {
+ /* special case for typed properties */
+ zend_binary_assign_op_typed_prop(prop_info, zptr, value OPLINE_CC EXECUTE_DATA_CC);
+ } else {
+ zend_binary_op(zptr, zptr, value OPLINE_CC);
+ }
+ } while (0);
- binary_op(zptr, zptr, value);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), zptr);
}
}
} else {
- zend_assign_op_overloaded_property(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR((opline+1)->extended_value) : NULL), value, binary_op OPLINE_CC EXECUTE_DATA_CC);
+ zend_assign_op_overloaded_property(object, property, cache_slot, value OPLINE_CC EXECUTE_DATA_CC);
}
} while (0);
- FREE_OP(free_op_data1);
+ FREE_OP(free_op_data);
if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
/* assign_obj has two opcodes! */
ZEND_VM_NEXT_OPCODE_EX(1, 2);
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SPEC_VAR_CV(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC)
+/* No specialization for op_types (CONST|TMP|VAR|CV, UNUSED|CONST|TMPVAR) */
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_OP_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zend_free_op free_op1, free_op_data1;
@@ -28130,67 +28128,61 @@ assign_dim_op_new_array:
if (UNEXPECTED(!var_ptr)) {
goto assign_dim_op_ret_null;
}
- ZVAL_DEREF(var_ptr);
}
value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data1);
- binary_op(var_ptr, var_ptr, value);
+ do {
+ if (IS_CV != IS_UNUSED && UNEXPECTED(Z_ISREF_P(var_ptr))) {
+ zend_reference *ref = Z_REF_P(var_ptr);
+ var_ptr = Z_REFVAL_P(var_ptr);
+ if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) {
+ zend_binary_assign_op_typed_ref(ref, value OPLINE_CC EXECUTE_DATA_CC);
+ break;
+ }
+ }
+ zend_binary_op(var_ptr, var_ptr, value OPLINE_CC);
+ } while (0);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);
}
+ FREE_OP(free_op_data1);
} 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_cv_BP_VAR_R(opline->op2.var 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_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);
+ zend_binary_assign_op_obj_dim(container, dim OPLINE_CC EXECUTE_DATA_CC);
+ } else if (EXPECTED(Z_TYPE_P(container) <= IS_FALSE)) {
+ if (IS_VAR == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(container) == IS_UNDEF)) {
+ ZVAL_UNDEFINED_OP1();
+ }
+ ZVAL_ARR(container, zend_new_array(8));
+ goto assign_dim_op_new_array;
} else {
- if (UNEXPECTED(Z_TYPE_P(container) == IS_STRING)) {
- if (IS_CV == 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();
- }
+ zend_binary_assign_op_dim_slow(container, dim OPLINE_CC EXECUTE_DATA_CC);
assign_dim_op_ret_null:
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
+ 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);
}
}
- 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_CV(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OP_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zend_free_op free_op1;
@@ -28206,9 +28198,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_simple_helper
ZVAL_NULL(EX_VAR(opline->result.var));
}
} else {
- ZVAL_DEREF(var_ptr);
-
- binary_op(var_ptr, var_ptr, value);
+ do {
+ if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) {
+ zend_reference *ref = Z_REF_P(var_ptr);
+ var_ptr = Z_REFVAL_P(var_ptr);
+ if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) {
+ zend_binary_assign_op_typed_ref(ref, value OPLINE_CC EXECUTE_DATA_CC);
+ break;
+ }
+ }
+ zend_binary_op(var_ptr, var_ptr, value OPLINE_CC);
+ } while (0);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);
@@ -28219,262 +28219,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_simple_helper
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_SPEC_VAR_CV(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC)
-{
-#if 1 && IS_CV == IS_UNUSED
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_VAR_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-#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));
- }
- if (EXPECTED(0)) {
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_VAR_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
- }
-# endif
-
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_VAR_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-#endif
-}
-
-static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_SPEC_VAR_CV_DIM(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC)
-{
-#if 1 && IS_CV == IS_UNUSED
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_VAR_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-#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));
- }
- if (EXPECTED(1)) {
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_VAR_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
- }
-# endif
-
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_VAR_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-#endif
-}
-
-static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_SPEC_VAR_CV_OBJ(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC)
-{
-#if 1 && IS_CV == IS_UNUSED
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_VAR_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-#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));
- }
- if (EXPECTED(0)) {
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_VAR_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
- }
-# endif
-
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_VAR_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-#endif
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CV(add_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_VAR_CV_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CV_DIM(add_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_VAR_CV_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CV_OBJ(add_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SUB_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CV(sub_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SUB_SPEC_VAR_CV_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CV_DIM(sub_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SUB_SPEC_VAR_CV_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CV_OBJ(sub_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MUL_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CV(mul_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MUL_SPEC_VAR_CV_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CV_DIM(mul_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MUL_SPEC_VAR_CV_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CV_OBJ(mul_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIV_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CV(div_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIV_SPEC_VAR_CV_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CV_DIM(div_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIV_SPEC_VAR_CV_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CV_OBJ(div_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MOD_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CV(mod_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MOD_SPEC_VAR_CV_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CV_DIM(mod_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MOD_SPEC_VAR_CV_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CV_OBJ(mod_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SL_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CV(shift_left_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SL_SPEC_VAR_CV_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CV_DIM(shift_left_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SL_SPEC_VAR_CV_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CV_OBJ(shift_left_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SR_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CV(shift_right_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SR_SPEC_VAR_CV_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CV_DIM(shift_right_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SR_SPEC_VAR_CV_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CV_OBJ(shift_right_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_CONCAT_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CV(concat_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_CONCAT_SPEC_VAR_CV_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CV_DIM(concat_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_CONCAT_SPEC_VAR_CV_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CV_OBJ(concat_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_OR_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CV(bitwise_or_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_OR_SPEC_VAR_CV_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CV_DIM(bitwise_or_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_OR_SPEC_VAR_CV_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CV_OBJ(bitwise_or_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_AND_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CV(bitwise_and_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_AND_SPEC_VAR_CV_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CV_DIM(bitwise_and_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_AND_SPEC_VAR_CV_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CV_OBJ(bitwise_and_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CV(bitwise_xor_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_VAR_CV_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CV_DIM(bitwise_xor_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_VAR_CV_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CV_OBJ(bitwise_xor_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_POW_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CV(pow_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_POW_SPEC_VAR_CV_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CV_DIM(pow_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_POW_SPEC_VAR_CV_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CV_OBJ(pow_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_VAR_CV(int inc ZEND_OPCODE_HANDLER_ARGS_DC)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_OBJ_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zend_free_op free_op1;
zval *object;
zval *property;
zval *zptr;
+ void **cache_slot;
+ zend_property_info *prop_info;
SAVE_OPLINE();
object = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
@@ -28487,47 +28240,38 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE
do {
if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
- if (Z_ISREF_P(object)) {
+ if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) {
object = Z_REFVAL_P(object);
- if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
- goto pre_incdec_object;
- }
+ goto pre_incdec_object;
+ }
+ if (IS_VAR == IS_CV
+ && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
+ ZVAL_UNDEFINED_OP1();
}
- if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
+ object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC);
+ if (UNEXPECTED(!object)) {
break;
}
}
- /* here we are sure we are dealing with an object */
pre_incdec_object:
- if (EXPECTED(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)) {
+ /* here we are sure we are dealing with an object */
+ cache_slot = (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL;
+ if (EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, cache_slot)) != NULL)) {
if (UNEXPECTED(Z_ISERROR_P(zptr))) {
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_NULL(EX_VAR(opline->result.var));
}
} else {
- if (EXPECTED(Z_TYPE_P(zptr) == IS_LONG)) {
- if (inc) {
- fast_long_increment_function(zptr);
- } else {
- fast_long_decrement_function(zptr);
- }
+ if (IS_CV == IS_CONST) {
+ prop_info = (zend_property_info *) CACHED_PTR_EX(cache_slot + 2);
} else {
- ZVAL_DEREF(zptr);
-
- if (inc) {
- increment_function(zptr);
- } else {
- decrement_function(zptr);
- }
- }
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY(EX_VAR(opline->result.var), zptr);
+ prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(object), zptr);
}
+ zend_pre_incdec_property_zval(zptr, prop_info OPLINE_CC EXECUTE_DATA_CC);
}
} else {
- zend_pre_incdec_overloaded_property(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), inc OPLINE_CC EXECUTE_DATA_CC);
+ zend_pre_incdec_overloaded_property(object, property, cache_slot OPLINE_CC EXECUTE_DATA_CC);
}
} while (0);
@@ -28535,23 +28279,15 @@ pre_incdec_object:
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_OBJ_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_pre_incdec_property_helper_SPEC_VAR_CV(1 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_OBJ_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_pre_incdec_property_helper_SPEC_VAR_CV(0 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_VAR_CV(int inc ZEND_OPCODE_HANDLER_ARGS_DC)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_OBJ_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zend_free_op free_op1;
zval *object;
zval *property;
zval *zptr;
+ void **cache_slot;
+ zend_property_info *prop_info;
SAVE_OPLINE();
object = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
@@ -28564,43 +28300,37 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP
do {
if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
- if (Z_ISREF_P(object)) {
+ if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) {
object = Z_REFVAL_P(object);
- if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
- goto post_incdec_object;
- }
+ goto post_incdec_object;
+ }
+ if (IS_VAR == IS_CV
+ && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
+ ZVAL_UNDEFINED_OP1();
}
- if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
+ object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC);
+ if (UNEXPECTED(!object)) {
break;
}
}
- /* here we are sure we are dealing with an object */
post_incdec_object:
- if (EXPECTED(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)) {
+ /* here we are sure we are dealing with an object */
+ cache_slot = (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL;
+ if (EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, cache_slot)) != NULL)) {
if (UNEXPECTED(Z_ISERROR_P(zptr))) {
ZVAL_NULL(EX_VAR(opline->result.var));
} else {
- if (EXPECTED(Z_TYPE_P(zptr) == IS_LONG)) {
- ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(zptr));
- if (inc) {
- fast_long_increment_function(zptr);
- } else {
- fast_long_decrement_function(zptr);
- }
+ if (IS_CV == IS_CONST) {
+ prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2);
} else {
- ZVAL_DEREF(zptr);
- ZVAL_COPY(EX_VAR(opline->result.var), zptr);
- if (inc) {
- increment_function(zptr);
- } else {
- decrement_function(zptr);
- }
+ prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(object), zptr);
}
+
+ zend_post_incdec_property_zval(zptr, prop_info OPLINE_CC EXECUTE_DATA_CC);
}
} else {
- zend_post_incdec_overloaded_property(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), inc OPLINE_CC EXECUTE_DATA_CC);
+ zend_post_incdec_overloaded_property(object, property, cache_slot OPLINE_CC EXECUTE_DATA_CC);
}
} while (0);
@@ -28608,16 +28338,6 @@ post_incdec_object:
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_OBJ_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_post_incdec_property_helper_SPEC_VAR_CV(1 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_DEC_OBJ_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_post_incdec_property_helper_SPEC_VAR_CV(0 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_W_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -28654,6 +28374,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_RW_SPEC_VAR_CV_HANDL
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
+#if 0
+ USE_OPLINE
+#endif
+
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));
@@ -28699,7 +28423,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_CV_HANDLE
property = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
result = EX_VAR(opline->result.var);
- zend_fetch_property_address(result, container, IS_VAR, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_W OPLINE_CC);
+ zend_fetch_property_address(
+ result, container, IS_VAR, property, IS_CV,
+ ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_FETCH_OBJ_FLAGS) : NULL),
+ BP_VAR_W, opline->extended_value & ZEND_FETCH_OBJ_FLAGS, 1 OPLINE_CC EXECUTE_DATA_CC);
if (IS_VAR == IS_VAR) {
FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result);
@@ -28721,7 +28448,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_VAR_CV_HANDL
}
property = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
result = EX_VAR(opline->result.var);
- zend_fetch_property_address(result, container, IS_VAR, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_RW OPLINE_CC);
+ zend_fetch_property_address(result, container, IS_VAR, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_RW, 0, 1 OPLINE_CC EXECUTE_DATA_CC);
if (IS_VAR == IS_VAR) {
FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result);
@@ -28731,12 +28458,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_VAR_CV_HANDL
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
+#if 0
+ USE_OPLINE
+#endif
+
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_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
} else {
ZEND_VM_TAIL_CALL(ZEND_FETCH_OBJ_R_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
@@ -28758,7 +28488,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_VAR_CV_HA
property = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
result = EX_VAR(opline->result.var);
- zend_fetch_property_address(result, container, IS_VAR, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_UNSET OPLINE_CC);
+ zend_fetch_property_address(result, container, IS_VAR, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_UNSET, 0, 1 OPLINE_CC EXECUTE_DATA_CC);
if (IS_VAR == IS_VAR) {
FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result);
@@ -28806,34 +28536,52 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA
value = RT_CONSTANT((opline+1), (opline+1)->op1);
if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
- if (Z_ISREF_P(object)) {
+ if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) {
object = Z_REFVAL_P(object);
- if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
- goto assign_object;
- }
+ goto assign_object;
}
- if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
-
- goto exit_assign_obj;
+ object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC);
+ if (UNEXPECTED(!object)) {
+ value = &EG(uninitialized_zval);
+ goto free_and_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*));
+ void **cache_slot = CACHE_ADDR(opline->extended_value);
+ uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1);
zend_object *zobj = Z_OBJ_P(object);
zval *property_val;
if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
property_val = OBJ_PROP(zobj, prop_offset);
if (Z_TYPE_P(property_val) != IS_UNDEF) {
+ zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2);
+
+ if (UNEXPECTED(prop_info != NULL)) {
+ zend_uchar orig_type = IS_UNDEF;
+
+ if (IS_CONST == IS_CONST) {
+ orig_type = Z_TYPE_P(value);
+ }
+
+ value = zend_assign_to_typed_prop(prop_info, property_val, value EXECUTE_DATA_CC);
+
+ /* will remain valid, thus no need to check prop_info in future here */
+ if (IS_CONST == IS_CONST && Z_TYPE_P(value) == orig_type) {
+ CACHE_PTR_EX(cache_slot + 2, NULL);
+ }
+ goto free_and_exit_assign_obj;
+ } else {
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);
+ value = zend_assign_to_variable(property_val, value, IS_CONST, EX_USES_STRICT_TYPES());
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+ ZVAL_COPY(EX_VAR(opline->result.var), value);
+ }
+ goto exit_assign_obj;
}
- goto exit_assign_obj;
}
} else {
if (EXPECTED(zobj->properties != NULL)) {
@@ -28887,18 +28635,13 @@ fast_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_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL);
+ value = Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL);
+free_and_exit_assign_obj:
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
}
@@ -28910,6 +28653,7 @@ exit_assign_obj:
ZEND_VM_NEXT_OPCODE_EX(1, 2);
}
+/* No specialization for op_types (CONST|TMPVAR|CV, UNUSED|CONST|VAR) */
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -28927,34 +28671,52 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA
value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
- if (Z_ISREF_P(object)) {
+ if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) {
object = Z_REFVAL_P(object);
- if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
- goto assign_object;
- }
+ goto assign_object;
}
- if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
- zval_ptr_dtor_nogc(free_op_data);
- goto exit_assign_obj;
+ object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC);
+ if (UNEXPECTED(!object)) {
+ value = &EG(uninitialized_zval);
+ goto free_and_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*));
+ void **cache_slot = CACHE_ADDR(opline->extended_value);
+ uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1);
zend_object *zobj = Z_OBJ_P(object);
zval *property_val;
if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
property_val = OBJ_PROP(zobj, prop_offset);
if (Z_TYPE_P(property_val) != IS_UNDEF) {
+ zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2);
+
+ if (UNEXPECTED(prop_info != NULL)) {
+ zend_uchar orig_type = IS_UNDEF;
+
+ if (IS_TMP_VAR == IS_CONST) {
+ orig_type = Z_TYPE_P(value);
+ }
+
+ value = zend_assign_to_typed_prop(prop_info, property_val, value EXECUTE_DATA_CC);
+
+ /* will remain valid, thus no need to check prop_info in future here */
+ if (IS_TMP_VAR == IS_CONST && Z_TYPE_P(value) == orig_type) {
+ CACHE_PTR_EX(cache_slot + 2, NULL);
+ }
+ goto free_and_exit_assign_obj;
+ } else {
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);
+ value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES());
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+ ZVAL_COPY(EX_VAR(opline->result.var), value);
+ }
+ goto exit_assign_obj;
}
- goto exit_assign_obj;
}
} else {
if (EXPECTED(zobj->properties != NULL)) {
@@ -29008,18 +28770,13 @@ fast_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_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL);
+ value = Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL);
+free_and_exit_assign_obj:
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
}
@@ -29031,6 +28788,7 @@ exit_assign_obj:
ZEND_VM_NEXT_OPCODE_EX(1, 2);
}
+/* No specialization for op_types (CONST|TMPVAR|CV, UNUSED|CONST|VAR) */
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -29048,34 +28806,52 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA
value = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
- if (Z_ISREF_P(object)) {
+ if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) {
object = Z_REFVAL_P(object);
- if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
- goto assign_object;
- }
+ goto assign_object;
}
- if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
- zval_ptr_dtor_nogc(free_op_data);
- goto exit_assign_obj;
+ object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC);
+ if (UNEXPECTED(!object)) {
+ value = &EG(uninitialized_zval);
+ goto free_and_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*));
+ void **cache_slot = CACHE_ADDR(opline->extended_value);
+ uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1);
zend_object *zobj = Z_OBJ_P(object);
zval *property_val;
if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
property_val = OBJ_PROP(zobj, prop_offset);
if (Z_TYPE_P(property_val) != IS_UNDEF) {
+ zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2);
+
+ if (UNEXPECTED(prop_info != NULL)) {
+ zend_uchar orig_type = IS_UNDEF;
+
+ if (IS_VAR == IS_CONST) {
+ orig_type = Z_TYPE_P(value);
+ }
+
+ value = zend_assign_to_typed_prop(prop_info, property_val, value EXECUTE_DATA_CC);
+
+ /* will remain valid, thus no need to check prop_info in future here */
+ if (IS_VAR == IS_CONST && Z_TYPE_P(value) == orig_type) {
+ CACHE_PTR_EX(cache_slot + 2, NULL);
+ }
+ goto free_and_exit_assign_obj;
+ } else {
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);
+ value = zend_assign_to_variable(property_val, value, IS_VAR, EX_USES_STRICT_TYPES());
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+ ZVAL_COPY(EX_VAR(opline->result.var), value);
+ }
+ goto exit_assign_obj;
}
- goto exit_assign_obj;
}
} else {
if (EXPECTED(zobj->properties != NULL)) {
@@ -29129,18 +28905,13 @@ fast_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_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL);
+ value = Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL);
+free_and_exit_assign_obj:
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
}
@@ -29152,6 +28923,7 @@ exit_assign_obj:
ZEND_VM_NEXT_OPCODE_EX(1, 2);
}
+/* No specialization for op_types (CONST|TMPVAR|CV, UNUSED|CONST|VAR) */
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -29169,34 +28941,52 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA
value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC);
if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
- if (Z_ISREF_P(object)) {
+ if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) {
object = Z_REFVAL_P(object);
- if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
- goto assign_object;
- }
+ goto assign_object;
}
- if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
-
- goto exit_assign_obj;
+ object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC);
+ if (UNEXPECTED(!object)) {
+ value = &EG(uninitialized_zval);
+ goto free_and_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*));
+ void **cache_slot = CACHE_ADDR(opline->extended_value);
+ uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1);
zend_object *zobj = Z_OBJ_P(object);
zval *property_val;
if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
property_val = OBJ_PROP(zobj, prop_offset);
if (Z_TYPE_P(property_val) != IS_UNDEF) {
+ zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2);
+
+ if (UNEXPECTED(prop_info != NULL)) {
+ zend_uchar orig_type = IS_UNDEF;
+
+ if (IS_CV == IS_CONST) {
+ orig_type = Z_TYPE_P(value);
+ }
+
+ value = zend_assign_to_typed_prop(prop_info, property_val, value EXECUTE_DATA_CC);
+
+ /* will remain valid, thus no need to check prop_info in future here */
+ if (IS_CV == IS_CONST && Z_TYPE_P(value) == orig_type) {
+ CACHE_PTR_EX(cache_slot + 2, NULL);
+ }
+ goto free_and_exit_assign_obj;
+ } else {
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);
+ value = zend_assign_to_variable(property_val, value, IS_CV, EX_USES_STRICT_TYPES());
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+ ZVAL_COPY(EX_VAR(opline->result.var), value);
+ }
+ goto exit_assign_obj;
}
- goto exit_assign_obj;
}
} else {
if (EXPECTED(zobj->properties != NULL)) {
@@ -29250,18 +29040,13 @@ fast_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_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL);
+ value = Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL);
+free_and_exit_assign_obj:
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
}
@@ -29273,30 +29058,30 @@ exit_assign_obj:
ZEND_VM_NEXT_OPCODE_EX(1, 2);
}
+/* No specialization for op_types (CONST|TMPVAR|CV, UNUSED|CONST|VAR) */
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zend_free_op free_op1;
- zval *object_ptr;
+ zval *object_ptr, *orig_object_ptr;
zend_free_op free_op_data;
zval *value;
zval *variable_ptr;
zval *dim;
SAVE_OPLINE();
- object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ orig_object_ptr = object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) {
try_assign_dim_array:
+ value = RT_CONSTANT((opline+1), (opline+1)->op1);
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)) {
-
zend_cannot_add_element();
goto assign_dim_error;
} else if (IS_CONST == IS_CV) {
@@ -29325,8 +29110,7 @@ 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 = zend_assign_to_variable(variable_ptr, value, IS_CONST, EX_USES_STRICT_TYPES());
}
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
@@ -29351,9 +29135,7 @@ try_assign_dim_array:
if (IS_CV == 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_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
value = RT_CONSTANT((opline+1), (opline+1)->op1);
@@ -29361,8 +29143,16 @@ try_assign_dim_array:
}
} else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) {
- ZVAL_ARR(object_ptr, zend_new_array(8));
- goto try_assign_dim_array;
+ if (Z_ISREF_P(orig_object_ptr)
+ && ZEND_REF_HAS_TYPE_SOURCES(Z_REF_P(orig_object_ptr))
+ && !zend_verify_ref_array_assignable(Z_REF_P(orig_object_ptr))) {
+ dim = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
+
+ UNDEF_RESULT();
+ } else {
+ 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();
@@ -29387,26 +29177,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA
{
USE_OPLINE
zend_free_op free_op1;
- zval *object_ptr;
+ zval *object_ptr, *orig_object_ptr;
zend_free_op free_op_data;
zval *value;
zval *variable_ptr;
zval *dim;
SAVE_OPLINE();
- object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ orig_object_ptr = object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) {
try_assign_dim_array:
+ value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
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);
}
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) {
@@ -29435,8 +29224,7 @@ 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 = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR, EX_USES_STRICT_TYPES());
}
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
@@ -29462,9 +29250,7 @@ try_assign_dim_array:
if (IS_CV == 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_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);
@@ -29472,8 +29258,16 @@ try_assign_dim_array:
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;
+ if (Z_ISREF_P(orig_object_ptr)
+ && ZEND_REF_HAS_TYPE_SOURCES(Z_REF_P(orig_object_ptr))
+ && !zend_verify_ref_array_assignable(Z_REF_P(orig_object_ptr))) {
+ dim = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
+ zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
+ UNDEF_RESULT();
+ } else {
+ 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();
@@ -29498,26 +29292,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA
{
USE_OPLINE
zend_free_op free_op1;
- zval *object_ptr;
+ zval *object_ptr, *orig_object_ptr;
zend_free_op free_op_data;
zval *value;
zval *variable_ptr;
zval *dim;
SAVE_OPLINE();
- object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ orig_object_ptr = object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) {
try_assign_dim_array:
+ value = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
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);
}
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) {
@@ -29546,8 +29339,7 @@ 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 = zend_assign_to_variable(variable_ptr, value, IS_VAR, EX_USES_STRICT_TYPES());
}
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
@@ -29573,9 +29365,7 @@ try_assign_dim_array:
if (IS_CV == 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_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);
@@ -29583,8 +29373,16 @@ try_assign_dim_array:
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;
+ if (Z_ISREF_P(orig_object_ptr)
+ && ZEND_REF_HAS_TYPE_SOURCES(Z_REF_P(orig_object_ptr))
+ && !zend_verify_ref_array_assignable(Z_REF_P(orig_object_ptr))) {
+ dim = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
+ zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
+ UNDEF_RESULT();
+ } else {
+ 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();
@@ -29609,26 +29407,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA
{
USE_OPLINE
zend_free_op free_op1;
- zval *object_ptr;
+ zval *object_ptr, *orig_object_ptr;
zend_free_op free_op_data;
zval *value;
zval *variable_ptr;
zval *dim;
SAVE_OPLINE();
- object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+ orig_object_ptr = object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) {
try_assign_dim_array:
+ value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC);
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);
}
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) {
@@ -29657,8 +29454,7 @@ 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 = zend_assign_to_variable(variable_ptr, value, IS_CV, EX_USES_STRICT_TYPES());
}
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
@@ -29683,9 +29479,7 @@ try_assign_dim_array:
if (IS_CV == 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_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);
@@ -29693,8 +29487,16 @@ try_assign_dim_array:
}
} else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) {
- ZVAL_ARR(object_ptr, zend_new_array(8));
- goto try_assign_dim_array;
+ if (Z_ISREF_P(orig_object_ptr)
+ && ZEND_REF_HAS_TYPE_SOURCES(Z_REF_P(orig_object_ptr))
+ && !zend_verify_ref_array_assignable(Z_REF_P(orig_object_ptr))) {
+ dim = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
+
+ UNDEF_RESULT();
+ } else {
+ 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();
@@ -29732,7 +29534,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SPEC_VAR_CV_RETVAL_UNUS
ZVAL_NULL(EX_VAR(opline->result.var));
}
} else {
- value = zend_assign_to_variable(variable_ptr, value, IS_CV);
+ value = zend_assign_to_variable(variable_ptr, value, IS_CV, EX_USES_STRICT_TYPES());
if (UNEXPECTED(0)) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
}
@@ -29760,7 +29562,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SPEC_VAR_CV_RETVAL_USED
ZVAL_NULL(EX_VAR(opline->result.var));
}
} else {
- value = zend_assign_to_variable(variable_ptr, value, IS_CV);
+ value = zend_assign_to_variable(variable_ptr, value, IS_CV, EX_USES_STRICT_TYPES());
if (UNEXPECTED(1)) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
}
@@ -29787,26 +29589,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_VAR_CV_HANDLER
} else if (IS_VAR == IS_VAR &&
UNEXPECTED(Z_TYPE_P(EX_VAR(opline->op1.var)) != IS_INDIRECT)) {
- zend_throw_error(NULL, "Cannot assign by reference to overloaded object");
- if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
-
- UNDEF_RESULT();
- HANDLE_EXCEPTION();
+ zend_throw_error(NULL, "Cannot assign by reference to an array dimension of an object");
+ variable_ptr = &EG(uninitialized_zval);
} else if (IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) {
variable_ptr = &EG(uninitialized_zval);
} else if (IS_CV == IS_VAR &&
opline->extended_value == ZEND_RETURNS_FUNCTION &&
UNEXPECTED(!Z_ISREF_P(value_ptr))) {
- if (UNEXPECTED(!zend_wrong_assign_to_variable_reference(variable_ptr, value_ptr, IS_CV OPLINE_CC EXECUTE_DATA_CC))) {
-
- UNDEF_RESULT();
- HANDLE_EXCEPTION();
+ if (UNEXPECTED(!zend_wrong_assign_to_variable_reference(variable_ptr, value_ptr OPLINE_CC EXECUTE_DATA_CC))) {
+ variable_ptr = &EG(uninitialized_zval);
}
-
- /* 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);
}
@@ -29819,12 +29612,98 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_VAR_CV_HANDLER
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op1, free_op_data;
+ zval *property, *container, *value_ptr;
+
+ SAVE_OPLINE();
+
+ container = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+
+ if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
+ ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
+ }
+
+ property = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
+
+ value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
+
+ if (1) {
+ if (IS_VAR == IS_UNUSED) {
+ if (IS_CV == IS_CONST) {
+ zend_assign_to_property_reference_this_const(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ } else {
+ zend_assign_to_property_reference_this_var(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ }
+ } else {
+ if (IS_CV == IS_CONST) {
+ zend_assign_to_property_reference_var_const(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ } else {
+ zend_assign_to_property_reference_var_var(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ }
+ }
+ } else {
+ zend_assign_to_property_reference(container, IS_VAR, property, IS_CV, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ }
+
+ if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
+
+ if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);};
+ ZEND_VM_NEXT_OPCODE_EX(1, 2);
+}
+
+/* No specialization for op_types (CONST|TMPVAR|CV, UNUSED|CONST|VAR) */
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op1;
+ zval *property, *container, *value_ptr;
+
+ SAVE_OPLINE();
+
+ container = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
+
+ if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
+ ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
+ }
+
+ property = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
+
+ value_ptr = _get_zval_ptr_cv_BP_VAR_W((opline+1)->op1.var EXECUTE_DATA_CC);
+
+ if (1) {
+ if (IS_VAR == IS_UNUSED) {
+ if (IS_CV == IS_CONST) {
+ zend_assign_to_property_reference_this_const(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ } else {
+ zend_assign_to_property_reference_this_var(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ }
+ } else {
+ if (IS_CV == IS_CONST) {
+ zend_assign_to_property_reference_var_const(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ } else {
+ zend_assign_to_property_reference_var_var(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ }
+ }
+ } else {
+ zend_assign_to_property_reference(container, IS_VAR, property, IS_CV, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ }
+
+ if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
+
+
+ ZEND_VM_NEXT_OPCODE_EX(1, 2);
+}
+
+/* No specialization for op_types (CONST|TMPVAR|CV, UNUSED|CONST|VAR) */
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zval *function_name;
zend_class_entry *ce;
- zend_object *object;
+ uint32_t call_info;
zend_function *fbc;
zend_execute_data *call;
@@ -29834,7 +29713,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_V
/* 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);
+ ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op1)), Z_STR_P(RT_CONSTANT(opline, opline->op1) + 1), ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
if (UNEXPECTED(ce == NULL)) {
ZEND_ASSERT(EG(exception));
@@ -29876,7 +29755,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_V
break;
}
} else if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(function_name) == IS_UNDEF)) {
- GET_OP2_UNDEF_CV(function_name, BP_VAR_R);
+ ZVAL_UNDEFINED_OP2();
if (UNEXPECTED(EG(exception) != NULL)) {
HANDLE_EXCEPTION();
}
@@ -29905,7 +29784,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_V
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)) {
+ if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!RUN_TIME_CACHE(&fbc->op_array))) {
init_func_run_time_cache(&fbc->op_array);
}
if (IS_CV != IS_CONST) {
@@ -29921,38 +29800,39 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_V
HANDLE_EXCEPTION();
}
fbc = ce->constructor;
- if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
+ if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!RUN_TIME_CACHE(&fbc->op_array))) {
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;
+ ce = (zend_class_entry*)Z_OBJ(EX(This));
+ call_info = ZEND_CALL_NESTED_FUNCTION | ZEND_CALL_HAS_THIS;
} else {
zend_non_static_method_call(fbc);
if (UNEXPECTED(EG(exception) != NULL)) {
HANDLE_EXCEPTION();
}
+ goto check_parent_and_self;
}
- }
-
- if (IS_VAR == IS_UNUSED) {
+ } else {
+check_parent_and_self:
/* 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 (IS_VAR == IS_UNUSED
+ && ((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_info = ZEND_CALL_NESTED_FUNCTION;
}
- call = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
- fbc, opline->extended_value, ce, object);
+ call = zend_vm_stack_push_call_frame(call_info,
+ fbc, opline->extended_value, ce);
call->prev_execute_data = EX(call);
EX(call) = call;
@@ -30035,8 +29915,12 @@ num_index:
} else if (Z_TYPE_P(offset) == IS_TRUE) {
hval = 1;
goto num_index;
+ } else if (Z_TYPE_P(offset) == IS_RESOURCE) {
+ zend_use_resource_as_offset(offset);
+ hval = Z_RES_HANDLE_P(offset);
+ goto num_index;
} else if (IS_CV == IS_CV && Z_TYPE_P(offset) == IS_UNDEF) {
- GET_OP2_UNDEF_CV(offset, BP_VAR_R);
+ ZVAL_UNDEFINED_OP2();
str = ZSTR_EMPTY_ALLOC();
goto str_index;
} else {
@@ -30069,7 +29953,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_VAR_CV_HANDLER
}
ZEND_VM_TAIL_CALL(ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
} else {
- ZVAL_EMPTY_ARRAY(array);
+ ZVAL_ARR(array, zend_new_array(0));
ZEND_VM_NEXT_OPCODE();
}
}
@@ -30131,7 +30015,7 @@ num_index_dim:
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);
+ ZVAL_UNDEFINED_OP2();
key = ZSTR_EMPTY_ALLOC();
goto str_index_dim;
} else {
@@ -30145,20 +30029,16 @@ num_index_dim:
}
}
if (IS_VAR == IS_CV && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
- container = GET_OP1_UNDEF_CV(container, BP_VAR_R);
+ container = ZVAL_UNDEFINED_OP1();
}
if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(offset) == IS_UNDEF)) {
- offset = GET_OP2_UNDEF_CV(offset, BP_VAR_R);
+ offset = ZVAL_UNDEFINED_OP2();
}
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);
+ 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)) {
zend_throw_error(NULL, "Cannot unset string offsets");
}
@@ -30187,17 +30067,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_VAR_CV_HANDLER(
if (Z_ISREF_P(container)) {
container = Z_REFVAL_P(container);
if (Z_TYPE_P(container) != IS_OBJECT) {
+ if (IS_VAR == IS_CV
+ && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
+ ZVAL_UNDEFINED_OP1();
+ }
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);
- }
+ Z_OBJ_HT_P(container)->unset_property(container, offset, ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL));
} while (0);
if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
@@ -30245,20 +30125,23 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_VAR_CV_HANDLER(ZEND
/* If a function call result is yielded and the function did
* not return by reference we throw a notice. */
- if (IS_VAR == 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 {
+ do {
+ if (IS_VAR == IS_VAR) {
+ ZEND_ASSERT(value_ptr != &EG(uninitialized_zval));
+ if (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);
+ break;
+ }
+ }
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));
- }
+ } while (0);
if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
}
@@ -30389,7 +30272,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_FETCH_R_SIMPLE_
}
variable_ptr = EX_VAR(opline->op2.var);
- zend_assign_to_variable(variable_ptr, value, IS_CV);
+ zend_assign_to_variable(variable_ptr, value, IS_CV, EX_USES_STRICT_TYPES());
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
@@ -30441,7 +30324,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_FETCH_R_SIMPLE_
}
variable_ptr = EX_VAR(opline->op2.var);
- zend_assign_to_variable(variable_ptr, value, IS_CV);
+ zend_assign_to_variable(variable_ptr, value, IS_CV, EX_USES_STRICT_TYPES());
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
@@ -30511,7 +30394,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CLONE_SPEC_UNUSED_HANDLER(ZEND
}
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);
+ ZVAL_UNDEFINED_OP1();
if (UNEXPECTED(EG(exception) != NULL)) {
HANDLE_EXCEPTION();
}
@@ -30532,23 +30415,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CLONE_SPEC_UNUSED_HANDLER(ZEND
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_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 (clone && !(clone->common.fn_flags & ZEND_ACC_PUBLIC)) {
+ scope = EX(func)->op_array.scope;
+ if (clone->common.scope != scope) {
+ if (UNEXPECTED(clone->common.fn_flags & ZEND_ACC_PRIVATE)
+ || UNEXPECTED(!zend_check_protected(zend_get_function_root_class(clone), scope))) {
+ zend_wrong_clone_call(clone, scope);
ZVAL_UNDEF(EX_VAR(opline->result.var));
HANDLE_EXCEPTION();
@@ -30561,35 +30433,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CLONE_SPEC_UNUSED_HANDLER(ZEND
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_EXIT_SPEC_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
-
- 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_zval(ptr, 0);
- }
- } while (0);
-
- }
- zend_bailout();
- ZEND_VM_NEXT_OPCODE(); /* Never reached */
-}
-
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_CLASS_NAME_SPEC_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
uint32_t fetch_type;
@@ -30635,14 +30478,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_CLASS_NAME_SPEC_UNUSED_H
ZEND_VM_NEXT_OPCODE();
}
-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_ASSIGN_OBJ_OP_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zend_free_op free_op_data1;
+ zend_free_op free_op_data;
zval *object;
zval *property;
zval *value;
zval *zptr;
+ void **cache_slot;
+ zend_property_info *prop_info;
SAVE_OPLINE();
object = &EX(This);
@@ -30654,138 +30499,84 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP
property = RT_CONSTANT(opline, opline->op2);
do {
- value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data1);
+ value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data);
if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
- if (Z_ISREF_P(object)) {
+ if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) {
object = Z_REFVAL_P(object);
- if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
- goto assign_op_object;
- }
+ goto assign_op_object;
+ }
+ if (IS_UNUSED == IS_CV
+ && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
+ ZVAL_UNDEFINED_OP1();
}
- if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
+ object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC);
+ if (UNEXPECTED(!object)) {
break;
}
}
- /* here we are sure we are dealing with an object */
assign_op_object:
- if (EXPECTED(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)) {
+ /* here we are sure we are dealing with an object */
+ cache_slot = (IS_CONST == IS_CONST) ? CACHE_ADDR((opline+1)->extended_value) : NULL;
+ if (EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, cache_slot)) != NULL)) {
if (UNEXPECTED(Z_ISERROR_P(zptr))) {
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_NULL(EX_VAR(opline->result.var));
}
} else {
- ZVAL_DEREF(zptr);
+ zval *orig_zptr = zptr;
+ zend_reference *ref;
+
+ do {
+ if (UNEXPECTED(Z_ISREF_P(zptr))) {
+ ref = Z_REF_P(zptr);
+ zptr = Z_REFVAL_P(zptr);
+ if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) {
+ zend_binary_assign_op_typed_ref(ref, value OPLINE_CC EXECUTE_DATA_CC);
+ break;
+ }
+ }
+
+ if (IS_CONST == IS_CONST) {
+ prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2);
+ } else {
+ prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(object), orig_zptr);
+ }
+ if (UNEXPECTED(prop_info)) {
+ /* special case for typed properties */
+ zend_binary_assign_op_typed_prop(prop_info, zptr, value OPLINE_CC EXECUTE_DATA_CC);
+ } else {
+ zend_binary_op(zptr, zptr, value OPLINE_CC);
+ }
+ } while (0);
- binary_op(zptr, zptr, value);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), zptr);
}
}
} else {
- zend_assign_op_overloaded_property(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR((opline+1)->extended_value) : NULL), value, binary_op OPLINE_CC EXECUTE_DATA_CC);
+ zend_assign_op_overloaded_property(object, property, cache_slot, value OPLINE_CC EXECUTE_DATA_CC);
}
} while (0);
- FREE_OP(free_op_data1);
+ FREE_OP(free_op_data);
/* assign_obj has two opcodes! */
ZEND_VM_NEXT_OPCODE_EX(1, 2);
}
-static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_SPEC_UNUSED_CONST_OBJ(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC)
-{
-#if 1 && IS_CONST == IS_UNUSED
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_UNUSED_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-#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));
- }
- 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
-
- 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_ADD_SPEC_UNUSED_CONST_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));
-}
-
-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_UNUSED_CONST_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)
-{
- 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_DIV_SPEC_UNUSED_CONST_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));
-}
-
-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_UNUSED_CONST_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)
-{
- 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_SR_SPEC_UNUSED_CONST_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));
-}
-
-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_UNUSED_CONST_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)
-{
- 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_BW_AND_SPEC_UNUSED_CONST_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));
-}
-
-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_UNUSED_CONST_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)
-{
- 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_UNUSED_CONST(int inc ZEND_OPCODE_HANDLER_ARGS_DC)
+/* No specialization for op_types (CONST|TMP|VAR|CV, UNUSED|CONST|TMPVAR) */
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_OBJ_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zval *object;
zval *property;
zval *zptr;
+ void **cache_slot;
+ zend_property_info *prop_info;
SAVE_OPLINE();
object = &EX(This);
@@ -30798,47 +30589,38 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE
do {
if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
- if (Z_ISREF_P(object)) {
+ if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) {
object = Z_REFVAL_P(object);
- if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
- goto pre_incdec_object;
- }
+ goto pre_incdec_object;
}
- if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
+ if (IS_UNUSED == IS_CV
+ && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
+ ZVAL_UNDEFINED_OP1();
+ }
+ object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC);
+ if (UNEXPECTED(!object)) {
break;
}
}
- /* here we are sure we are dealing with an object */
pre_incdec_object:
- if (EXPECTED(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->extended_value) : NULL))) != NULL)) {
+ /* here we are sure we are dealing with an object */
+ cache_slot = (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL;
+ if (EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, cache_slot)) != NULL)) {
if (UNEXPECTED(Z_ISERROR_P(zptr))) {
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_NULL(EX_VAR(opline->result.var));
}
} else {
- if (EXPECTED(Z_TYPE_P(zptr) == IS_LONG)) {
- if (inc) {
- fast_long_increment_function(zptr);
- } else {
- fast_long_decrement_function(zptr);
- }
+ if (IS_CONST == IS_CONST) {
+ prop_info = (zend_property_info *) CACHED_PTR_EX(cache_slot + 2);
} else {
- ZVAL_DEREF(zptr);
-
- if (inc) {
- increment_function(zptr);
- } else {
- decrement_function(zptr);
- }
- }
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY(EX_VAR(opline->result.var), zptr);
+ prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(object), zptr);
}
+ zend_pre_incdec_property_zval(zptr, prop_info OPLINE_CC EXECUTE_DATA_CC);
}
} else {
- zend_pre_incdec_overloaded_property(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), inc OPLINE_CC EXECUTE_DATA_CC);
+ zend_pre_incdec_overloaded_property(object, property, cache_slot OPLINE_CC EXECUTE_DATA_CC);
}
} while (0);
@@ -30846,23 +30628,15 @@ pre_incdec_object:
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)
-{
- 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_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- 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_UNUSED_CONST(int inc ZEND_OPCODE_HANDLER_ARGS_DC)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_OBJ_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zval *object;
zval *property;
zval *zptr;
+ void **cache_slot;
+ zend_property_info *prop_info;
SAVE_OPLINE();
object = &EX(This);
@@ -30875,43 +30649,37 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP
do {
if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
- if (Z_ISREF_P(object)) {
+ if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) {
object = Z_REFVAL_P(object);
- if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
- goto post_incdec_object;
- }
+ goto post_incdec_object;
}
- if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
+ if (IS_UNUSED == IS_CV
+ && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
+ ZVAL_UNDEFINED_OP1();
+ }
+ object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC);
+ if (UNEXPECTED(!object)) {
break;
}
}
- /* here we are sure we are dealing with an object */
post_incdec_object:
- if (EXPECTED(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->extended_value) : NULL))) != NULL)) {
+ /* here we are sure we are dealing with an object */
+ cache_slot = (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL;
+ if (EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, cache_slot)) != NULL)) {
if (UNEXPECTED(Z_ISERROR_P(zptr))) {
ZVAL_NULL(EX_VAR(opline->result.var));
} else {
- if (EXPECTED(Z_TYPE_P(zptr) == IS_LONG)) {
- ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(zptr));
- if (inc) {
- fast_long_increment_function(zptr);
- } else {
- fast_long_decrement_function(zptr);
- }
+ if (IS_CONST == IS_CONST) {
+ prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2);
} else {
- ZVAL_DEREF(zptr);
- ZVAL_COPY(EX_VAR(opline->result.var), zptr);
- if (inc) {
- increment_function(zptr);
- } else {
- decrement_function(zptr);
- }
+ prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(object), zptr);
}
+
+ zend_post_incdec_property_zval(zptr, prop_info OPLINE_CC EXECUTE_DATA_CC);
}
} else {
- zend_post_incdec_overloaded_property(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), inc OPLINE_CC EXECUTE_DATA_CC);
+ zend_post_incdec_overloaded_property(object, property, cache_slot OPLINE_CC EXECUTE_DATA_CC);
}
} while (0);
@@ -30919,17 +30687,7 @@ post_incdec_object:
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)
-{
- 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_POST_DEC_OBJ_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_post_incdec_property_helper_SPEC_UNUSED_CONST(0 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static zend_always_inline ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_CONST_INLINE_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -30957,12 +30715,14 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_U
}
}
if (IS_UNUSED == IS_CV && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
- GET_OP1_UNDEF_CV(container, BP_VAR_R);
+ ZVAL_UNDEFINED_OP1();
}
if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(offset) == IS_UNDEF)) {
- GET_OP2_UNDEF_CV(offset, BP_VAR_R);
+ ZVAL_UNDEFINED_OP2();
}
- goto fetch_obj_r_no_object;
+ zend_wrong_property_read(offset);
+ ZVAL_NULL(EX_VAR(opline->result.var));
+ goto fetch_obj_r_finish;
} while (0);
}
@@ -30972,7 +30732,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_U
zval *retval;
if (IS_CONST == IS_CONST) {
- cache_slot = CACHE_ADDR(opline->extended_value);
+ cache_slot = CACHE_ADDR(opline->extended_value & ~ZEND_FETCH_REF /* FUNC_ARG fetch may contain it */);
if (EXPECTED(zobj->ce == CACHED_PTR_EX(cache_slot))) {
uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1);
@@ -30980,8 +30740,13 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_U
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;
+ if (0 || (IS_UNUSED & (IS_TMP_VAR|IS_VAR)) != 0) {
+ goto fetch_obj_r_copy;
+ } else {
+fetch_obj_r_fast_copy:
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
+ ZEND_VM_NEXT_OPCODE();
+ }
}
} else if (EXPECTED(zobj->properties != NULL)) {
if (!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET(prop_offset)) {
@@ -30995,8 +30760,12 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_U
(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;
+ retval = &p->val;
+ if (0 || (IS_UNUSED & (IS_TMP_VAR|IS_VAR)) != 0) {
+ goto fetch_obj_r_copy;
+ } else {
+ goto fetch_obj_r_fast_copy;
+ }
}
}
CACHE_PTR_EX(cache_slot + 1, (void*)ZEND_DYNAMIC_PROPERTY_OFFSET);
@@ -31005,34 +30774,39 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_U
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;
+ if (0 || (IS_UNUSED & (IS_TMP_VAR|IS_VAR)) != 0) {
+ goto fetch_obj_r_copy;
+ } else {
+ goto fetch_obj_r_fast_copy;
+ }
}
}
}
} else if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(offset) == IS_UNDEF)) {
- GET_OP2_UNDEF_CV(offset, BP_VAR_R);
+ ZVAL_UNDEFINED_OP2();
}
- 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));
+ 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);
- }
+ if (retval != EX_VAR(opline->result.var)) {
+fetch_obj_r_copy:
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
+ } else if (UNEXPECTED(Z_ISREF_P(retval))) {
+ zend_unwrap_reference(retval);
}
} while (0);
+fetch_obj_r_finish:
+
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ ZEND_VM_TAIL_CALL(ZEND_FETCH_OBJ_R_SPEC_UNUSED_CONST_INLINE_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
+}
+
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -31048,7 +30822,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_CONST_
property = RT_CONSTANT(opline, opline->op2);
result = EX_VAR(opline->result.var);
- zend_fetch_property_address(result, container, IS_UNUSED, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_W OPLINE_CC);
+ zend_fetch_property_address(
+ result, container, IS_UNUSED, property, IS_CONST,
+ ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_FETCH_OBJ_FLAGS) : NULL),
+ BP_VAR_W, opline->extended_value & ZEND_FETCH_OBJ_FLAGS, 1 OPLINE_CC EXECUTE_DATA_CC);
if (IS_UNUSED == IS_VAR) {
FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result);
@@ -31070,7 +30847,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_UNUSED_CONST
}
property = RT_CONSTANT(opline, opline->op2);
result = EX_VAR(opline->result.var);
- zend_fetch_property_address(result, container, IS_UNUSED, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_RW OPLINE_CC);
+ zend_fetch_property_address(result, container, IS_UNUSED, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_RW, 0, 1 OPLINE_CC EXECUTE_DATA_CC);
if (IS_UNUSED == IS_VAR) {
FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result);
@@ -31105,7 +30882,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_UNUSED_CONST
break;
}
}
- goto fetch_obj_is_no_object;
+ ZVAL_NULL(EX_VAR(opline->result.var));
+ goto fetch_obj_is_finish;
} while (0);
}
@@ -31123,8 +30901,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_UNUSED_CONST
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;
+ if (0 || (IS_UNUSED & (IS_TMP_VAR|IS_VAR)) != 0) {
+ goto fetch_obj_is_copy;
+ } else {
+fetch_obj_is_fast_copy:
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
+ ZEND_VM_NEXT_OPCODE();
+ }
}
} else if (EXPECTED(zobj->properties != NULL)) {
if (!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET(prop_offset)) {
@@ -31138,8 +30921,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_UNUSED_CONST
(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;
+ retval = &p->val;
+ if (0 || (IS_UNUSED & (IS_TMP_VAR|IS_VAR)) != 0) {
+ goto fetch_obj_is_copy;
+ } else {
+ goto fetch_obj_is_fast_copy;
+ }
}
}
CACHE_PTR_EX(cache_slot + 1, (void*)ZEND_DYNAMIC_PROPERTY_OFFSET);
@@ -31148,38 +30935,43 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_UNUSED_CONST
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 (0 || (IS_UNUSED & (IS_TMP_VAR|IS_VAR)) != 0) {
+ goto fetch_obj_is_copy;
+ } else {
+ goto fetch_obj_is_fast_copy;
+ }
}
}
}
}
- 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));
+ 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);
- }
+ if (retval != EX_VAR(opline->result.var)) {
+fetch_obj_is_copy:
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
+ } else if (UNEXPECTED(Z_ISREF_P(retval))) {
+ zend_unwrap_reference(retval);
}
} while (0);
+fetch_obj_is_finish:
+
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 0
+ USE_OPLINE
+#endif
+
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));
}
-
ZEND_VM_TAIL_CALL(ZEND_FETCH_OBJ_W_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
} else {
ZEND_VM_TAIL_CALL(ZEND_FETCH_OBJ_R_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
@@ -31201,7 +30993,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_UNUSED_CO
property = RT_CONSTANT(opline, opline->op2);
result = EX_VAR(opline->result.var);
- zend_fetch_property_address(result, container, IS_UNUSED, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_UNSET OPLINE_CC);
+ zend_fetch_property_address(result, container, IS_UNUSED, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_UNSET, 0, 1 OPLINE_CC EXECUTE_DATA_CC);
if (IS_UNUSED == IS_VAR) {
FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result);
@@ -31226,34 +31018,52 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O
value = RT_CONSTANT((opline+1), (opline+1)->op1);
if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
- if (Z_ISREF_P(object)) {
+ if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) {
object = Z_REFVAL_P(object);
- if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
- goto assign_object;
- }
+ goto assign_object;
}
- if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
-
- goto exit_assign_obj;
+ object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC);
+ if (UNEXPECTED(!object)) {
+ value = &EG(uninitialized_zval);
+ goto free_and_exit_assign_obj;
}
}
assign_object:
if (IS_CONST == IS_CONST &&
EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(opline->extended_value))) {
- uintptr_t prop_offset = (uintptr_t)CACHED_PTR(opline->extended_value + sizeof(void*));
+ void **cache_slot = CACHE_ADDR(opline->extended_value);
+ uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1);
zend_object *zobj = Z_OBJ_P(object);
zval *property_val;
if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
property_val = OBJ_PROP(zobj, prop_offset);
if (Z_TYPE_P(property_val) != IS_UNDEF) {
+ zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2);
+
+ if (UNEXPECTED(prop_info != NULL)) {
+ zend_uchar orig_type = IS_UNDEF;
+
+ if (IS_CONST == IS_CONST) {
+ orig_type = Z_TYPE_P(value);
+ }
+
+ value = zend_assign_to_typed_prop(prop_info, property_val, value EXECUTE_DATA_CC);
+
+ /* will remain valid, thus no need to check prop_info in future here */
+ if (IS_CONST == IS_CONST && Z_TYPE_P(value) == orig_type) {
+ CACHE_PTR_EX(cache_slot + 2, NULL);
+ }
+ goto free_and_exit_assign_obj;
+ } else {
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);
+ value = zend_assign_to_variable(property_val, value, IS_CONST, EX_USES_STRICT_TYPES());
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+ ZVAL_COPY(EX_VAR(opline->result.var), value);
+ }
+ goto exit_assign_obj;
}
- goto exit_assign_obj;
}
} else {
if (EXPECTED(zobj->properties != NULL)) {
@@ -31307,18 +31117,13 @@ fast_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_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL);
+ value = Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL);
+free_and_exit_assign_obj:
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
}
@@ -31330,6 +31135,7 @@ exit_assign_obj:
ZEND_VM_NEXT_OPCODE_EX(1, 2);
}
+/* No specialization for op_types (CONST|TMPVAR|CV, UNUSED|CONST|VAR) */
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_OP_DATA_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -31347,34 +31153,52 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O
value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
- if (Z_ISREF_P(object)) {
+ if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) {
object = Z_REFVAL_P(object);
- if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
- goto assign_object;
- }
+ goto assign_object;
}
- if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
- zval_ptr_dtor_nogc(free_op_data);
- goto exit_assign_obj;
+ object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC);
+ if (UNEXPECTED(!object)) {
+ value = &EG(uninitialized_zval);
+ goto free_and_exit_assign_obj;
}
}
assign_object:
if (IS_CONST == IS_CONST &&
EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(opline->extended_value))) {
- uintptr_t prop_offset = (uintptr_t)CACHED_PTR(opline->extended_value + sizeof(void*));
+ void **cache_slot = CACHE_ADDR(opline->extended_value);
+ uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1);
zend_object *zobj = Z_OBJ_P(object);
zval *property_val;
if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
property_val = OBJ_PROP(zobj, prop_offset);
if (Z_TYPE_P(property_val) != IS_UNDEF) {
+ zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2);
+
+ if (UNEXPECTED(prop_info != NULL)) {
+ zend_uchar orig_type = IS_UNDEF;
+
+ if (IS_TMP_VAR == IS_CONST) {
+ orig_type = Z_TYPE_P(value);
+ }
+
+ value = zend_assign_to_typed_prop(prop_info, property_val, value EXECUTE_DATA_CC);
+
+ /* will remain valid, thus no need to check prop_info in future here */
+ if (IS_TMP_VAR == IS_CONST && Z_TYPE_P(value) == orig_type) {
+ CACHE_PTR_EX(cache_slot + 2, NULL);
+ }
+ goto free_and_exit_assign_obj;
+ } else {
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);
+ value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES());
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+ ZVAL_COPY(EX_VAR(opline->result.var), value);
+ }
+ goto exit_assign_obj;
}
- goto exit_assign_obj;
}
} else {
if (EXPECTED(zobj->properties != NULL)) {
@@ -31428,18 +31252,13 @@ fast_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_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL);
+ value = Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL);
+free_and_exit_assign_obj:
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
}
@@ -31451,6 +31270,7 @@ exit_assign_obj:
ZEND_VM_NEXT_OPCODE_EX(1, 2);
}
+/* No specialization for op_types (CONST|TMPVAR|CV, UNUSED|CONST|VAR) */
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -31468,34 +31288,52 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O
value = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
- if (Z_ISREF_P(object)) {
+ if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) {
object = Z_REFVAL_P(object);
- if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
- goto assign_object;
- }
+ goto assign_object;
}
- if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
- zval_ptr_dtor_nogc(free_op_data);
- goto exit_assign_obj;
+ object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC);
+ if (UNEXPECTED(!object)) {
+ value = &EG(uninitialized_zval);
+ goto free_and_exit_assign_obj;
}
}
assign_object:
if (IS_CONST == IS_CONST &&
EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(opline->extended_value))) {
- uintptr_t prop_offset = (uintptr_t)CACHED_PTR(opline->extended_value + sizeof(void*));
+ void **cache_slot = CACHE_ADDR(opline->extended_value);
+ uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1);
zend_object *zobj = Z_OBJ_P(object);
zval *property_val;
if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
property_val = OBJ_PROP(zobj, prop_offset);
if (Z_TYPE_P(property_val) != IS_UNDEF) {
+ zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2);
+
+ if (UNEXPECTED(prop_info != NULL)) {
+ zend_uchar orig_type = IS_UNDEF;
+
+ if (IS_VAR == IS_CONST) {
+ orig_type = Z_TYPE_P(value);
+ }
+
+ value = zend_assign_to_typed_prop(prop_info, property_val, value EXECUTE_DATA_CC);
+
+ /* will remain valid, thus no need to check prop_info in future here */
+ if (IS_VAR == IS_CONST && Z_TYPE_P(value) == orig_type) {
+ CACHE_PTR_EX(cache_slot + 2, NULL);
+ }
+ goto free_and_exit_assign_obj;
+ } else {
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);
+ value = zend_assign_to_variable(property_val, value, IS_VAR, EX_USES_STRICT_TYPES());
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+ ZVAL_COPY(EX_VAR(opline->result.var), value);
+ }
+ goto exit_assign_obj;
}
- goto exit_assign_obj;
}
} else {
if (EXPECTED(zobj->properties != NULL)) {
@@ -31549,18 +31387,13 @@ fast_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_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL);
+ value = Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL);
+free_and_exit_assign_obj:
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
}
@@ -31572,6 +31405,7 @@ exit_assign_obj:
ZEND_VM_NEXT_OPCODE_EX(1, 2);
}
+/* No specialization for op_types (CONST|TMPVAR|CV, UNUSED|CONST|VAR) */
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -31589,34 +31423,52 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O
value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC);
if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
- if (Z_ISREF_P(object)) {
+ if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) {
object = Z_REFVAL_P(object);
- if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
- goto assign_object;
- }
+ goto assign_object;
}
- if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
-
- goto exit_assign_obj;
+ object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC);
+ if (UNEXPECTED(!object)) {
+ value = &EG(uninitialized_zval);
+ goto free_and_exit_assign_obj;
}
}
assign_object:
if (IS_CONST == IS_CONST &&
EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(opline->extended_value))) {
- uintptr_t prop_offset = (uintptr_t)CACHED_PTR(opline->extended_value + sizeof(void*));
+ void **cache_slot = CACHE_ADDR(opline->extended_value);
+ uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1);
zend_object *zobj = Z_OBJ_P(object);
zval *property_val;
if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
property_val = OBJ_PROP(zobj, prop_offset);
if (Z_TYPE_P(property_val) != IS_UNDEF) {
+ zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2);
+
+ if (UNEXPECTED(prop_info != NULL)) {
+ zend_uchar orig_type = IS_UNDEF;
+
+ if (IS_CV == IS_CONST) {
+ orig_type = Z_TYPE_P(value);
+ }
+
+ value = zend_assign_to_typed_prop(prop_info, property_val, value EXECUTE_DATA_CC);
+
+ /* will remain valid, thus no need to check prop_info in future here */
+ if (IS_CV == IS_CONST && Z_TYPE_P(value) == orig_type) {
+ CACHE_PTR_EX(cache_slot + 2, NULL);
+ }
+ goto free_and_exit_assign_obj;
+ } else {
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);
+ value = zend_assign_to_variable(property_val, value, IS_CV, EX_USES_STRICT_TYPES());
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+ ZVAL_COPY(EX_VAR(opline->result.var), value);
+ }
+ goto exit_assign_obj;
}
- goto exit_assign_obj;
}
} else {
if (EXPECTED(zobj->properties != NULL)) {
@@ -31670,18 +31522,13 @@ fast_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_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL);
+ value = Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL);
+free_and_exit_assign_obj:
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
}
@@ -31693,6 +31540,91 @@ exit_assign_obj:
ZEND_VM_NEXT_OPCODE_EX(1, 2);
}
+/* No specialization for op_types (CONST|TMPVAR|CV, UNUSED|CONST|VAR) */
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CONST_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op_data;
+ zval *property, *container, *value_ptr;
+
+ SAVE_OPLINE();
+
+ container = &EX(This);
+
+ if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
+ ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
+ }
+
+ property = RT_CONSTANT(opline, opline->op2);
+
+ value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
+
+ if (1) {
+ if (IS_UNUSED == IS_UNUSED) {
+ if (IS_CONST == IS_CONST) {
+ zend_assign_to_property_reference_this_const(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ } else {
+ zend_assign_to_property_reference_this_var(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ }
+ } else {
+ if (IS_CONST == IS_CONST) {
+ zend_assign_to_property_reference_var_const(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ } else {
+ zend_assign_to_property_reference_var_var(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ }
+ }
+ } else {
+ zend_assign_to_property_reference(container, IS_UNUSED, property, IS_CONST, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ }
+
+
+ if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);};
+ ZEND_VM_NEXT_OPCODE_EX(1, 2);
+}
+
+/* No specialization for op_types (CONST|TMPVAR|CV, UNUSED|CONST|VAR) */
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CONST_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+
+ zval *property, *container, *value_ptr;
+
+ SAVE_OPLINE();
+
+ container = &EX(This);
+
+ if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
+ ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
+ }
+
+ property = RT_CONSTANT(opline, opline->op2);
+
+ value_ptr = _get_zval_ptr_cv_BP_VAR_W((opline+1)->op1.var EXECUTE_DATA_CC);
+
+ if (1) {
+ if (IS_UNUSED == IS_UNUSED) {
+ if (IS_CONST == IS_CONST) {
+ zend_assign_to_property_reference_this_const(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ } else {
+ zend_assign_to_property_reference_this_var(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ }
+ } else {
+ if (IS_CONST == IS_CONST) {
+ zend_assign_to_property_reference_var_const(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ } else {
+ zend_assign_to_property_reference_var_var(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ }
+ }
+ } else {
+ zend_assign_to_property_reference(container, IS_UNUSED, property, IS_CONST, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ }
+
+
+
+ ZEND_VM_NEXT_OPCODE_EX(1, 2);
+}
+
+/* No specialization for op_types (CONST|TMPVAR|CV, UNUSED|CONST|VAR) */
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ROPE_INIT_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -31719,7 +31651,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ROPE_INIT_SPEC_UNUSED_CONST_HA
} else {
SAVE_OPLINE();
if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(var) == IS_UNDEF)) {
- GET_OP2_UNDEF_CV(var, BP_VAR_R);
+ ZVAL_UNDEFINED_OP2();
}
rope[0] = zval_get_string_func(var);
@@ -31744,7 +31676,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_CLASS_SPEC_UNUSED_CONST_
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);
+ ce = zend_fetch_class_by_name(Z_STR_P(class_name), Z_STR_P(class_name + 1), opline->op1.num);
CACHE_PTR(opline->extended_value, ce);
}
Z_CE_P(EX_VAR(opline->result.var)) = ce;
@@ -31760,7 +31692,7 @@ try_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);
+ ZVAL_UNDEFINED_OP2();
if (UNEXPECTED(EG(exception) != NULL)) {
HANDLE_EXCEPTION();
}
@@ -31805,7 +31737,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_S
break;
}
} else if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(function_name) == IS_UNDEF)) {
- GET_OP2_UNDEF_CV(function_name, BP_VAR_R);
+ ZVAL_UNDEFINED_OP2();
if (UNEXPECTED(EG(exception) != NULL)) {
HANDLE_EXCEPTION();
@@ -31828,7 +31760,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_S
}
}
if (IS_UNUSED == IS_CV && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
- object = GET_OP1_UNDEF_CV(object, BP_VAR_R);
+ object = ZVAL_UNDEFINED_OP1();
if (UNEXPECTED(EG(exception) != NULL)) {
if (IS_CONST != IS_CONST) {
@@ -31856,13 +31788,6 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_S
} else {
zend_object *orig_obj = obj;
- if (UNEXPECTED(obj->handlers->get_method == NULL)) {
- zend_throw_error(NULL, "Object does not support method calls");
-
-
- HANDLE_EXCEPTION();
- }
-
if (IS_CONST == IS_CONST) {
function_name = RT_CONSTANT(opline, opline->op2);
}
@@ -31887,7 +31812,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_S
/* Reset "object" to trigger reference counting */
object = NULL;
}
- if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
+ if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!RUN_TIME_CACHE(&fbc->op_array))) {
init_func_run_time_cache(&fbc->op_array);
}
}
@@ -31896,26 +31821,28 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_S
}
- call_info = ZEND_CALL_NESTED_FUNCTION;
+ call_info = ZEND_CALL_NESTED_FUNCTION | ZEND_CALL_HAS_THIS;
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();
}
+ /* call static method */
+ obj = (zend_object*)called_scope;
+ call_info = ZEND_CALL_NESTED_FUNCTION;
} 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 */
}
+ /* CV may be changed indirectly (e.g. when it's a reference) */
+ call_info = ZEND_CALL_NESTED_FUNCTION | ZEND_CALL_HAS_THIS | ZEND_CALL_RELEASE_THIS;
}
call = zend_vm_stack_push_call_frame(call_info,
- fbc, opline->extended_value, called_scope, obj);
+ fbc, opline->extended_value, obj);
call->prev_execute_data = EX(call);
EX(call) = call;
@@ -31927,7 +31854,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_U
USE_OPLINE
zval *function_name;
zend_class_entry *ce;
- zend_object *object;
+ uint32_t call_info;
zend_function *fbc;
zend_execute_data *call;
@@ -31937,7 +31864,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_U
/* 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);
+ ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op1)), Z_STR_P(RT_CONSTANT(opline, opline->op1) + 1), ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
if (UNEXPECTED(ce == NULL)) {
ZEND_ASSERT(EG(exception));
@@ -31979,7 +31906,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_U
break;
}
} else if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(function_name) == IS_UNDEF)) {
- GET_OP2_UNDEF_CV(function_name, BP_VAR_R);
+ ZVAL_UNDEFINED_OP2();
if (UNEXPECTED(EG(exception) != NULL)) {
HANDLE_EXCEPTION();
}
@@ -32008,7 +31935,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_U
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)) {
+ if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!RUN_TIME_CACHE(&fbc->op_array))) {
init_func_run_time_cache(&fbc->op_array);
}
if (IS_CONST != IS_CONST) {
@@ -32024,38 +31951,39 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_U
HANDLE_EXCEPTION();
}
fbc = ce->constructor;
- if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
+ if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!RUN_TIME_CACHE(&fbc->op_array))) {
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;
+ ce = (zend_class_entry*)Z_OBJ(EX(This));
+ call_info = ZEND_CALL_NESTED_FUNCTION | ZEND_CALL_HAS_THIS;
} else {
zend_non_static_method_call(fbc);
if (UNEXPECTED(EG(exception) != NULL)) {
HANDLE_EXCEPTION();
}
+ goto check_parent_and_self;
}
- }
-
- if (IS_UNUSED == IS_UNUSED) {
+ } else {
+check_parent_and_self:
/* 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 (IS_UNUSED == IS_UNUSED
+ && ((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_info = ZEND_CALL_NESTED_FUNCTION;
}
- call = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
- fbc, opline->extended_value, ce, object);
+ call = zend_vm_stack_push_call_frame(call_info,
+ fbc, opline->extended_value, ce);
call->prev_execute_data = EX(call);
EX(call) = call;
@@ -32095,7 +32023,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_CLASS_CONSTANT_SPEC_UNUS
} 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);
+ ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op1)), Z_STR_P(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));
@@ -32149,6 +32077,27 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_CLASS_CONSTANT_SPEC_UNUS
ZEND_VM_NEXT_OPCODE();
}
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ zval *array;
+ uint32_t size;
+ USE_OPLINE
+
+ array = EX_VAR(opline->result.var);
+ if (IS_UNUSED != 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_NULL_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
+ } else {
+ ZVAL_ARR(array, zend_new_array(0));
+ ZEND_VM_NEXT_OPCODE();
+ }
+}
+
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -32168,17 +32117,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_UNUSED_CONST_HA
if (Z_ISREF_P(container)) {
container = Z_REFVAL_P(container);
if (Z_TYPE_P(container) != IS_OBJECT) {
+ if (IS_UNUSED == IS_CV
+ && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
+ ZVAL_UNDEFINED_OP1();
+ }
break;
}
} else {
break;
}
}
- if (Z_OBJ_HT_P(container)->unset_property) {
- Z_OBJ_HT_P(container)->unset_property(container, offset, ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL));
- } else {
- zend_wrong_property_unset(offset);
- }
+ Z_OBJ_HT_P(container)->unset_property(container, offset, ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL));
} while (0);
@@ -32207,21 +32156,20 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_UN
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;
+ result = (opline->extended_value & ZEND_ISEMPTY);
+ goto isset_object_finish;
}
} else {
- goto isset_no_object;
+ result = (opline->extended_value & ZEND_ISEMPTY);
+ goto isset_object_finish;
}
}
- 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));
- }
+
+ 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));
+
+isset_object_finish:
ZEND_VM_SMART_BRANCH(result, 1);
@@ -32270,20 +32218,23 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_UNUSED_CONST_HANDLE
/* 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 {
+ do {
+ if (IS_UNUSED == IS_VAR) {
+ ZEND_ASSERT(value_ptr != &EG(uninitialized_zval));
+ if (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);
+ break;
+ }
+ }
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));
- }
+ } while (0);
}
} else {
@@ -32366,14 +32317,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_UNUSED_CONST_HANDLE
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)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_OP_SPEC_UNUSED_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zend_free_op free_op2, free_op_data1;
+ zend_free_op free_op2, free_op_data;
zval *object;
zval *property;
zval *value;
zval *zptr;
+ void **cache_slot;
+ zend_property_info *prop_info;
SAVE_OPLINE();
object = &EX(This);
@@ -32385,138 +32338,84 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP
property = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
do {
- value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data1);
+ value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data);
if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
- if (Z_ISREF_P(object)) {
+ if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) {
object = Z_REFVAL_P(object);
- if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
- goto assign_op_object;
- }
+ goto assign_op_object;
}
- if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
+ if (IS_UNUSED == IS_CV
+ && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
+ ZVAL_UNDEFINED_OP1();
+ }
+ object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC);
+ if (UNEXPECTED(!object)) {
break;
}
}
- /* here we are sure we are dealing with an object */
assign_op_object:
- if (EXPECTED(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)) {
+ /* here we are sure we are dealing with an object */
+ cache_slot = ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR((opline+1)->extended_value) : NULL;
+ if (EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, cache_slot)) != NULL)) {
if (UNEXPECTED(Z_ISERROR_P(zptr))) {
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_NULL(EX_VAR(opline->result.var));
}
} else {
- ZVAL_DEREF(zptr);
+ zval *orig_zptr = zptr;
+ zend_reference *ref;
+
+ do {
+ if (UNEXPECTED(Z_ISREF_P(zptr))) {
+ ref = Z_REF_P(zptr);
+ zptr = Z_REFVAL_P(zptr);
+ if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) {
+ zend_binary_assign_op_typed_ref(ref, value OPLINE_CC EXECUTE_DATA_CC);
+ break;
+ }
+ }
+
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
+ prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2);
+ } else {
+ prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(object), orig_zptr);
+ }
+ if (UNEXPECTED(prop_info)) {
+ /* special case for typed properties */
+ zend_binary_assign_op_typed_prop(prop_info, zptr, value OPLINE_CC EXECUTE_DATA_CC);
+ } else {
+ zend_binary_op(zptr, zptr, value OPLINE_CC);
+ }
+ } while (0);
- binary_op(zptr, zptr, value);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), zptr);
}
}
} else {
- zend_assign_op_overloaded_property(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR((opline+1)->extended_value) : NULL), value, binary_op OPLINE_CC EXECUTE_DATA_CC);
+ zend_assign_op_overloaded_property(object, property, cache_slot, value OPLINE_CC EXECUTE_DATA_CC);
}
} while (0);
- FREE_OP(free_op_data1);
+ FREE_OP(free_op_data);
zval_ptr_dtor_nogc(free_op2);
/* assign_obj has two opcodes! */
ZEND_VM_NEXT_OPCODE_EX(1, 2);
}
-static zend_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
-# 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_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)
+/* No specialization for op_types (CONST|TMP|VAR|CV, UNUSED|CONST|TMPVAR) */
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_OBJ_SPEC_UNUSED_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zend_free_op free_op2;
zval *object;
zval *property;
zval *zptr;
+ void **cache_slot;
+ zend_property_info *prop_info;
SAVE_OPLINE();
object = &EX(This);
@@ -32529,47 +32428,38 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE
do {
if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
- if (Z_ISREF_P(object)) {
+ if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) {
object = Z_REFVAL_P(object);
- if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
- goto pre_incdec_object;
- }
+ goto pre_incdec_object;
}
- if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
+ if (IS_UNUSED == IS_CV
+ && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
+ ZVAL_UNDEFINED_OP1();
+ }
+ object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC);
+ if (UNEXPECTED(!object)) {
break;
}
}
- /* here we are sure we are dealing with an object */
pre_incdec_object:
- if (EXPECTED(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)) {
+ /* here we are sure we are dealing with an object */
+ cache_slot = ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL;
+ if (EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, cache_slot)) != NULL)) {
if (UNEXPECTED(Z_ISERROR_P(zptr))) {
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_NULL(EX_VAR(opline->result.var));
}
} else {
- if (EXPECTED(Z_TYPE_P(zptr) == IS_LONG)) {
- if (inc) {
- fast_long_increment_function(zptr);
- } else {
- fast_long_decrement_function(zptr);
- }
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
+ prop_info = (zend_property_info *) CACHED_PTR_EX(cache_slot + 2);
} else {
- ZVAL_DEREF(zptr);
-
- if (inc) {
- increment_function(zptr);
- } else {
- decrement_function(zptr);
- }
- }
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY(EX_VAR(opline->result.var), zptr);
+ prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(object), zptr);
}
+ zend_pre_incdec_property_zval(zptr, prop_info OPLINE_CC EXECUTE_DATA_CC);
}
} else {
- zend_pre_incdec_overloaded_property(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), inc OPLINE_CC EXECUTE_DATA_CC);
+ zend_pre_incdec_overloaded_property(object, property, cache_slot OPLINE_CC EXECUTE_DATA_CC);
}
} while (0);
@@ -32578,23 +32468,15 @@ pre_incdec_object:
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)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_OBJ_SPEC_UNUSED_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zend_free_op free_op2;
zval *object;
zval *property;
zval *zptr;
+ void **cache_slot;
+ zend_property_info *prop_info;
SAVE_OPLINE();
object = &EX(This);
@@ -32607,43 +32489,37 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP
do {
if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
- if (Z_ISREF_P(object)) {
+ if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) {
object = Z_REFVAL_P(object);
- if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
- goto post_incdec_object;
- }
+ goto post_incdec_object;
}
- if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
+ if (IS_UNUSED == IS_CV
+ && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
+ ZVAL_UNDEFINED_OP1();
+ }
+ object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC);
+ if (UNEXPECTED(!object)) {
break;
}
}
- /* here we are sure we are dealing with an object */
post_incdec_object:
- if (EXPECTED(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)) {
+ /* here we are sure we are dealing with an object */
+ cache_slot = ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL;
+ if (EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, cache_slot)) != NULL)) {
if (UNEXPECTED(Z_ISERROR_P(zptr))) {
ZVAL_NULL(EX_VAR(opline->result.var));
} else {
- if (EXPECTED(Z_TYPE_P(zptr) == IS_LONG)) {
- ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(zptr));
- if (inc) {
- fast_long_increment_function(zptr);
- } else {
- fast_long_decrement_function(zptr);
- }
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
+ prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2);
} else {
- ZVAL_DEREF(zptr);
- ZVAL_COPY(EX_VAR(opline->result.var), zptr);
- if (inc) {
- increment_function(zptr);
- } else {
- decrement_function(zptr);
- }
+ prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(object), zptr);
}
+
+ zend_post_incdec_property_zval(zptr, prop_info OPLINE_CC EXECUTE_DATA_CC);
}
} else {
- zend_post_incdec_overloaded_property(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), inc OPLINE_CC EXECUTE_DATA_CC);
+ zend_post_incdec_overloaded_property(object, property, cache_slot OPLINE_CC EXECUTE_DATA_CC);
}
} while (0);
@@ -32652,16 +32528,6 @@ post_incdec_object:
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
@@ -32690,12 +32556,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_TMPVAR
}
}
if (IS_UNUSED == IS_CV && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
- GET_OP1_UNDEF_CV(container, BP_VAR_R);
+ ZVAL_UNDEFINED_OP1();
}
if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(offset) == IS_UNDEF)) {
- GET_OP2_UNDEF_CV(offset, BP_VAR_R);
+ ZVAL_UNDEFINED_OP2();
}
- goto fetch_obj_r_no_object;
+ zend_wrong_property_read(offset);
+ ZVAL_NULL(EX_VAR(opline->result.var));
+ goto fetch_obj_r_finish;
} while (0);
}
@@ -32705,7 +32573,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_TMPVAR
zval *retval;
if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
- cache_slot = CACHE_ADDR(opline->extended_value);
+ cache_slot = CACHE_ADDR(opline->extended_value & ~ZEND_FETCH_REF /* FUNC_ARG fetch may contain it */);
if (EXPECTED(zobj->ce == CACHED_PTR_EX(cache_slot))) {
uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1);
@@ -32713,8 +32581,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_TMPVAR
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;
+ if (0 || (IS_UNUSED & (IS_TMP_VAR|IS_VAR)) != 0) {
+ goto fetch_obj_r_copy;
+ } else {
+fetch_obj_r_fast_copy:
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
+ ZEND_VM_NEXT_OPCODE();
+ }
}
} else if (EXPECTED(zobj->properties != NULL)) {
if (!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET(prop_offset)) {
@@ -32728,8 +32601,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_TMPVAR
(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;
+ retval = &p->val;
+ if (0 || (IS_UNUSED & (IS_TMP_VAR|IS_VAR)) != 0) {
+ goto fetch_obj_r_copy;
+ } else {
+ goto fetch_obj_r_fast_copy;
+ }
}
}
CACHE_PTR_EX(cache_slot + 1, (void*)ZEND_DYNAMIC_PROPERTY_OFFSET);
@@ -32738,30 +32615,29 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_TMPVAR
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;
+ if (0 || (IS_UNUSED & (IS_TMP_VAR|IS_VAR)) != 0) {
+ goto fetch_obj_r_copy;
+ } else {
+ goto fetch_obj_r_fast_copy;
+ }
}
}
}
} 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);
+ ZVAL_UNDEFINED_OP2();
}
- 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));
+ 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);
- }
+ if (retval != EX_VAR(opline->result.var)) {
+fetch_obj_r_copy:
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
+ } else if (UNEXPECTED(Z_ISREF_P(retval))) {
+ zend_unwrap_reference(retval);
}
} while (0);
+fetch_obj_r_finish:
zval_ptr_dtor_nogc(free_op2);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
@@ -32782,7 +32658,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_TMPVAR
property = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
result = EX_VAR(opline->result.var);
- zend_fetch_property_address(result, container, IS_UNUSED, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_W OPLINE_CC);
+ zend_fetch_property_address(
+ result, container, IS_UNUSED, property, (IS_TMP_VAR|IS_VAR),
+ (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_FETCH_OBJ_FLAGS) : NULL),
+ BP_VAR_W, opline->extended_value & ZEND_FETCH_OBJ_FLAGS, 1 OPLINE_CC EXECUTE_DATA_CC);
zval_ptr_dtor_nogc(free_op2);
if (IS_UNUSED == IS_VAR) {
FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result);
@@ -32804,7 +32683,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_UNUSED_TMPVA
}
property = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
result = EX_VAR(opline->result.var);
- zend_fetch_property_address(result, container, IS_UNUSED, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_RW OPLINE_CC);
+ zend_fetch_property_address(result, container, IS_UNUSED, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_RW, 0, 1 OPLINE_CC EXECUTE_DATA_CC);
zval_ptr_dtor_nogc(free_op2);
if (IS_UNUSED == IS_VAR) {
FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result);
@@ -32839,7 +32718,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_UNUSED_TMPVA
break;
}
}
- goto fetch_obj_is_no_object;
+ ZVAL_NULL(EX_VAR(opline->result.var));
+ goto fetch_obj_is_finish;
} while (0);
}
@@ -32857,8 +32737,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_UNUSED_TMPVA
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;
+ if (0 || (IS_UNUSED & (IS_TMP_VAR|IS_VAR)) != 0) {
+ goto fetch_obj_is_copy;
+ } else {
+fetch_obj_is_fast_copy:
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
+ ZEND_VM_NEXT_OPCODE();
+ }
}
} else if (EXPECTED(zobj->properties != NULL)) {
if (!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET(prop_offset)) {
@@ -32872,8 +32757,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_UNUSED_TMPVA
(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;
+ retval = &p->val;
+ if (0 || (IS_UNUSED & (IS_TMP_VAR|IS_VAR)) != 0) {
+ goto fetch_obj_is_copy;
+ } else {
+ goto fetch_obj_is_fast_copy;
+ }
}
}
CACHE_PTR_EX(cache_slot + 1, (void*)ZEND_DYNAMIC_PROPERTY_OFFSET);
@@ -32882,26 +32771,27 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_UNUSED_TMPVA
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 (0 || (IS_UNUSED & (IS_TMP_VAR|IS_VAR)) != 0) {
+ goto fetch_obj_is_copy;
+ } else {
+ goto fetch_obj_is_fast_copy;
+ }
}
}
}
}
- 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));
+ 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);
- }
+ if (retval != EX_VAR(opline->result.var)) {
+fetch_obj_is_copy:
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
+ } else if (UNEXPECTED(Z_ISREF_P(retval))) {
+ zend_unwrap_reference(retval);
}
} while (0);
+fetch_obj_is_finish:
zval_ptr_dtor_nogc(free_op2);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
@@ -32909,12 +32799,15 @@ fetch_obj_is_no_object:
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
+#if 0
+ USE_OPLINE
+#endif
+
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));
}
-
ZEND_VM_TAIL_CALL(ZEND_FETCH_OBJ_W_SPEC_UNUSED_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
} else {
ZEND_VM_TAIL_CALL(ZEND_FETCH_OBJ_R_SPEC_UNUSED_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
@@ -32936,7 +32829,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_UNUSED_TM
property = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
result = EX_VAR(opline->result.var);
- zend_fetch_property_address(result, container, IS_UNUSED, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_UNSET OPLINE_CC);
+ zend_fetch_property_address(result, container, IS_UNUSED, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_UNSET, 0, 1 OPLINE_CC EXECUTE_DATA_CC);
zval_ptr_dtor_nogc(free_op2);
if (IS_UNUSED == IS_VAR) {
FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result);
@@ -32961,34 +32854,52 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_
value = RT_CONSTANT((opline+1), (opline+1)->op1);
if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
- if (Z_ISREF_P(object)) {
+ if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) {
object = Z_REFVAL_P(object);
- if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
- goto assign_object;
- }
+ goto assign_object;
}
- if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
-
- goto exit_assign_obj;
+ object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC);
+ if (UNEXPECTED(!object)) {
+ value = &EG(uninitialized_zval);
+ goto free_and_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*));
+ void **cache_slot = CACHE_ADDR(opline->extended_value);
+ uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1);
zend_object *zobj = Z_OBJ_P(object);
zval *property_val;
if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
property_val = OBJ_PROP(zobj, prop_offset);
if (Z_TYPE_P(property_val) != IS_UNDEF) {
+ zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2);
+
+ if (UNEXPECTED(prop_info != NULL)) {
+ zend_uchar orig_type = IS_UNDEF;
+
+ if (IS_CONST == IS_CONST) {
+ orig_type = Z_TYPE_P(value);
+ }
+
+ value = zend_assign_to_typed_prop(prop_info, property_val, value EXECUTE_DATA_CC);
+
+ /* will remain valid, thus no need to check prop_info in future here */
+ if (IS_CONST == IS_CONST && Z_TYPE_P(value) == orig_type) {
+ CACHE_PTR_EX(cache_slot + 2, NULL);
+ }
+ goto free_and_exit_assign_obj;
+ } else {
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);
+ value = zend_assign_to_variable(property_val, value, IS_CONST, EX_USES_STRICT_TYPES());
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+ ZVAL_COPY(EX_VAR(opline->result.var), value);
+ }
+ goto exit_assign_obj;
}
- goto exit_assign_obj;
}
} else {
if (EXPECTED(zobj->properties != NULL)) {
@@ -33042,18 +32953,13 @@ fast_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);
+ value = Z_OBJ_HT_P(object)->write_property(object, property, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL);
+free_and_exit_assign_obj:
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
}
@@ -33065,6 +32971,7 @@ exit_assign_obj:
ZEND_VM_NEXT_OPCODE_EX(1, 2);
}
+/* No specialization for op_types (CONST|TMPVAR|CV, UNUSED|CONST|VAR) */
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_OP_DATA_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -33082,34 +32989,52 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_
value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
- if (Z_ISREF_P(object)) {
+ if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) {
object = Z_REFVAL_P(object);
- if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
- goto assign_object;
- }
+ goto assign_object;
}
- if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
- zval_ptr_dtor_nogc(free_op_data);
- goto exit_assign_obj;
+ object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC);
+ if (UNEXPECTED(!object)) {
+ value = &EG(uninitialized_zval);
+ goto free_and_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*));
+ void **cache_slot = CACHE_ADDR(opline->extended_value);
+ uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1);
zend_object *zobj = Z_OBJ_P(object);
zval *property_val;
if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
property_val = OBJ_PROP(zobj, prop_offset);
if (Z_TYPE_P(property_val) != IS_UNDEF) {
+ zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2);
+
+ if (UNEXPECTED(prop_info != NULL)) {
+ zend_uchar orig_type = IS_UNDEF;
+
+ if (IS_TMP_VAR == IS_CONST) {
+ orig_type = Z_TYPE_P(value);
+ }
+
+ value = zend_assign_to_typed_prop(prop_info, property_val, value EXECUTE_DATA_CC);
+
+ /* will remain valid, thus no need to check prop_info in future here */
+ if (IS_TMP_VAR == IS_CONST && Z_TYPE_P(value) == orig_type) {
+ CACHE_PTR_EX(cache_slot + 2, NULL);
+ }
+ goto free_and_exit_assign_obj;
+ } else {
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);
+ value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES());
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+ ZVAL_COPY(EX_VAR(opline->result.var), value);
+ }
+ goto exit_assign_obj;
}
- goto exit_assign_obj;
}
} else {
if (EXPECTED(zobj->properties != NULL)) {
@@ -33163,18 +33088,13 @@ fast_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);
+ value = Z_OBJ_HT_P(object)->write_property(object, property, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL);
+free_and_exit_assign_obj:
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
}
@@ -33186,6 +33106,7 @@ exit_assign_obj:
ZEND_VM_NEXT_OPCODE_EX(1, 2);
}
+/* No specialization for op_types (CONST|TMPVAR|CV, UNUSED|CONST|VAR) */
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -33203,34 +33124,52 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_
value = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
- if (Z_ISREF_P(object)) {
+ if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) {
object = Z_REFVAL_P(object);
- if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
- goto assign_object;
- }
+ goto assign_object;
}
- if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
- zval_ptr_dtor_nogc(free_op_data);
- goto exit_assign_obj;
+ object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC);
+ if (UNEXPECTED(!object)) {
+ value = &EG(uninitialized_zval);
+ goto free_and_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*));
+ void **cache_slot = CACHE_ADDR(opline->extended_value);
+ uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1);
zend_object *zobj = Z_OBJ_P(object);
zval *property_val;
if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
property_val = OBJ_PROP(zobj, prop_offset);
if (Z_TYPE_P(property_val) != IS_UNDEF) {
+ zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2);
+
+ if (UNEXPECTED(prop_info != NULL)) {
+ zend_uchar orig_type = IS_UNDEF;
+
+ if (IS_VAR == IS_CONST) {
+ orig_type = Z_TYPE_P(value);
+ }
+
+ value = zend_assign_to_typed_prop(prop_info, property_val, value EXECUTE_DATA_CC);
+
+ /* will remain valid, thus no need to check prop_info in future here */
+ if (IS_VAR == IS_CONST && Z_TYPE_P(value) == orig_type) {
+ CACHE_PTR_EX(cache_slot + 2, NULL);
+ }
+ goto free_and_exit_assign_obj;
+ } else {
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);
+ value = zend_assign_to_variable(property_val, value, IS_VAR, EX_USES_STRICT_TYPES());
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+ ZVAL_COPY(EX_VAR(opline->result.var), value);
+ }
+ goto exit_assign_obj;
}
- goto exit_assign_obj;
}
} else {
if (EXPECTED(zobj->properties != NULL)) {
@@ -33284,18 +33223,13 @@ fast_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);
+ value = Z_OBJ_HT_P(object)->write_property(object, property, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL);
+free_and_exit_assign_obj:
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
}
@@ -33307,6 +33241,7 @@ exit_assign_obj:
ZEND_VM_NEXT_OPCODE_EX(1, 2);
}
+/* No specialization for op_types (CONST|TMPVAR|CV, UNUSED|CONST|VAR) */
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -33324,34 +33259,52 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_
value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC);
if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
- if (Z_ISREF_P(object)) {
+ if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) {
object = Z_REFVAL_P(object);
- if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
- goto assign_object;
- }
+ goto assign_object;
}
- if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
-
- goto exit_assign_obj;
+ object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC);
+ if (UNEXPECTED(!object)) {
+ value = &EG(uninitialized_zval);
+ goto free_and_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*));
+ void **cache_slot = CACHE_ADDR(opline->extended_value);
+ uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1);
zend_object *zobj = Z_OBJ_P(object);
zval *property_val;
if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
property_val = OBJ_PROP(zobj, prop_offset);
if (Z_TYPE_P(property_val) != IS_UNDEF) {
+ zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2);
+
+ if (UNEXPECTED(prop_info != NULL)) {
+ zend_uchar orig_type = IS_UNDEF;
+
+ if (IS_CV == IS_CONST) {
+ orig_type = Z_TYPE_P(value);
+ }
+
+ value = zend_assign_to_typed_prop(prop_info, property_val, value EXECUTE_DATA_CC);
+
+ /* will remain valid, thus no need to check prop_info in future here */
+ if (IS_CV == IS_CONST && Z_TYPE_P(value) == orig_type) {
+ CACHE_PTR_EX(cache_slot + 2, NULL);
+ }
+ goto free_and_exit_assign_obj;
+ } else {
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);
+ value = zend_assign_to_variable(property_val, value, IS_CV, EX_USES_STRICT_TYPES());
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+ ZVAL_COPY(EX_VAR(opline->result.var), value);
+ }
+ goto exit_assign_obj;
}
- goto exit_assign_obj;
}
} else {
if (EXPECTED(zobj->properties != NULL)) {
@@ -33405,18 +33358,13 @@ fast_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);
+ value = Z_OBJ_HT_P(object)->write_property(object, property, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL);
+free_and_exit_assign_obj:
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
}
@@ -33428,6 +33376,91 @@ exit_assign_obj:
ZEND_VM_NEXT_OPCODE_EX(1, 2);
}
+/* No specialization for op_types (CONST|TMPVAR|CV, UNUSED|CONST|VAR) */
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMPVAR_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op2, free_op_data;
+ zval *property, *container, *value_ptr;
+
+ SAVE_OPLINE();
+
+ container = &EX(This);
+
+ if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
+ ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
+ }
+
+ property = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+
+ value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
+
+ if (1) {
+ if (IS_UNUSED == IS_UNUSED) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
+ zend_assign_to_property_reference_this_const(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ } else {
+ zend_assign_to_property_reference_this_var(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ }
+ } else {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
+ zend_assign_to_property_reference_var_const(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ } else {
+ zend_assign_to_property_reference_var_var(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ }
+ }
+ } else {
+ zend_assign_to_property_reference(container, IS_UNUSED, property, (IS_TMP_VAR|IS_VAR), value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ }
+
+ zval_ptr_dtor_nogc(free_op2);
+ if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);};
+ ZEND_VM_NEXT_OPCODE_EX(1, 2);
+}
+
+/* No specialization for op_types (CONST|TMPVAR|CV, UNUSED|CONST|VAR) */
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMPVAR_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op2;
+ zval *property, *container, *value_ptr;
+
+ SAVE_OPLINE();
+
+ container = &EX(This);
+
+ if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
+ ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
+ }
+
+ property = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+
+ value_ptr = _get_zval_ptr_cv_BP_VAR_W((opline+1)->op1.var EXECUTE_DATA_CC);
+
+ if (1) {
+ if (IS_UNUSED == IS_UNUSED) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
+ zend_assign_to_property_reference_this_const(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ } else {
+ zend_assign_to_property_reference_this_var(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ }
+ } else {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
+ zend_assign_to_property_reference_var_const(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ } else {
+ zend_assign_to_property_reference_var_var(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ }
+ }
+ } else {
+ zend_assign_to_property_reference(container, IS_UNUSED, property, (IS_TMP_VAR|IS_VAR), value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ }
+
+ zval_ptr_dtor_nogc(free_op2);
+
+ ZEND_VM_NEXT_OPCODE_EX(1, 2);
+}
+
+/* No specialization for op_types (CONST|TMPVAR|CV, UNUSED|CONST|VAR) */
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ROPE_INIT_SPEC_UNUSED_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -33454,7 +33487,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ROPE_INIT_SPEC_UNUSED_TMPVAR_H
} 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);
+ ZVAL_UNDEFINED_OP2();
}
rope[0] = zval_get_string_func(var);
zval_ptr_dtor_nogc(free_op2);
@@ -33479,7 +33512,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_CLASS_SPEC_UNUSED_TMPVAR
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);
+ ce = zend_fetch_class_by_name(Z_STR_P(class_name), Z_STR_P(class_name + 1), opline->op1.num);
CACHE_PTR(opline->extended_value, ce);
}
Z_CE_P(EX_VAR(opline->result.var)) = ce;
@@ -33495,7 +33528,7 @@ try_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);
+ ZVAL_UNDEFINED_OP2();
if (UNEXPECTED(EG(exception) != NULL)) {
HANDLE_EXCEPTION();
}
@@ -33541,7 +33574,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_UNUSED_T
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);
+ ZVAL_UNDEFINED_OP2();
if (UNEXPECTED(EG(exception) != NULL)) {
HANDLE_EXCEPTION();
@@ -33564,7 +33597,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_UNUSED_T
}
}
if (IS_UNUSED == IS_CV && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
- object = GET_OP1_UNDEF_CV(object, BP_VAR_R);
+ object = ZVAL_UNDEFINED_OP1();
if (UNEXPECTED(EG(exception) != NULL)) {
if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
zval_ptr_dtor_nogc(free_op2);
@@ -33592,13 +33625,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_UNUSED_T
} 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);
}
@@ -33623,7 +33649,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_UNUSED_T
/* Reset "object" to trigger reference counting */
object = NULL;
}
- if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
+ if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!RUN_TIME_CACHE(&fbc->op_array))) {
init_func_run_time_cache(&fbc->op_array);
}
}
@@ -33632,26 +33658,28 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_UNUSED_T
zval_ptr_dtor_nogc(free_op2);
}
- call_info = ZEND_CALL_NESTED_FUNCTION;
+ call_info = ZEND_CALL_NESTED_FUNCTION | ZEND_CALL_HAS_THIS;
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();
}
+ /* call static method */
+ obj = (zend_object*)called_scope;
+ call_info = ZEND_CALL_NESTED_FUNCTION;
} 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 */
}
+ /* CV may be changed indirectly (e.g. when it's a reference) */
+ call_info = ZEND_CALL_NESTED_FUNCTION | ZEND_CALL_HAS_THIS | ZEND_CALL_RELEASE_THIS;
}
call = zend_vm_stack_push_call_frame(call_info,
- fbc, opline->extended_value, called_scope, obj);
+ fbc, opline->extended_value, obj);
call->prev_execute_data = EX(call);
EX(call) = call;
@@ -33663,7 +33691,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_U
USE_OPLINE
zval *function_name;
zend_class_entry *ce;
- zend_object *object;
+ uint32_t call_info;
zend_function *fbc;
zend_execute_data *call;
@@ -33673,7 +33701,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_U
/* 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);
+ ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op1)), Z_STR_P(RT_CONSTANT(opline, opline->op1) + 1), ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
if (UNEXPECTED(ce == NULL)) {
ZEND_ASSERT(EG(exception));
zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
@@ -33715,7 +33743,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_U
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);
+ ZVAL_UNDEFINED_OP2();
if (UNEXPECTED(EG(exception) != NULL)) {
HANDLE_EXCEPTION();
}
@@ -33744,7 +33772,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_U
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)) {
+ if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!RUN_TIME_CACHE(&fbc->op_array))) {
init_func_run_time_cache(&fbc->op_array);
}
if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
@@ -33760,44 +33788,66 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_U
HANDLE_EXCEPTION();
}
fbc = ce->constructor;
- if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
+ if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!RUN_TIME_CACHE(&fbc->op_array))) {
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;
+ ce = (zend_class_entry*)Z_OBJ(EX(This));
+ call_info = ZEND_CALL_NESTED_FUNCTION | ZEND_CALL_HAS_THIS;
} else {
zend_non_static_method_call(fbc);
if (UNEXPECTED(EG(exception) != NULL)) {
HANDLE_EXCEPTION();
}
+ goto check_parent_and_self;
}
- }
-
- if (IS_UNUSED == IS_UNUSED) {
+ } else {
+check_parent_and_self:
/* 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 (IS_UNUSED == IS_UNUSED
+ && ((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_info = ZEND_CALL_NESTED_FUNCTION;
}
- call = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
- fbc, opline->extended_value, ce, object);
+ call = zend_vm_stack_push_call_frame(call_info,
+ fbc, opline->extended_value, ce);
call->prev_execute_data = EX(call);
EX(call) = call;
ZEND_VM_NEXT_OPCODE();
}
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_UNUSED_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ zval *array;
+ uint32_t size;
+ USE_OPLINE
+
+ array = EX_VAR(opline->result.var);
+ if (IS_UNUSED != 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_NULL_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
+ } else {
+ ZVAL_ARR(array, zend_new_array(0));
+ ZEND_VM_NEXT_OPCODE();
+ }
+}
+
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_UNUSED_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -33817,17 +33867,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_UNUSED_TMPVAR_H
if (Z_ISREF_P(container)) {
container = Z_REFVAL_P(container);
if (Z_TYPE_P(container) != IS_OBJECT) {
+ if (IS_UNUSED == IS_CV
+ && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
+ ZVAL_UNDEFINED_OP1();
+ }
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);
- }
+ Z_OBJ_HT_P(container)->unset_property(container, offset, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL));
} while (0);
zval_ptr_dtor_nogc(free_op2);
@@ -33857,22 +33907,20 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_UN
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;
+ result = (opline->extended_value & ZEND_ISEMPTY);
+ goto isset_object_finish;
}
} else {
- goto isset_no_object;
+ result = (opline->extended_value & ZEND_ISEMPTY);
+ goto isset_object_finish;
}
}
- 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));
- }
+ 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));
+
+isset_object_finish:
zval_ptr_dtor_nogc(free_op2);
ZEND_VM_SMART_BRANCH(result, 1);
@@ -33921,20 +33969,23 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_UNUSED_TMP_HANDLER(
/* 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 {
+ do {
+ if (IS_UNUSED == IS_VAR) {
+ ZEND_ASSERT(value_ptr != &EG(uninitialized_zval));
+ if (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);
+ break;
+ }
+ }
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));
- }
+ } while (0);
}
} else {
@@ -34058,20 +34109,23 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_UNUSED_VAR_HANDLER(
/* 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 {
+ do {
+ if (IS_UNUSED == IS_VAR) {
+ ZEND_ASSERT(value_ptr != &EG(uninitialized_zval));
+ if (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);
+ break;
+ }
+ }
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));
- }
+ } while (0);
}
} else {
@@ -34169,7 +34223,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_CLASS_SPEC_UNUSED_UNUSED
if (UNEXPECTED(ce == NULL)) {
class_name = NULL;
- ce = zend_fetch_class_by_name(Z_STR_P(class_name), class_name + 1, opline->op1.num);
+ ce = zend_fetch_class_by_name(Z_STR_P(class_name), Z_STR_P(class_name + 1), opline->op1.num);
CACHE_PTR(opline->extended_value, ce);
}
Z_CE_P(EX_VAR(opline->result.var)) = ce;
@@ -34185,7 +34239,7 @@ try_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);
+ ZVAL_UNDEFINED_OP2();
if (UNEXPECTED(EG(exception) != NULL)) {
HANDLE_EXCEPTION();
}
@@ -34202,7 +34256,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_U
USE_OPLINE
zval *function_name;
zend_class_entry *ce;
- zend_object *object;
+ uint32_t call_info;
zend_function *fbc;
zend_execute_data *call;
@@ -34212,7 +34266,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_U
/* 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);
+ ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op1)), Z_STR_P(RT_CONSTANT(opline, opline->op1) + 1), ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
if (UNEXPECTED(ce == NULL)) {
ZEND_ASSERT(EG(exception));
@@ -34254,7 +34308,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_U
break;
}
} else if (IS_UNUSED == IS_CV && UNEXPECTED(Z_TYPE_P(function_name) == IS_UNDEF)) {
- GET_OP2_UNDEF_CV(function_name, BP_VAR_R);
+ ZVAL_UNDEFINED_OP2();
if (UNEXPECTED(EG(exception) != NULL)) {
HANDLE_EXCEPTION();
}
@@ -34283,7 +34337,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_U
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)) {
+ if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!RUN_TIME_CACHE(&fbc->op_array))) {
init_func_run_time_cache(&fbc->op_array);
}
if (IS_UNUSED != IS_CONST) {
@@ -34299,38 +34353,39 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_U
HANDLE_EXCEPTION();
}
fbc = ce->constructor;
- if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
+ if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!RUN_TIME_CACHE(&fbc->op_array))) {
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;
+ ce = (zend_class_entry*)Z_OBJ(EX(This));
+ call_info = ZEND_CALL_NESTED_FUNCTION | ZEND_CALL_HAS_THIS;
} else {
zend_non_static_method_call(fbc);
if (UNEXPECTED(EG(exception) != NULL)) {
HANDLE_EXCEPTION();
}
+ goto check_parent_and_self;
}
- }
-
- if (IS_UNUSED == IS_UNUSED) {
+ } else {
+check_parent_and_self:
/* 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 (IS_UNUSED == IS_UNUSED
+ && ((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_info = ZEND_CALL_NESTED_FUNCTION;
}
- call = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
- fbc, opline->extended_value, ce, object);
+ call = zend_vm_stack_push_call_frame(call_info,
+ fbc, opline->extended_value, ce);
call->prev_execute_data = EX(call);
EX(call) = call;
@@ -34399,7 +34454,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_NEW_SPEC_UNUSED_UNUSED_HANDLER
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);
+ ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op1)), Z_STR_P(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));
@@ -34439,17 +34494,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_NEW_SPEC_UNUSED_UNUSED_HANDLER
/* 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);
+ opline->extended_value, NULL);
} else {
- if (EXPECTED(constructor->type == ZEND_USER_FUNCTION) && UNEXPECTED(!constructor->op_array.run_time_cache)) {
+ if (EXPECTED(constructor->type == ZEND_USER_FUNCTION) && UNEXPECTED(!RUN_TIME_CACHE(&constructor->op_array))) {
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,
+ ZEND_CALL_FUNCTION | ZEND_CALL_RELEASE_THIS | ZEND_CALL_HAS_THIS,
constructor,
opline->extended_value,
- ce,
Z_OBJ_P(result));
Z_ADDREF_P(result);
}
@@ -34459,6 +34513,27 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_NEW_SPEC_UNUSED_UNUSED_HANDLER
ZEND_VM_NEXT_OPCODE();
}
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_UNUSED_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ zval *array;
+ uint32_t size;
+ USE_OPLINE
+
+ array = EX_VAR(opline->result.var);
+ if (IS_UNUSED != 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_NULL_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
+ } else {
+ ZVAL_ARR(array, zend_new_array(0));
+ ZEND_VM_NEXT_OPCODE();
+ }
+}
+
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_UNUSED_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -34500,20 +34575,23 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_UNUSED_UNUSED_HANDL
/* 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 {
+ do {
+ if (IS_UNUSED == IS_VAR) {
+ ZEND_ASSERT(value_ptr != &EG(uninitialized_zval));
+ if (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);
+ break;
+ }
+ }
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));
- }
+ } while (0);
}
} else {
@@ -34641,11 +34719,20 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_GET_CLASS_SPEC_UNUSED_UNUSED_H
SAVE_OPLINE();
op1 = NULL;
- 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));
+ while (1) {
+ if (Z_TYPE_P(op1) == IS_OBJECT) {
+ ZVAL_STR_COPY(EX_VAR(opline->result.var), Z_OBJCE_P(op1)->name);
+ } else if ((IS_UNUSED & (IS_VAR|IS_CV)) != 0 && Z_TYPE_P(op1) == IS_REFERENCE) {
+ op1 = Z_REFVAL_P(op1);
+ continue;
+ } else {
+ if (IS_UNUSED == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ ZVAL_UNDEFINED_OP1();
+ }
+ 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));
+ }
+ break;
}
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
@@ -34716,10 +34803,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FUNC_GET_ARGS_SPEC_UNUSED_UNUS
if (Z_OPT_REFCOUNTED_P(q)) {
Z_ADDREF_P(q);
}
+ ZEND_HASH_FILL_SET(q);
} else {
- q = &EG(uninitialized_zval);
+ ZEND_HASH_FILL_SET_NULL();
}
- ZEND_HASH_FILL_ADD(q);
+ ZEND_HASH_FILL_NEXT();
p++;
i++;
}
@@ -34737,10 +34825,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FUNC_GET_ARGS_SPEC_UNUSED_UNUS
if (Z_OPT_REFCOUNTED_P(q)) {
Z_ADDREF_P(q);
}
+ ZEND_HASH_FILL_SET(q);
} else {
- q = &EG(uninitialized_zval);
+ ZEND_HASH_FILL_SET_NULL();
}
- ZEND_HASH_FILL_ADD(q);
+ ZEND_HASH_FILL_NEXT();
p++;
i++;
}
@@ -34752,14 +34841,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FUNC_GET_ARGS_SPEC_UNUSED_UNUS
ZEND_VM_NEXT_OPCODE();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_UNUSED_CV(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_OP_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zend_free_op free_op_data1;
+ zend_free_op free_op_data;
zval *object;
zval *property;
zval *value;
zval *zptr;
+ void **cache_slot;
+ zend_property_info *prop_info;
SAVE_OPLINE();
object = &EX(This);
@@ -34771,138 +34862,84 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP
property = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
do {
- value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data1);
+ value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data);
if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
- if (Z_ISREF_P(object)) {
+ if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) {
object = Z_REFVAL_P(object);
- if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
- goto assign_op_object;
- }
+ goto assign_op_object;
}
- if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
+ if (IS_UNUSED == IS_CV
+ && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
+ ZVAL_UNDEFINED_OP1();
+ }
+ object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC);
+ if (UNEXPECTED(!object)) {
break;
}
}
- /* here we are sure we are dealing with an object */
assign_op_object:
- if (EXPECTED(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)) {
+ /* here we are sure we are dealing with an object */
+ cache_slot = (IS_CV == IS_CONST) ? CACHE_ADDR((opline+1)->extended_value) : NULL;
+ if (EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, cache_slot)) != NULL)) {
if (UNEXPECTED(Z_ISERROR_P(zptr))) {
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_NULL(EX_VAR(opline->result.var));
}
} else {
- ZVAL_DEREF(zptr);
+ zval *orig_zptr = zptr;
+ zend_reference *ref;
+
+ do {
+ if (UNEXPECTED(Z_ISREF_P(zptr))) {
+ ref = Z_REF_P(zptr);
+ zptr = Z_REFVAL_P(zptr);
+ if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) {
+ zend_binary_assign_op_typed_ref(ref, value OPLINE_CC EXECUTE_DATA_CC);
+ break;
+ }
+ }
+
+ if (IS_CV == IS_CONST) {
+ prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2);
+ } else {
+ prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(object), orig_zptr);
+ }
+ if (UNEXPECTED(prop_info)) {
+ /* special case for typed properties */
+ zend_binary_assign_op_typed_prop(prop_info, zptr, value OPLINE_CC EXECUTE_DATA_CC);
+ } else {
+ zend_binary_op(zptr, zptr, value OPLINE_CC);
+ }
+ } while (0);
- binary_op(zptr, zptr, value);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), zptr);
}
}
} else {
- zend_assign_op_overloaded_property(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR((opline+1)->extended_value) : NULL), value, binary_op OPLINE_CC EXECUTE_DATA_CC);
+ zend_assign_op_overloaded_property(object, property, cache_slot, value OPLINE_CC EXECUTE_DATA_CC);
}
} while (0);
- FREE_OP(free_op_data1);
+ FREE_OP(free_op_data);
/* assign_obj has two opcodes! */
ZEND_VM_NEXT_OPCODE_EX(1, 2);
}
-static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_SPEC_UNUSED_CV_OBJ(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC)
-{
-#if 1 && IS_CV == IS_UNUSED
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_UNUSED_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-#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));
- }
- if (EXPECTED(0)) {
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_UNUSED_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
- }
-# endif
-
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_UNUSED_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-#endif
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_UNUSED_CV_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_UNUSED_CV_OBJ(add_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SUB_SPEC_UNUSED_CV_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_UNUSED_CV_OBJ(sub_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MUL_SPEC_UNUSED_CV_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_UNUSED_CV_OBJ(mul_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIV_SPEC_UNUSED_CV_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_UNUSED_CV_OBJ(div_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MOD_SPEC_UNUSED_CV_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_UNUSED_CV_OBJ(mod_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SL_SPEC_UNUSED_CV_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_UNUSED_CV_OBJ(shift_left_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SR_SPEC_UNUSED_CV_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_UNUSED_CV_OBJ(shift_right_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_CONCAT_SPEC_UNUSED_CV_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_UNUSED_CV_OBJ(concat_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_OR_SPEC_UNUSED_CV_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_UNUSED_CV_OBJ(bitwise_or_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_AND_SPEC_UNUSED_CV_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_UNUSED_CV_OBJ(bitwise_and_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_UNUSED_CV_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_UNUSED_CV_OBJ(bitwise_xor_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_POW_SPEC_UNUSED_CV_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_UNUSED_CV_OBJ(pow_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_UNUSED_CV(int inc ZEND_OPCODE_HANDLER_ARGS_DC)
+/* No specialization for op_types (CONST|TMP|VAR|CV, UNUSED|CONST|TMPVAR) */
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_OBJ_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zval *object;
zval *property;
zval *zptr;
+ void **cache_slot;
+ zend_property_info *prop_info;
SAVE_OPLINE();
object = &EX(This);
@@ -34915,47 +34952,38 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE
do {
if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
- if (Z_ISREF_P(object)) {
+ if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) {
object = Z_REFVAL_P(object);
- if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
- goto pre_incdec_object;
- }
+ goto pre_incdec_object;
+ }
+ if (IS_UNUSED == IS_CV
+ && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
+ ZVAL_UNDEFINED_OP1();
}
- if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
+ object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC);
+ if (UNEXPECTED(!object)) {
break;
}
}
- /* here we are sure we are dealing with an object */
pre_incdec_object:
- if (EXPECTED(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)) {
+ /* here we are sure we are dealing with an object */
+ cache_slot = (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL;
+ if (EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, cache_slot)) != NULL)) {
if (UNEXPECTED(Z_ISERROR_P(zptr))) {
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_NULL(EX_VAR(opline->result.var));
}
} else {
- if (EXPECTED(Z_TYPE_P(zptr) == IS_LONG)) {
- if (inc) {
- fast_long_increment_function(zptr);
- } else {
- fast_long_decrement_function(zptr);
- }
+ if (IS_CV == IS_CONST) {
+ prop_info = (zend_property_info *) CACHED_PTR_EX(cache_slot + 2);
} else {
- ZVAL_DEREF(zptr);
-
- if (inc) {
- increment_function(zptr);
- } else {
- decrement_function(zptr);
- }
- }
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY(EX_VAR(opline->result.var), zptr);
+ prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(object), zptr);
}
+ zend_pre_incdec_property_zval(zptr, prop_info OPLINE_CC EXECUTE_DATA_CC);
}
} else {
- zend_pre_incdec_overloaded_property(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), inc OPLINE_CC EXECUTE_DATA_CC);
+ zend_pre_incdec_overloaded_property(object, property, cache_slot OPLINE_CC EXECUTE_DATA_CC);
}
} while (0);
@@ -34963,23 +34991,15 @@ pre_incdec_object:
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_OBJ_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_pre_incdec_property_helper_SPEC_UNUSED_CV(1 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_OBJ_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_pre_incdec_property_helper_SPEC_UNUSED_CV(0 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_UNUSED_CV(int inc ZEND_OPCODE_HANDLER_ARGS_DC)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_OBJ_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zval *object;
zval *property;
zval *zptr;
+ void **cache_slot;
+ zend_property_info *prop_info;
SAVE_OPLINE();
object = &EX(This);
@@ -34992,43 +35012,37 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP
do {
if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
- if (Z_ISREF_P(object)) {
+ if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) {
object = Z_REFVAL_P(object);
- if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
- goto post_incdec_object;
- }
+ goto post_incdec_object;
+ }
+ if (IS_UNUSED == IS_CV
+ && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
+ ZVAL_UNDEFINED_OP1();
}
- if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
+ object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC);
+ if (UNEXPECTED(!object)) {
break;
}
}
- /* here we are sure we are dealing with an object */
post_incdec_object:
- if (EXPECTED(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)) {
+ /* here we are sure we are dealing with an object */
+ cache_slot = (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL;
+ if (EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, cache_slot)) != NULL)) {
if (UNEXPECTED(Z_ISERROR_P(zptr))) {
ZVAL_NULL(EX_VAR(opline->result.var));
} else {
- if (EXPECTED(Z_TYPE_P(zptr) == IS_LONG)) {
- ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(zptr));
- if (inc) {
- fast_long_increment_function(zptr);
- } else {
- fast_long_decrement_function(zptr);
- }
+ if (IS_CV == IS_CONST) {
+ prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2);
} else {
- ZVAL_DEREF(zptr);
- ZVAL_COPY(EX_VAR(opline->result.var), zptr);
- if (inc) {
- increment_function(zptr);
- } else {
- decrement_function(zptr);
- }
+ prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(object), zptr);
}
+
+ zend_post_incdec_property_zval(zptr, prop_info OPLINE_CC EXECUTE_DATA_CC);
}
} else {
- zend_post_incdec_overloaded_property(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), inc OPLINE_CC EXECUTE_DATA_CC);
+ zend_post_incdec_overloaded_property(object, property, cache_slot OPLINE_CC EXECUTE_DATA_CC);
}
} while (0);
@@ -35036,16 +35050,6 @@ post_incdec_object:
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_OBJ_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_post_incdec_property_helper_SPEC_UNUSED_CV(1 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_DEC_OBJ_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_post_incdec_property_helper_SPEC_UNUSED_CV(0 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -35074,12 +35078,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_CV_HAN
}
}
if (IS_UNUSED == IS_CV && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
- GET_OP1_UNDEF_CV(container, BP_VAR_R);
+ ZVAL_UNDEFINED_OP1();
}
if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(offset) == IS_UNDEF)) {
- GET_OP2_UNDEF_CV(offset, BP_VAR_R);
+ ZVAL_UNDEFINED_OP2();
}
- goto fetch_obj_r_no_object;
+ zend_wrong_property_read(offset);
+ ZVAL_NULL(EX_VAR(opline->result.var));
+ goto fetch_obj_r_finish;
} while (0);
}
@@ -35089,7 +35095,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_CV_HAN
zval *retval;
if (IS_CV == IS_CONST) {
- cache_slot = CACHE_ADDR(opline->extended_value);
+ cache_slot = CACHE_ADDR(opline->extended_value & ~ZEND_FETCH_REF /* FUNC_ARG fetch may contain it */);
if (EXPECTED(zobj->ce == CACHED_PTR_EX(cache_slot))) {
uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1);
@@ -35097,8 +35103,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_CV_HAN
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;
+ if (0 || (IS_UNUSED & (IS_TMP_VAR|IS_VAR)) != 0) {
+ goto fetch_obj_r_copy;
+ } else {
+fetch_obj_r_fast_copy:
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
+ ZEND_VM_NEXT_OPCODE();
+ }
}
} else if (EXPECTED(zobj->properties != NULL)) {
if (!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET(prop_offset)) {
@@ -35112,8 +35123,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_CV_HAN
(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;
+ retval = &p->val;
+ if (0 || (IS_UNUSED & (IS_TMP_VAR|IS_VAR)) != 0) {
+ goto fetch_obj_r_copy;
+ } else {
+ goto fetch_obj_r_fast_copy;
+ }
}
}
CACHE_PTR_EX(cache_slot + 1, (void*)ZEND_DYNAMIC_PROPERTY_OFFSET);
@@ -35122,30 +35137,30 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_CV_HAN
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;
+ if (0 || (IS_UNUSED & (IS_TMP_VAR|IS_VAR)) != 0) {
+ goto fetch_obj_r_copy;
+ } else {
+ goto fetch_obj_r_fast_copy;
+ }
}
}
}
} else if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(offset) == IS_UNDEF)) {
- GET_OP2_UNDEF_CV(offset, BP_VAR_R);
+ ZVAL_UNDEFINED_OP2();
}
- 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));
+ 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);
- }
+ if (retval != EX_VAR(opline->result.var)) {
+fetch_obj_r_copy:
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
+ } else if (UNEXPECTED(Z_ISREF_P(retval))) {
+ zend_unwrap_reference(retval);
}
} while (0);
+fetch_obj_r_finish:
+
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
@@ -35165,7 +35180,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_CV_HAN
property = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
result = EX_VAR(opline->result.var);
- zend_fetch_property_address(result, container, IS_UNUSED, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_W OPLINE_CC);
+ zend_fetch_property_address(
+ result, container, IS_UNUSED, property, IS_CV,
+ ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_FETCH_OBJ_FLAGS) : NULL),
+ BP_VAR_W, opline->extended_value & ZEND_FETCH_OBJ_FLAGS, 1 OPLINE_CC EXECUTE_DATA_CC);
if (IS_UNUSED == IS_VAR) {
FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result);
@@ -35187,7 +35205,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_UNUSED_CV_HA
}
property = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
result = EX_VAR(opline->result.var);
- zend_fetch_property_address(result, container, IS_UNUSED, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_RW OPLINE_CC);
+ zend_fetch_property_address(result, container, IS_UNUSED, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_RW, 0, 1 OPLINE_CC EXECUTE_DATA_CC);
if (IS_UNUSED == IS_VAR) {
FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result);
@@ -35222,7 +35240,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_UNUSED_CV_HA
break;
}
}
- goto fetch_obj_is_no_object;
+ ZVAL_NULL(EX_VAR(opline->result.var));
+ goto fetch_obj_is_finish;
} while (0);
}
@@ -35240,8 +35259,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_UNUSED_CV_HA
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;
+ if (0 || (IS_UNUSED & (IS_TMP_VAR|IS_VAR)) != 0) {
+ goto fetch_obj_is_copy;
+ } else {
+fetch_obj_is_fast_copy:
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
+ ZEND_VM_NEXT_OPCODE();
+ }
}
} else if (EXPECTED(zobj->properties != NULL)) {
if (!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET(prop_offset)) {
@@ -35255,8 +35279,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_UNUSED_CV_HA
(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;
+ retval = &p->val;
+ if (0 || (IS_UNUSED & (IS_TMP_VAR|IS_VAR)) != 0) {
+ goto fetch_obj_is_copy;
+ } else {
+ goto fetch_obj_is_fast_copy;
+ }
}
}
CACHE_PTR_EX(cache_slot + 1, (void*)ZEND_DYNAMIC_PROPERTY_OFFSET);
@@ -35265,38 +35293,43 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_UNUSED_CV_HA
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 (0 || (IS_UNUSED & (IS_TMP_VAR|IS_VAR)) != 0) {
+ goto fetch_obj_is_copy;
+ } else {
+ goto fetch_obj_is_fast_copy;
+ }
}
}
}
}
- 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));
+ 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);
- }
+ if (retval != EX_VAR(opline->result.var)) {
+fetch_obj_is_copy:
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
+ } else if (UNEXPECTED(Z_ISREF_P(retval))) {
+ zend_unwrap_reference(retval);
}
} while (0);
+fetch_obj_is_finish:
+
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
+#if 0
+ USE_OPLINE
+#endif
+
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));
}
-
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));
@@ -35318,7 +35351,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_UNUSED_CV
property = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
result = EX_VAR(opline->result.var);
- zend_fetch_property_address(result, container, IS_UNUSED, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_UNSET OPLINE_CC);
+ zend_fetch_property_address(result, container, IS_UNUSED, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_UNSET, 0, 1 OPLINE_CC EXECUTE_DATA_CC);
if (IS_UNUSED == IS_VAR) {
FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result);
@@ -35343,34 +35376,52 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D
value = RT_CONSTANT((opline+1), (opline+1)->op1);
if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
- if (Z_ISREF_P(object)) {
+ if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) {
object = Z_REFVAL_P(object);
- if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
- goto assign_object;
- }
+ goto assign_object;
}
- if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
-
- goto exit_assign_obj;
+ object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC);
+ if (UNEXPECTED(!object)) {
+ value = &EG(uninitialized_zval);
+ goto free_and_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*));
+ void **cache_slot = CACHE_ADDR(opline->extended_value);
+ uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1);
zend_object *zobj = Z_OBJ_P(object);
zval *property_val;
if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
property_val = OBJ_PROP(zobj, prop_offset);
if (Z_TYPE_P(property_val) != IS_UNDEF) {
+ zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2);
+
+ if (UNEXPECTED(prop_info != NULL)) {
+ zend_uchar orig_type = IS_UNDEF;
+
+ if (IS_CONST == IS_CONST) {
+ orig_type = Z_TYPE_P(value);
+ }
+
+ value = zend_assign_to_typed_prop(prop_info, property_val, value EXECUTE_DATA_CC);
+
+ /* will remain valid, thus no need to check prop_info in future here */
+ if (IS_CONST == IS_CONST && Z_TYPE_P(value) == orig_type) {
+ CACHE_PTR_EX(cache_slot + 2, NULL);
+ }
+ goto free_and_exit_assign_obj;
+ } else {
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);
+ value = zend_assign_to_variable(property_val, value, IS_CONST, EX_USES_STRICT_TYPES());
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+ ZVAL_COPY(EX_VAR(opline->result.var), value);
+ }
+ goto exit_assign_obj;
}
- goto exit_assign_obj;
}
} else {
if (EXPECTED(zobj->properties != NULL)) {
@@ -35424,18 +35475,13 @@ fast_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_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL);
+ value = Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL);
+free_and_exit_assign_obj:
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
}
@@ -35447,6 +35493,7 @@ exit_assign_obj:
ZEND_VM_NEXT_OPCODE_EX(1, 2);
}
+/* No specialization for op_types (CONST|TMPVAR|CV, UNUSED|CONST|VAR) */
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_DATA_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -35464,34 +35511,52 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D
value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
- if (Z_ISREF_P(object)) {
+ if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) {
object = Z_REFVAL_P(object);
- if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
- goto assign_object;
- }
+ goto assign_object;
}
- if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
- zval_ptr_dtor_nogc(free_op_data);
- goto exit_assign_obj;
+ object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC);
+ if (UNEXPECTED(!object)) {
+ value = &EG(uninitialized_zval);
+ goto free_and_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*));
+ void **cache_slot = CACHE_ADDR(opline->extended_value);
+ uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1);
zend_object *zobj = Z_OBJ_P(object);
zval *property_val;
if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
property_val = OBJ_PROP(zobj, prop_offset);
if (Z_TYPE_P(property_val) != IS_UNDEF) {
+ zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2);
+
+ if (UNEXPECTED(prop_info != NULL)) {
+ zend_uchar orig_type = IS_UNDEF;
+
+ if (IS_TMP_VAR == IS_CONST) {
+ orig_type = Z_TYPE_P(value);
+ }
+
+ value = zend_assign_to_typed_prop(prop_info, property_val, value EXECUTE_DATA_CC);
+
+ /* will remain valid, thus no need to check prop_info in future here */
+ if (IS_TMP_VAR == IS_CONST && Z_TYPE_P(value) == orig_type) {
+ CACHE_PTR_EX(cache_slot + 2, NULL);
+ }
+ goto free_and_exit_assign_obj;
+ } else {
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);
+ value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES());
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+ ZVAL_COPY(EX_VAR(opline->result.var), value);
+ }
+ goto exit_assign_obj;
}
- goto exit_assign_obj;
}
} else {
if (EXPECTED(zobj->properties != NULL)) {
@@ -35545,18 +35610,13 @@ fast_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_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL);
+ value = Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL);
+free_and_exit_assign_obj:
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
}
@@ -35568,6 +35628,7 @@ exit_assign_obj:
ZEND_VM_NEXT_OPCODE_EX(1, 2);
}
+/* No specialization for op_types (CONST|TMPVAR|CV, UNUSED|CONST|VAR) */
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -35585,34 +35646,52 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D
value = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
- if (Z_ISREF_P(object)) {
+ if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) {
object = Z_REFVAL_P(object);
- if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
- goto assign_object;
- }
+ goto assign_object;
}
- if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
- zval_ptr_dtor_nogc(free_op_data);
- goto exit_assign_obj;
+ object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC);
+ if (UNEXPECTED(!object)) {
+ value = &EG(uninitialized_zval);
+ goto free_and_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*));
+ void **cache_slot = CACHE_ADDR(opline->extended_value);
+ uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1);
zend_object *zobj = Z_OBJ_P(object);
zval *property_val;
if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
property_val = OBJ_PROP(zobj, prop_offset);
if (Z_TYPE_P(property_val) != IS_UNDEF) {
+ zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2);
+
+ if (UNEXPECTED(prop_info != NULL)) {
+ zend_uchar orig_type = IS_UNDEF;
+
+ if (IS_VAR == IS_CONST) {
+ orig_type = Z_TYPE_P(value);
+ }
+
+ value = zend_assign_to_typed_prop(prop_info, property_val, value EXECUTE_DATA_CC);
+
+ /* will remain valid, thus no need to check prop_info in future here */
+ if (IS_VAR == IS_CONST && Z_TYPE_P(value) == orig_type) {
+ CACHE_PTR_EX(cache_slot + 2, NULL);
+ }
+ goto free_and_exit_assign_obj;
+ } else {
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);
+ value = zend_assign_to_variable(property_val, value, IS_VAR, EX_USES_STRICT_TYPES());
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+ ZVAL_COPY(EX_VAR(opline->result.var), value);
+ }
+ goto exit_assign_obj;
}
- goto exit_assign_obj;
}
} else {
if (EXPECTED(zobj->properties != NULL)) {
@@ -35666,18 +35745,13 @@ fast_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_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL);
+ value = Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL);
+free_and_exit_assign_obj:
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
}
@@ -35689,6 +35763,7 @@ exit_assign_obj:
ZEND_VM_NEXT_OPCODE_EX(1, 2);
}
+/* No specialization for op_types (CONST|TMPVAR|CV, UNUSED|CONST|VAR) */
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -35706,34 +35781,52 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D
value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC);
if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
- if (Z_ISREF_P(object)) {
+ if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) {
object = Z_REFVAL_P(object);
- if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
- goto assign_object;
- }
+ goto assign_object;
}
- if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
-
- goto exit_assign_obj;
+ object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC);
+ if (UNEXPECTED(!object)) {
+ value = &EG(uninitialized_zval);
+ goto free_and_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*));
+ void **cache_slot = CACHE_ADDR(opline->extended_value);
+ uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1);
zend_object *zobj = Z_OBJ_P(object);
zval *property_val;
if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
property_val = OBJ_PROP(zobj, prop_offset);
if (Z_TYPE_P(property_val) != IS_UNDEF) {
+ zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2);
+
+ if (UNEXPECTED(prop_info != NULL)) {
+ zend_uchar orig_type = IS_UNDEF;
+
+ if (IS_CV == IS_CONST) {
+ orig_type = Z_TYPE_P(value);
+ }
+
+ value = zend_assign_to_typed_prop(prop_info, property_val, value EXECUTE_DATA_CC);
+
+ /* will remain valid, thus no need to check prop_info in future here */
+ if (IS_CV == IS_CONST && Z_TYPE_P(value) == orig_type) {
+ CACHE_PTR_EX(cache_slot + 2, NULL);
+ }
+ goto free_and_exit_assign_obj;
+ } else {
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);
+ value = zend_assign_to_variable(property_val, value, IS_CV, EX_USES_STRICT_TYPES());
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+ ZVAL_COPY(EX_VAR(opline->result.var), value);
+ }
+ goto exit_assign_obj;
}
- goto exit_assign_obj;
}
} else {
if (EXPECTED(zobj->properties != NULL)) {
@@ -35787,18 +35880,13 @@ fast_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_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL);
+ value = Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL);
+free_and_exit_assign_obj:
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
}
@@ -35810,6 +35898,91 @@ exit_assign_obj:
ZEND_VM_NEXT_OPCODE_EX(1, 2);
}
+/* No specialization for op_types (CONST|TMPVAR|CV, UNUSED|CONST|VAR) */
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op_data;
+ zval *property, *container, *value_ptr;
+
+ SAVE_OPLINE();
+
+ container = &EX(This);
+
+ if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
+ ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
+ }
+
+ property = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
+
+ value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
+
+ if (1) {
+ if (IS_UNUSED == IS_UNUSED) {
+ if (IS_CV == IS_CONST) {
+ zend_assign_to_property_reference_this_const(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ } else {
+ zend_assign_to_property_reference_this_var(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ }
+ } else {
+ if (IS_CV == IS_CONST) {
+ zend_assign_to_property_reference_var_const(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ } else {
+ zend_assign_to_property_reference_var_var(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ }
+ }
+ } else {
+ zend_assign_to_property_reference(container, IS_UNUSED, property, IS_CV, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ }
+
+
+ if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);};
+ ZEND_VM_NEXT_OPCODE_EX(1, 2);
+}
+
+/* No specialization for op_types (CONST|TMPVAR|CV, UNUSED|CONST|VAR) */
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+
+ zval *property, *container, *value_ptr;
+
+ SAVE_OPLINE();
+
+ container = &EX(This);
+
+ if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
+ ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
+ }
+
+ property = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
+
+ value_ptr = _get_zval_ptr_cv_BP_VAR_W((opline+1)->op1.var EXECUTE_DATA_CC);
+
+ if (1) {
+ if (IS_UNUSED == IS_UNUSED) {
+ if (IS_CV == IS_CONST) {
+ zend_assign_to_property_reference_this_const(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ } else {
+ zend_assign_to_property_reference_this_var(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ }
+ } else {
+ if (IS_CV == IS_CONST) {
+ zend_assign_to_property_reference_var_const(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ } else {
+ zend_assign_to_property_reference_var_var(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ }
+ }
+ } else {
+ zend_assign_to_property_reference(container, IS_UNUSED, property, IS_CV, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ }
+
+
+
+ ZEND_VM_NEXT_OPCODE_EX(1, 2);
+}
+
+/* No specialization for op_types (CONST|TMPVAR|CV, UNUSED|CONST|VAR) */
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ROPE_INIT_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -35836,7 +36009,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ROPE_INIT_SPEC_UNUSED_CV_HANDL
} else {
SAVE_OPLINE();
if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(var) == IS_UNDEF)) {
- GET_OP2_UNDEF_CV(var, BP_VAR_R);
+ ZVAL_UNDEFINED_OP2();
}
rope[0] = zval_get_string_func(var);
@@ -35861,7 +36034,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_CLASS_SPEC_UNUSED_CV_HAN
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);
+ ce = zend_fetch_class_by_name(Z_STR_P(class_name), Z_STR_P(class_name + 1), opline->op1.num);
CACHE_PTR(opline->extended_value, ce);
}
Z_CE_P(EX_VAR(opline->result.var)) = ce;
@@ -35877,7 +36050,7 @@ try_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);
+ ZVAL_UNDEFINED_OP2();
if (UNEXPECTED(EG(exception) != NULL)) {
HANDLE_EXCEPTION();
}
@@ -35922,7 +36095,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_UNUSED_C
break;
}
} else if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(function_name) == IS_UNDEF)) {
- GET_OP2_UNDEF_CV(function_name, BP_VAR_R);
+ ZVAL_UNDEFINED_OP2();
if (UNEXPECTED(EG(exception) != NULL)) {
HANDLE_EXCEPTION();
@@ -35945,7 +36118,7 @@ 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);
+ object = ZVAL_UNDEFINED_OP1();
if (UNEXPECTED(EG(exception) != NULL)) {
if (IS_CV != IS_CONST) {
@@ -35973,13 +36146,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_UNUSED_C
} else {
zend_object *orig_obj = obj;
- if (UNEXPECTED(obj->handlers->get_method == NULL)) {
- zend_throw_error(NULL, "Object does not support method calls");
-
-
- HANDLE_EXCEPTION();
- }
-
if (IS_CV == IS_CONST) {
function_name = EX_VAR(opline->op2.var);
}
@@ -36004,7 +36170,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_UNUSED_C
/* Reset "object" to trigger reference counting */
object = NULL;
}
- if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
+ if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!RUN_TIME_CACHE(&fbc->op_array))) {
init_func_run_time_cache(&fbc->op_array);
}
}
@@ -36013,26 +36179,28 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_UNUSED_C
}
- call_info = ZEND_CALL_NESTED_FUNCTION;
+ call_info = ZEND_CALL_NESTED_FUNCTION | ZEND_CALL_HAS_THIS;
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();
}
+ /* call static method */
+ obj = (zend_object*)called_scope;
+ call_info = ZEND_CALL_NESTED_FUNCTION;
} 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 */
}
+ /* CV may be changed indirectly (e.g. when it's a reference) */
+ call_info = ZEND_CALL_NESTED_FUNCTION | ZEND_CALL_HAS_THIS | ZEND_CALL_RELEASE_THIS;
}
call = zend_vm_stack_push_call_frame(call_info,
- fbc, opline->extended_value, called_scope, obj);
+ fbc, opline->extended_value, obj);
call->prev_execute_data = EX(call);
EX(call) = call;
@@ -36044,7 +36212,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_U
USE_OPLINE
zval *function_name;
zend_class_entry *ce;
- zend_object *object;
+ uint32_t call_info;
zend_function *fbc;
zend_execute_data *call;
@@ -36054,7 +36222,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_U
/* 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);
+ ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op1)), Z_STR_P(RT_CONSTANT(opline, opline->op1) + 1), ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
if (UNEXPECTED(ce == NULL)) {
ZEND_ASSERT(EG(exception));
@@ -36096,7 +36264,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_U
break;
}
} else if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(function_name) == IS_UNDEF)) {
- GET_OP2_UNDEF_CV(function_name, BP_VAR_R);
+ ZVAL_UNDEFINED_OP2();
if (UNEXPECTED(EG(exception) != NULL)) {
HANDLE_EXCEPTION();
}
@@ -36125,7 +36293,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_U
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)) {
+ if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!RUN_TIME_CACHE(&fbc->op_array))) {
init_func_run_time_cache(&fbc->op_array);
}
if (IS_CV != IS_CONST) {
@@ -36141,44 +36309,66 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_U
HANDLE_EXCEPTION();
}
fbc = ce->constructor;
- if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
+ if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!RUN_TIME_CACHE(&fbc->op_array))) {
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;
+ ce = (zend_class_entry*)Z_OBJ(EX(This));
+ call_info = ZEND_CALL_NESTED_FUNCTION | ZEND_CALL_HAS_THIS;
} else {
zend_non_static_method_call(fbc);
if (UNEXPECTED(EG(exception) != NULL)) {
HANDLE_EXCEPTION();
}
+ goto check_parent_and_self;
}
- }
-
- if (IS_UNUSED == IS_UNUSED) {
+ } else {
+check_parent_and_self:
/* 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 (IS_UNUSED == IS_UNUSED
+ && ((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_info = ZEND_CALL_NESTED_FUNCTION;
}
- call = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
- fbc, opline->extended_value, ce, object);
+ call = zend_vm_stack_push_call_frame(call_info,
+ fbc, opline->extended_value, ce);
call->prev_execute_data = EX(call);
EX(call) = call;
ZEND_VM_NEXT_OPCODE();
}
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ zval *array;
+ uint32_t size;
+ USE_OPLINE
+
+ array = EX_VAR(opline->result.var);
+ if (IS_UNUSED != 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_NULL_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
+ } else {
+ ZVAL_ARR(array, zend_new_array(0));
+ ZEND_VM_NEXT_OPCODE();
+ }
+}
+
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -36198,17 +36388,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_UNUSED_CV_HANDL
if (Z_ISREF_P(container)) {
container = Z_REFVAL_P(container);
if (Z_TYPE_P(container) != IS_OBJECT) {
+ if (IS_UNUSED == IS_CV
+ && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
+ ZVAL_UNDEFINED_OP1();
+ }
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);
- }
+ Z_OBJ_HT_P(container)->unset_property(container, offset, ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL));
} while (0);
@@ -36237,21 +36427,20 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_UN
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;
+ result = (opline->extended_value & ZEND_ISEMPTY);
+ goto isset_object_finish;
}
} else {
- goto isset_no_object;
+ result = (opline->extended_value & ZEND_ISEMPTY);
+ goto isset_object_finish;
}
}
- 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));
- }
+
+ 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));
+
+isset_object_finish:
ZEND_VM_SMART_BRANCH(result, 1);
@@ -36300,20 +36489,23 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_UNUSED_CV_HANDLER(Z
/* 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 {
+ do {
+ if (IS_UNUSED == IS_VAR) {
+ ZEND_ASSERT(value_ptr != &EG(uninitialized_zval));
+ if (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);
+ break;
+ }
+ }
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));
- }
+ } while (0);
}
} else {
@@ -36409,8 +36601,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_NOT_SPEC_CV_HANDLER(ZEND_OP
}
SAVE_OPLINE();
- bitwise_not_function(EX_VAR(opline->result.var),
- _get_zval_ptr_cv_BP_VAR_R(opline->op1.var EXECUTE_DATA_CC));
+ if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ op1 = ZVAL_UNDEFINED_OP1();
+ }
+ bitwise_not_function(EX_VAR(opline->result.var), op1);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
@@ -36430,7 +36624,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BOOL_NOT_SPEC_CV_HANDLER(ZEND_
ZVAL_TRUE(EX_VAR(opline->result.var));
if (IS_CV == IS_CV && UNEXPECTED(orig_val_type == IS_UNDEF)) {
SAVE_OPLINE();
- GET_OP1_UNDEF_CV(val, BP_VAR_R);
+ ZVAL_UNDEFINED_OP1();
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
} else {
@@ -36442,7 +36636,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BOOL_NOT_SPEC_CV_HANDLER(ZEND_
ZEND_VM_NEXT_OPCODE();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_SPEC_CV_RETVAL_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static zend_never_inline ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_inc_helper_SPEC_CV(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -36450,16 +36644,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_SPEC_CV_RETVAL_UNUSED_
var_ptr = EX_VAR(opline->op1.var);
- if (EXPECTED(Z_TYPE_P(var_ptr) == IS_LONG)) {
- fast_long_increment_function(var_ptr);
- if (UNEXPECTED(0)) {
- ZVAL_COPY_VALUE(EX_VAR(opline->result.var), var_ptr);
- }
- ZEND_VM_NEXT_OPCODE();
- }
-
if (IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(var_ptr))) {
- if (UNEXPECTED(0)) {
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_NULL(EX_VAR(opline->result.var));
}
ZEND_VM_NEXT_OPCODE();
@@ -36467,20 +36653,49 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_SPEC_CV_RETVAL_UNUSED_
SAVE_OPLINE();
if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(var_ptr) == IS_UNDEF)) {
- var_ptr = GET_OP1_UNDEF_CV(var_ptr, BP_VAR_RW);
+ ZVAL_NULL(var_ptr);
+ ZVAL_UNDEFINED_OP1();
}
- ZVAL_DEREF(var_ptr);
- increment_function(var_ptr);
+ do {
+ if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) {
+ zend_reference *ref = Z_REF_P(var_ptr);
+ var_ptr = Z_REFVAL_P(var_ptr);
+ if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) {
+ zend_incdec_typed_ref(ref, NULL OPLINE_CC EXECUTE_DATA_CC);
+ break;
+ }
+ }
+ increment_function(var_ptr);
+ } while (0);
- if (UNEXPECTED(0)) {
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);
}
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_SPEC_CV_RETVAL_USED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_SPEC_CV_RETVAL_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+
+ zval *var_ptr;
+
+ var_ptr = EX_VAR(opline->op1.var);
+
+ if (EXPECTED(Z_TYPE_P(var_ptr) == IS_LONG)) {
+ fast_long_increment_function(var_ptr);
+ if (UNEXPECTED(0)) {
+ ZVAL_COPY_VALUE(EX_VAR(opline->result.var), var_ptr);
+ }
+ ZEND_VM_NEXT_OPCODE();
+ }
+
+ ZEND_VM_TAIL_CALL(zend_pre_inc_helper_SPEC_CV(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
+}
+
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_SPEC_CV_RETVAL_USED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -36496,8 +36711,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_SPEC_CV_RETVAL_USED_HA
ZEND_VM_NEXT_OPCODE();
}
+ ZEND_VM_TAIL_CALL(zend_pre_inc_helper_SPEC_CV(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
+}
+
+static zend_never_inline ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_dec_helper_SPEC_CV(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+
+ zval *var_ptr;
+
+ var_ptr = EX_VAR(opline->op1.var);
+
if (IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(var_ptr))) {
- if (UNEXPECTED(1)) {
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_NULL(EX_VAR(opline->result.var));
}
ZEND_VM_NEXT_OPCODE();
@@ -36505,20 +36731,31 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_SPEC_CV_RETVAL_USED_HA
SAVE_OPLINE();
if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(var_ptr) == IS_UNDEF)) {
- var_ptr = GET_OP1_UNDEF_CV(var_ptr, BP_VAR_RW);
+ ZVAL_NULL(var_ptr);
+ ZVAL_UNDEFINED_OP1();
}
- ZVAL_DEREF(var_ptr);
- increment_function(var_ptr);
+ do {
+ if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) {
+ zend_reference *ref = Z_REF_P(var_ptr);
+ var_ptr = Z_REFVAL_P(var_ptr);
+
+ if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) {
+ zend_incdec_typed_ref(ref, NULL OPLINE_CC EXECUTE_DATA_CC);
+ break;
+ }
+ }
+ decrement_function(var_ptr);
+ } while (0);
- if (UNEXPECTED(1)) {
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);
}
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_SPEC_CV_RETVAL_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_SPEC_CV_RETVAL_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -36534,29 +36771,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_SPEC_CV_RETVAL_UNUSED_
ZEND_VM_NEXT_OPCODE();
}
- if (IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(var_ptr))) {
- if (UNEXPECTED(0)) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
- ZEND_VM_NEXT_OPCODE();
- }
-
- SAVE_OPLINE();
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(var_ptr) == IS_UNDEF)) {
- var_ptr = GET_OP1_UNDEF_CV(var_ptr, BP_VAR_RW);
- }
- ZVAL_DEREF(var_ptr);
-
- decrement_function(var_ptr);
-
- if (UNEXPECTED(0)) {
- ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);
- }
-
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+ ZEND_VM_TAIL_CALL(zend_pre_dec_helper_SPEC_CV(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_SPEC_CV_RETVAL_USED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_SPEC_CV_RETVAL_USED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -36572,29 +36790,47 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_SPEC_CV_RETVAL_USED_HA
ZEND_VM_NEXT_OPCODE();
}
+ ZEND_VM_TAIL_CALL(zend_pre_dec_helper_SPEC_CV(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
+}
+
+static zend_never_inline ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_inc_helper_SPEC_CV(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+
+ zval *var_ptr;
+
+ var_ptr = EX_VAR(opline->op1.var);
+
if (IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(var_ptr))) {
- if (UNEXPECTED(1)) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
+ ZVAL_NULL(EX_VAR(opline->result.var));
ZEND_VM_NEXT_OPCODE();
}
SAVE_OPLINE();
if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(var_ptr) == IS_UNDEF)) {
- var_ptr = GET_OP1_UNDEF_CV(var_ptr, BP_VAR_RW);
+ ZVAL_NULL(var_ptr);
+ ZVAL_UNDEFINED_OP1();
}
- ZVAL_DEREF(var_ptr);
- decrement_function(var_ptr);
+ do {
+ if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) {
+ zend_reference *ref = Z_REF_P(var_ptr);
+ var_ptr = Z_REFVAL_P(var_ptr);
- if (UNEXPECTED(1)) {
+ if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) {
+ zend_incdec_typed_ref(ref, EX_VAR(opline->result.var) OPLINE_CC EXECUTE_DATA_CC);
+ break;
+ }
+ }
ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);
- }
+
+ increment_function(var_ptr);
+ } while (0);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -36608,6 +36844,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_SPEC_CV_HANDLER(ZEND_
ZEND_VM_NEXT_OPCODE();
}
+ ZEND_VM_TAIL_CALL(zend_post_inc_helper_SPEC_CV(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
+}
+
+static zend_never_inline ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_dec_helper_SPEC_CV(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+
+ zval *var_ptr;
+
+ var_ptr = EX_VAR(opline->op1.var);
+
if (IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(var_ptr))) {
ZVAL_NULL(EX_VAR(opline->result.var));
ZEND_VM_NEXT_OPCODE();
@@ -36615,17 +36862,29 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_SPEC_CV_HANDLER(ZEND_
SAVE_OPLINE();
if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(var_ptr) == IS_UNDEF)) {
- var_ptr = GET_OP1_UNDEF_CV(var_ptr, BP_VAR_RW);
+ ZVAL_NULL(var_ptr);
+ ZVAL_UNDEFINED_OP1();
}
- ZVAL_DEREF(var_ptr);
- ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);
- increment_function(var_ptr);
+ do {
+ if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) {
+ zend_reference *ref = Z_REF_P(var_ptr);
+ var_ptr = Z_REFVAL_P(var_ptr);
+
+ if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) {
+ zend_incdec_typed_ref(ref, EX_VAR(opline->result.var) OPLINE_CC EXECUTE_DATA_CC);
+ break;
+ }
+ }
+ ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);
+
+ decrement_function(var_ptr);
+ } while (0);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_DEC_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_DEC_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -36639,21 +36898,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_DEC_SPEC_CV_HANDLER(ZEND_
ZEND_VM_NEXT_OPCODE();
}
- if (IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(var_ptr))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- ZEND_VM_NEXT_OPCODE();
- }
-
- SAVE_OPLINE();
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(var_ptr) == IS_UNDEF)) {
- var_ptr = GET_OP1_UNDEF_CV(var_ptr, BP_VAR_RW);
- }
- ZVAL_DEREF(var_ptr);
- ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);
-
- decrement_function(var_ptr);
-
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+ ZEND_VM_TAIL_CALL(zend_post_dec_helper_SPEC_CV(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
}
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ECHO_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
@@ -36677,7 +36922,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ECHO_SPEC_CV_HANDLER(ZEND_OPCO
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);
+ ZVAL_UNDEFINED_OP1();
}
zend_string_release_ex(str, 0);
}
@@ -36698,7 +36943,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPZ_SPEC_CV_HANDL
} 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);
+ ZVAL_UNDEFINED_OP1();
if (UNEXPECTED(EG(exception))) {
HANDLE_EXCEPTION();
}
@@ -36729,7 +36974,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPNZ_SPEC_CV_HAND
} 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);
+ ZVAL_UNDEFINED_OP1();
if (UNEXPECTED(EG(exception))) {
HANDLE_EXCEPTION();
}
@@ -36747,7 +36992,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPNZ_SPEC_CV_HAND
ZEND_VM_JMP(opline);
}
-static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPZNZ_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPZNZ_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -36761,7 +37006,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPZNZ_SPEC_CV_HAN
} 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);
+ ZVAL_UNDEFINED_OP1();
if (UNEXPECTED(EG(exception))) {
HANDLE_EXCEPTION();
}
@@ -36795,7 +37040,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPZ_EX_SPEC_CV_HANDLER(ZEND_O
ZVAL_FALSE(EX_VAR(opline->result.var));
if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(val) == IS_UNDEF)) {
SAVE_OPLINE();
- GET_OP1_UNDEF_CV(val, BP_VAR_R);
+ ZVAL_UNDEFINED_OP1();
if (UNEXPECTED(EG(exception))) {
HANDLE_EXCEPTION();
}
@@ -36832,7 +37077,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPNZ_EX_SPEC_CV_HANDLER(ZEND_
ZVAL_FALSE(EX_VAR(opline->result.var));
if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(val) == IS_UNDEF)) {
SAVE_OPLINE();
- GET_OP1_UNDEF_CV(val, BP_VAR_R);
+ ZVAL_UNDEFINED_OP1();
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
} else {
ZEND_VM_NEXT_OPCODE();
@@ -36863,7 +37108,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_SPEC_CV_HAN
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);
+ retval_ptr = ZVAL_UNDEFINED_OP1();
if (return_value) {
ZVAL_NULL(return_value);
}
@@ -36883,25 +37128,29 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_SPEC_CV_HAN
}
}
} 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))) {
- zend_refcounted *ref = Z_COUNTED_P(retval_ptr);
- if (GC_MAY_LEAK(ref)) {
- gc_possible_root(ref);
+ do {
+ if (Z_OPT_REFCOUNTED_P(retval_ptr)) {
+ if (EXPECTED(!Z_OPT_ISREF_P(retval_ptr))) {
+ if (EXPECTED(!(EX_CALL_INFO() & ZEND_CALL_CODE))) {
+ zend_refcounted *ref = Z_COUNTED_P(retval_ptr);
+ ZVAL_COPY_VALUE(return_value, retval_ptr);
+ if (GC_MAY_LEAK(ref)) {
+ gc_possible_root(ref);
+ }
+ ZVAL_NULL(retval_ptr);
+ break;
+ } else {
+ Z_ADDREF_P(retval_ptr);
}
- ZVAL_NULL(retval_ptr);
} else {
- Z_ADDREF_P(return_value);
+ retval_ptr = Z_REFVAL_P(retval_ptr);
+ if (Z_OPT_REFCOUNTED_P(retval_ptr)) {
+ Z_ADDREF_P(retval_ptr);
+ }
}
- } else {
- retval_ptr = Z_REFVAL_P(retval_ptr);
- ZVAL_COPY(return_value, retval_ptr);
}
- } else {
ZVAL_COPY_VALUE(return_value, retval_ptr);
- }
+ } while (0);
} else /* if (IS_CV == IS_VAR) */ {
if (UNEXPECTED(Z_ISREF_P(retval_ptr))) {
zend_refcounted *ref = Z_COUNTED_P(retval_ptr);
@@ -36955,8 +37204,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_BY_REF_SPEC_CV_HANDLER(
retval_ptr = _get_zval_ptr_cv_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC);
if (IS_CV == IS_VAR) {
- if (retval_ptr == &EG(uninitialized_zval) ||
- (opline->extended_value == ZEND_RETURNS_FUNCTION && !Z_ISREF_P(retval_ptr))) {
+ ZEND_ASSERT(retval_ptr != &EG(uninitialized_zval));
+ if (opline->extended_value == ZEND_RETURNS_FUNCTION && !Z_ISREF_P(retval_ptr)) {
zend_error(E_NOTICE, "Only variable references should be returned by reference");
if (EX(return_value)) {
ZVAL_NEW_REF(EX(return_value), retval_ptr);
@@ -37043,7 +37292,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_THROW_SPEC_CV_HANDLER(ZEND_OPC
}
}
if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(value) == IS_UNDEF)) {
- GET_OP1_UNDEF_CV(value, BP_VAR_R);
+ ZVAL_UNDEFINED_OP1();
if (UNEXPECTED(EG(exception) != NULL)) {
HANDLE_EXCEPTION();
}
@@ -37065,7 +37314,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_THROW_SPEC_CV_HANDLER(ZEND_OPC
HANDLE_EXCEPTION();
}
-static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAR_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static zend_always_inline ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAR_SPEC_CV_INLINE_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zval *varptr, *arg;
@@ -37074,7 +37323,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAR_SPEC_CV_H
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);
+ ZVAL_UNDEFINED_OP1();
arg = ZEND_CALL_VAR(EX(call), opline->result.var);
ZVAL_NULL(arg);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
@@ -37103,6 +37352,11 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAR_SPEC_CV_H
ZEND_VM_NEXT_OPCODE();
}
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAR_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ ZEND_VM_TAIL_CALL(ZEND_SEND_VAR_SPEC_CV_INLINE_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
+}
+
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_REF_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -37148,7 +37402,7 @@ send_var_by_ref:
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);
+ ZVAL_UNDEFINED_OP1();
arg = ZEND_CALL_VAR(EX(call), opline->result.var);
ZVAL_NULL(arg);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
@@ -37196,7 +37450,7 @@ send_var_by_ref:
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);
+ ZVAL_UNDEFINED_OP1();
arg = ZEND_CALL_VAR(EX(call), opline->result.var);
ZVAL_NULL(arg);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
@@ -37232,13 +37486,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_USER_SPEC_CV_HANDLER(ZEND
SAVE_OPLINE();
- arg = _get_zval_ptr_cv_deref_BP_VAR_R(opline->op1.var 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_param_must_be_ref(EX(call)->func, opline->op2.num);
}
+ arg = _get_zval_ptr_cv_deref_BP_VAR_R(opline->op1.var EXECUTE_DATA_CC);
+ param = ZEND_CALL_VAR(EX(call), opline->result.var);
ZVAL_COPY(param, arg);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
@@ -37259,7 +37513,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BOOL_SPEC_CV_HANDLER(ZEND_OPCO
ZVAL_FALSE(EX_VAR(opline->result.var));
if (IS_CV == IS_CV && UNEXPECTED(orig_val_type == IS_UNDEF)) {
SAVE_OPLINE();
- GET_OP1_UNDEF_CV(val, BP_VAR_R);
+ ZVAL_UNDEFINED_OP1();
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
} else {
@@ -37298,7 +37552,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CLONE_SPEC_CV_HANDLER(ZEND_OPC
}
ZVAL_UNDEF(EX_VAR(opline->result.var));
if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(obj) == IS_UNDEF)) {
- GET_OP1_UNDEF_CV(obj, BP_VAR_R);
+ ZVAL_UNDEFINED_OP1();
if (UNEXPECTED(EG(exception) != NULL)) {
HANDLE_EXCEPTION();
}
@@ -37319,23 +37573,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CLONE_SPEC_CV_HANDLER(ZEND_OPC
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_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 (clone && !(clone->common.fn_flags & ZEND_ACC_PUBLIC)) {
+ scope = EX(func)->op_array.scope;
+ if (clone->common.scope != scope) {
+ if (UNEXPECTED(clone->common.fn_flags & ZEND_ACC_PRIVATE)
+ || UNEXPECTED(!zend_check_protected(zend_get_function_root_class(clone), scope))) {
+ zend_wrong_clone_call(clone, scope);
ZVAL_UNDEF(EX_VAR(opline->result.var));
HANDLE_EXCEPTION();
@@ -37404,22 +37647,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CAST_SPEC_CV_HANDLER(ZEND_OPCO
} 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);
+ } else {
+ HashTable *obj_ht = zend_get_properties_for(expr, ZEND_PROP_PURPOSE_ARRAY_CAST);
if (obj_ht) {
/* fast copy */
- obj_ht = zend_proptable_to_symtable(obj_ht,
+ ZVAL_ARR(result, 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);
+ GC_IS_RECURSIVE(obj_ht))));
+ zend_release_properties(obj_ht);
} else {
ZVAL_EMPTY_ARRAY(result);
}
- } else {
- ZVAL_COPY_VALUE(result, expr);
- Z_ADDREF_P(result);
- convert_to_array(result);
}
} else {
ZVAL_OBJ(result, zend_objects_new(zend_standard_class_def));
@@ -37473,15 +37712,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INCLUDE_OR_EVAL_SPEC_CV_HANDLE
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,
+ call = zend_vm_stack_push_call_frame(
+ (Z_TYPE_INFO(EX(This)) & ZEND_CALL_HAS_THIS) | 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);
+ Z_PTR(EX(This)));
if (EX_CALL_INFO() & ZEND_CALL_HAS_SYMBOL_TABLE) {
call->symbol_table = EX(symbol_table);
@@ -37660,35 +37898,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_CV_HANDLER(ZE
}
}
-static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_EXIT_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
-
- SAVE_OPLINE();
- if (IS_CV != IS_UNUSED) {
-
- zval *ptr = _get_zval_ptr_cv_BP_VAR_R(opline->op1.var EXECUTE_DATA_CC);
-
- do {
- if (Z_TYPE_P(ptr) == IS_LONG) {
- EG(exit_status) = Z_LVAL_P(ptr);
- } else {
- if ((IS_CV & (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);
-
- }
- zend_bailout();
- ZEND_VM_NEXT_OPCODE(); /* Never reached */
-}
-
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMP_SET_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -37787,7 +37996,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_QM_ASSIGN_SPEC_CV_
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);
+ ZVAL_UNDEFINED_OP1();
ZVAL_NULL(result);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
@@ -37945,7 +38154,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_STRLEN_SPEC_CV_HANDLER(ZEND_OP
SAVE_OPLINE();
if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(value) == IS_UNDEF)) {
- value = GET_OP1_UNDEF_CV(value, BP_VAR_R);
+ value = ZVAL_UNDEFINED_OP1();
}
strict = EX_USES_STRICT_TYPES();
do {
@@ -37961,7 +38170,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_STRLEN_SPEC_CV_HANDLER(ZEND_OP
}
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)));
+ if (!EG(exception)) {
+ 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);
}
@@ -37991,10 +38202,11 @@ 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();
+ ZVAL_UNDEFINED_OP1();
+ if (UNEXPECTED(EG(exception))) {
+ ZVAL_UNDEF(EX_VAR(opline->result.var));
+ HANDLE_EXCEPTION();
+ }
}
if (IS_CV & (IS_TMP_VAR|IS_VAR)) {
SAVE_OPLINE();
@@ -38061,40 +38273,6 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_LONG_SPEC_
ZEND_VM_NEXT_OPCODE();
}
-static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_LONG_OR_DOUBLE_SPEC_CV_RETVAL_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zval *var_ptr;
-
- var_ptr = EX_VAR(opline->op1.var);
- if (EXPECTED(Z_TYPE_P(var_ptr) == IS_LONG)) {
- fast_long_increment_function(var_ptr);
- } else {
- Z_DVAL_P(var_ptr)++;
- }
- if (UNEXPECTED(0)) {
- ZVAL_COPY_VALUE(EX_VAR(opline->result.var), var_ptr);
- }
- ZEND_VM_NEXT_OPCODE();
-}
-
-static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_LONG_OR_DOUBLE_SPEC_CV_RETVAL_USED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zval *var_ptr;
-
- var_ptr = EX_VAR(opline->op1.var);
- if (EXPECTED(Z_TYPE_P(var_ptr) == IS_LONG)) {
- fast_long_increment_function(var_ptr);
- } else {
- Z_DVAL_P(var_ptr)++;
- }
- if (UNEXPECTED(1)) {
- ZVAL_COPY_VALUE(EX_VAR(opline->result.var), var_ptr);
- }
- ZEND_VM_NEXT_OPCODE();
-}
-
static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_LONG_NO_OVERFLOW_SPEC_CV_RETVAL_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -38147,40 +38325,6 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_LONG_SPEC_
ZEND_VM_NEXT_OPCODE();
}
-static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_LONG_OR_DOUBLE_SPEC_CV_RETVAL_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zval *var_ptr;
-
- var_ptr = EX_VAR(opline->op1.var);
- if (EXPECTED(Z_TYPE_P(var_ptr) == IS_LONG)) {
- fast_long_decrement_function(var_ptr);
- } else {
- Z_DVAL_P(var_ptr)--;
- }
- if (UNEXPECTED(0)) {
- ZVAL_COPY_VALUE(EX_VAR(opline->result.var), var_ptr);
- }
- ZEND_VM_NEXT_OPCODE();
-}
-
-static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_LONG_OR_DOUBLE_SPEC_CV_RETVAL_USED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zval *var_ptr;
-
- var_ptr = EX_VAR(opline->op1.var);
- if (EXPECTED(Z_TYPE_P(var_ptr) == IS_LONG)) {
- fast_long_decrement_function(var_ptr);
- } else {
- Z_DVAL_P(var_ptr)--;
- }
- if (UNEXPECTED(1)) {
- ZVAL_COPY_VALUE(EX_VAR(opline->result.var), var_ptr);
- }
- ZEND_VM_NEXT_OPCODE();
-}
-
static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_LONG_NO_OVERFLOW_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -38203,22 +38347,6 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_LONG_SPEC
ZEND_VM_NEXT_OPCODE();
}
-static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_LONG_OR_DOUBLE_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zval *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();
-}
-
static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_DEC_LONG_NO_OVERFLOW_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -38241,22 +38369,6 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_DEC_LONG_SPEC
ZEND_VM_NEXT_OPCODE();
}
-static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_DEC_LONG_OR_DOUBLE_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zval *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();
-}
-
static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAR_SIMPLE_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -38298,138 +38410,6 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAR_EX_SIMPLE
ZEND_VM_NEXT_OPCODE();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
-
- zval *op1, *op2, *result;
-
- 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);
- 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_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)) {
- op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
- }
- add_function(EX_VAR(opline->result.var), op1, op2);
-
-
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SUB_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
-
- zval *op1, *op2, *result;
-
- 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);
- 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_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)) {
- op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
- }
- sub_function(EX_VAR(opline->result.var), op1, op2);
-
-
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MUL_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
-
- zval *op1, *op2, *result;
-
- 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;
-
- 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_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)) {
- 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_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -38445,98 +38425,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DIV_SPEC_CV_CONST_HANDLER(ZEND
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MOD_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
-
- zval *op1, *op2, *result;
-
- 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)) {
- 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_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)) {
- op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
- }
- mod_function(EX_VAR(opline->result.var), op1, op2);
-
-
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SL_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
-
- zval *op1, *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)) {
- 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_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);
-
-
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SR_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
-
- zval *op1, *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)) {
- 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_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);
-
-
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POW_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -38573,14 +38461,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CONCAT_SPEC_CV_CONST_HANDLER(Z
} else {
ZVAL_STR(EX_VAR(opline->result.var), op2_str);
}
-
+ if (IS_CV & (IS_TMP_VAR|IS_VAR)) {
+ zend_string_release_ex(op1_str, 0);
+ }
} 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 {
ZVAL_STR(EX_VAR(opline->result.var), op1_str);
}
-
+ if (IS_CONST & (IS_TMP_VAR|IS_VAR)) {
+ zend_string_release_ex(op2_str, 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);
@@ -38588,24 +38480,30 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CONCAT_SPEC_CV_CONST_HANDLER(Z
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);
-
+ if (IS_CONST & (IS_TMP_VAR|IS_VAR)) {
+ zend_string_release_ex(op2_str, 0);
+ }
} 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_TMP_VAR|IS_VAR)) {
+ zend_string_release_ex(op1_str, 0);
+ }
+ if (IS_CONST & (IS_TMP_VAR|IS_VAR)) {
+ zend_string_release_ex(op2_str, 0);
+ }
}
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);
+ op1 = ZVAL_UNDEFINED_OP1();
}
if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
- op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
+ op2 = ZVAL_UNDEFINED_OP2();
}
concat_function(EX_VAR(opline->result.var), op1, op2);
@@ -38619,7 +38517,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_IDENTICAL_SPEC_CV_CONST_HAN
USE_OPLINE
zval *op1, *op2;
- int result;
+ zend_bool result;
SAVE_OPLINE();
op1 = _get_zval_ptr_cv_deref_BP_VAR_R(opline->op1.var EXECUTE_DATA_CC);
@@ -38637,7 +38535,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_SPEC_CV_CONST
USE_OPLINE
zval *op1, *op2;
- int result;
+ zend_bool result;
SAVE_OPLINE();
op1 = _get_zval_ptr_cv_deref_BP_VAR_R(opline->op1.var EXECUTE_DATA_CC);
@@ -38654,309 +38552,390 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_CV_CONST_HANDLER
{
USE_OPLINE
- zval *op1, *op2, *result;
+ zval *op1, *op2;
+ double d1, d2;
op1 = EX_VAR(opline->op1.var);
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));
+ if (1 && IS_CV == IS_CONST && IS_CONST == IS_CONST) {
+ /* pass */
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_LVAL_P(op1) == Z_LVAL_P(op2))) {
+is_equal_true:
+
+ ZVAL_TRUE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
} else {
- break;
+is_equal_false:
+
+ ZVAL_FALSE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
}
- } 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 if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ d1 = (double)Z_LVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+ goto is_equal_double;
+ }
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+is_equal_double:
+ if (d1 == d2) {
+ goto is_equal_true;
} else {
- break;
+ goto is_equal_false;
}
- } 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 if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = (double)Z_LVAL_P(op2);
+ goto is_equal_double;
+ }
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
+ if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
+ int result = zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2));
+ if (IS_CV & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_str(op1);
+ }
+ if (IS_CONST & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_str(op2);
+ }
+ if (result) {
+ goto is_equal_true;
} else {
- break;
+ goto is_equal_false;
}
- } 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();
+ ZEND_VM_TAIL_CALL(zend_is_equal_helper_SPEC(op1, op2 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_CV_CONST_JMPZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zval *op1, *op2, *result;
+ zval *op1, *op2;
+ double d1, d2;
op1 = EX_VAR(opline->op1.var);
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));
+ if (1 && IS_CV == IS_CONST && IS_CONST == IS_CONST) {
+ /* pass */
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_LVAL_P(op1) == Z_LVAL_P(op2))) {
+is_equal_true:
+ ZEND_VM_SMART_BRANCH_TRUE_JMPZ();
+ ZVAL_TRUE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
} else {
- break;
+is_equal_false:
+ ZEND_VM_SMART_BRANCH_FALSE_JMPZ();
+ ZVAL_FALSE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
}
- } 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 if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ d1 = (double)Z_LVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+ goto is_equal_double;
+ }
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+is_equal_double:
+ if (d1 == d2) {
+ goto is_equal_true;
} else {
- break;
+ goto is_equal_false;
}
- } 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 if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = (double)Z_LVAL_P(op2);
+ goto is_equal_double;
+ }
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
+ if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
+ int result = zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2));
+ if (IS_CV & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_str(op1);
+ }
+ if (IS_CONST & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_str(op2);
+ }
+ if (result) {
+ goto is_equal_true;
} else {
- break;
+ goto is_equal_false;
}
- } 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();
+ ZEND_VM_TAIL_CALL(zend_is_equal_helper_SPEC(op1, op2 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_CV_CONST_JMPNZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zval *op1, *op2, *result;
+ zval *op1, *op2;
+ double d1, d2;
op1 = EX_VAR(opline->op1.var);
op2 = RT_CONSTANT(opline, opline->op2);
- 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));
+ if (1 && IS_CV == IS_CONST && IS_CONST == IS_CONST) {
+ /* pass */
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_LVAL_P(op1) == Z_LVAL_P(op2))) {
+is_equal_true:
+ ZEND_VM_SMART_BRANCH_TRUE_JMPNZ();
+ ZVAL_TRUE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
} else {
- break;
+is_equal_false:
+ ZEND_VM_SMART_BRANCH_FALSE_JMPNZ();
+ ZVAL_FALSE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
}
- } 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 if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ d1 = (double)Z_LVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+ goto is_equal_double;
+ }
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+is_equal_double:
+ if (d1 == d2) {
+ goto is_equal_true;
} else {
- break;
+ goto is_equal_false;
+ }
+ } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = (double)Z_LVAL_P(op2);
+ goto is_equal_double;
+ }
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
+ if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
+ int result = zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2));
+ if (IS_CV & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_str(op1);
+ }
+ if (IS_CONST & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_str(op2);
+ }
+ if (result) {
+ goto is_equal_true;
+ } else {
+ goto is_equal_false;
}
- } 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_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)) {
- 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();
+ ZEND_VM_TAIL_CALL(zend_is_equal_helper_SPEC(op1, op2 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zval *op1, *op2, *result;
+ zval *op1, *op2;
+ double d1, d2;
op1 = EX_VAR(opline->op1.var);
op2 = RT_CONSTANT(opline, opline->op2);
- do {
- int result;
+ if (1 && IS_CV == IS_CONST && IS_CONST == IS_CONST) {
+ /* pass */
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_LVAL_P(op1) != Z_LVAL_P(op2))) {
+is_not_equal_true:
+
+ ZVAL_TRUE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
+ } else {
+is_not_equal_false:
- 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));
+ ZVAL_FALSE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
+ }
+ } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ d1 = (double)Z_LVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+ goto is_not_equal_double;
+ }
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+is_not_equal_double:
+ if (d1 != d2) {
+ goto is_not_equal_true;
} else {
- break;
+ goto is_not_equal_false;
+ }
+ } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = (double)Z_LVAL_P(op2);
+ goto is_not_equal_double;
+ }
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
+ if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
+ int result = zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2));
+ if (IS_CV & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_str(op1);
}
- } 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)));
+ if (IS_CONST & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_str(op2);
+ }
+ if (!result) {
+ goto is_not_equal_true;
} else {
- break;
+ goto is_not_equal_false;
}
- } 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_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)) {
- 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_SPACESHIP_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
-
- zval *op1, *op2;
-
- SAVE_OPLINE();
- op1 = _get_zval_ptr_cv_BP_VAR_R(opline->op1.var EXECUTE_DATA_CC);
- op2 = RT_CONSTANT(opline, opline->op2);
- compare_function(EX_VAR(opline->result.var), op1, op2);
-
-
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+ ZEND_VM_TAIL_CALL(zend_is_not_equal_helper_SPEC(op1, op2 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_OR_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_CV_CONST_JMPZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zval *op1, *op2;
+ double d1, d2;
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));
- 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_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
- op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
+ if (1 && IS_CV == IS_CONST && IS_CONST == IS_CONST) {
+ /* pass */
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_LVAL_P(op1) != Z_LVAL_P(op2))) {
+is_not_equal_true:
+ ZEND_VM_SMART_BRANCH_TRUE_JMPZ();
+ ZVAL_TRUE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
+ } else {
+is_not_equal_false:
+ ZEND_VM_SMART_BRANCH_FALSE_JMPZ();
+ ZVAL_FALSE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
+ }
+ } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ d1 = (double)Z_LVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+ goto is_not_equal_double;
+ }
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+is_not_equal_double:
+ if (d1 != d2) {
+ goto is_not_equal_true;
+ } else {
+ goto is_not_equal_false;
+ }
+ } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = (double)Z_LVAL_P(op2);
+ goto is_not_equal_double;
+ }
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
+ if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
+ int result = zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2));
+ if (IS_CV & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_str(op1);
+ }
+ if (IS_CONST & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_str(op2);
+ }
+ if (!result) {
+ goto is_not_equal_true;
+ } else {
+ goto is_not_equal_false;
+ }
+ }
}
- bitwise_or_function(EX_VAR(opline->result.var), op1, op2);
-
-
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+ ZEND_VM_TAIL_CALL(zend_is_not_equal_helper_SPEC(op1, op2 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_AND_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_CV_CONST_JMPNZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zval *op1, *op2;
+ double d1, d2;
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));
- 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_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
- op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
+ if (1 && IS_CV == IS_CONST && IS_CONST == IS_CONST) {
+ /* pass */
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_LVAL_P(op1) != Z_LVAL_P(op2))) {
+is_not_equal_true:
+ ZEND_VM_SMART_BRANCH_TRUE_JMPNZ();
+ ZVAL_TRUE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
+ } else {
+is_not_equal_false:
+ ZEND_VM_SMART_BRANCH_FALSE_JMPNZ();
+ ZVAL_FALSE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
+ }
+ } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ d1 = (double)Z_LVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+ goto is_not_equal_double;
+ }
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+is_not_equal_double:
+ if (d1 != d2) {
+ goto is_not_equal_true;
+ } else {
+ goto is_not_equal_false;
+ }
+ } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = (double)Z_LVAL_P(op2);
+ goto is_not_equal_double;
+ }
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
+ if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
+ int result = zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2));
+ if (IS_CV & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_str(op1);
+ }
+ if (IS_CONST & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_str(op2);
+ }
+ if (!result) {
+ goto is_not_equal_true;
+ } else {
+ goto is_not_equal_false;
+ }
+ }
}
- bitwise_and_function(EX_VAR(opline->result.var), op1, op2);
-
-
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+ ZEND_VM_TAIL_CALL(zend_is_not_equal_helper_SPEC(op1, op2 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_XOR_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SPACESHIP_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zval *op1, *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));
- 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_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);
+ op1 = _get_zval_ptr_cv_BP_VAR_R(opline->op1.var EXECUTE_DATA_CC);
+ op2 = RT_CONSTANT(opline, opline->op2);
+ compare_function(EX_VAR(opline->result.var), op1, op2);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
@@ -38977,17 +38956,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BOOL_XOR_SPEC_CV_CONST_HANDLER
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_CV_CONST(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_OP_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zend_free_op free_op_data1;
+ zend_free_op free_op_data;
zval *object;
zval *property;
zval *value;
zval *zptr;
+ void **cache_slot;
+ zend_property_info *prop_info;
SAVE_OPLINE();
- object = _get_zval_ptr_cv_BP_VAR_RW(opline->op1.var EXECUTE_DATA_CC);
+ 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));
@@ -38996,49 +38977,76 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP
property = RT_CONSTANT(opline, opline->op2);
do {
- value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data1);
+ value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data);
if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
- if (Z_ISREF_P(object)) {
+ if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) {
object = Z_REFVAL_P(object);
- if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
- goto assign_op_object;
- }
+ goto assign_op_object;
}
- if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
+ if (IS_CV == IS_CV
+ && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
+ ZVAL_UNDEFINED_OP1();
+ }
+ object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC);
+ if (UNEXPECTED(!object)) {
break;
}
}
- /* here we are sure we are dealing with an object */
assign_op_object:
- if (EXPECTED(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)) {
+ /* here we are sure we are dealing with an object */
+ cache_slot = (IS_CONST == IS_CONST) ? CACHE_ADDR((opline+1)->extended_value) : NULL;
+ if (EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, cache_slot)) != NULL)) {
if (UNEXPECTED(Z_ISERROR_P(zptr))) {
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_NULL(EX_VAR(opline->result.var));
}
} else {
- ZVAL_DEREF(zptr);
+ zval *orig_zptr = zptr;
+ zend_reference *ref;
+
+ do {
+ if (UNEXPECTED(Z_ISREF_P(zptr))) {
+ ref = Z_REF_P(zptr);
+ zptr = Z_REFVAL_P(zptr);
+ if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) {
+ zend_binary_assign_op_typed_ref(ref, value OPLINE_CC EXECUTE_DATA_CC);
+ break;
+ }
+ }
+
+ if (IS_CONST == IS_CONST) {
+ prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2);
+ } else {
+ prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(object), orig_zptr);
+ }
+ if (UNEXPECTED(prop_info)) {
+ /* special case for typed properties */
+ zend_binary_assign_op_typed_prop(prop_info, zptr, value OPLINE_CC EXECUTE_DATA_CC);
+ } else {
+ zend_binary_op(zptr, zptr, value OPLINE_CC);
+ }
+ } while (0);
- binary_op(zptr, zptr, value);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), zptr);
}
}
} else {
- zend_assign_op_overloaded_property(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR((opline+1)->extended_value) : NULL), value, binary_op OPLINE_CC EXECUTE_DATA_CC);
+ zend_assign_op_overloaded_property(object, property, cache_slot, value OPLINE_CC EXECUTE_DATA_CC);
}
} while (0);
- FREE_OP(free_op_data1);
+ FREE_OP(free_op_data);
/* assign_obj has two opcodes! */
ZEND_VM_NEXT_OPCODE_EX(1, 2);
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SPEC_CV_CONST(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC)
+/* No specialization for op_types (CONST|TMP|VAR|CV, UNUSED|CONST|TMPVAR) */
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_OP_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zend_free_op free_op_data1;
@@ -39068,67 +39076,61 @@ assign_dim_op_new_array:
if (UNEXPECTED(!var_ptr)) {
goto assign_dim_op_ret_null;
}
- ZVAL_DEREF(var_ptr);
}
value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data1);
- binary_op(var_ptr, var_ptr, value);
+ do {
+ if (IS_CONST != IS_UNUSED && UNEXPECTED(Z_ISREF_P(var_ptr))) {
+ zend_reference *ref = Z_REF_P(var_ptr);
+ var_ptr = Z_REFVAL_P(var_ptr);
+ if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) {
+ zend_binary_assign_op_typed_ref(ref, value OPLINE_CC EXECUTE_DATA_CC);
+ break;
+ }
+ }
+ zend_binary_op(var_ptr, var_ptr, value OPLINE_CC);
+ } while (0);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);
}
+ FREE_OP(free_op_data1);
} 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_ARR(container, zend_new_array(8));
- goto assign_dim_op_new_array;
}
dim = RT_CONSTANT(opline, opline->op2);
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_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);
+ zend_binary_assign_op_obj_dim(container, dim OPLINE_CC EXECUTE_DATA_CC);
+ } else if (EXPECTED(Z_TYPE_P(container) <= IS_FALSE)) {
+ if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(container) == IS_UNDEF)) {
+ ZVAL_UNDEFINED_OP1();
+ }
+ ZVAL_ARR(container, zend_new_array(8));
+ goto assign_dim_op_new_array;
} else {
- if (UNEXPECTED(Z_TYPE_P(container) == IS_STRING)) {
- if (IS_CONST == 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_CV != IS_VAR || EXPECTED(!Z_ISERROR_P(container)))) {
- zend_use_scalar_as_array();
- }
+ zend_binary_assign_op_dim_slow(container, dim OPLINE_CC EXECUTE_DATA_CC);
assign_dim_op_ret_null:
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
+ 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);
}
}
- 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_CONST(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OP_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -39144,9 +39146,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_simple_helper
ZVAL_NULL(EX_VAR(opline->result.var));
}
} else {
- ZVAL_DEREF(var_ptr);
-
- binary_op(var_ptr, var_ptr, value);
+ do {
+ if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) {
+ zend_reference *ref = Z_REF_P(var_ptr);
+ var_ptr = Z_REFVAL_P(var_ptr);
+ if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) {
+ zend_binary_assign_op_typed_ref(ref, value OPLINE_CC EXECUTE_DATA_CC);
+ break;
+ }
+ }
+ zend_binary_op(var_ptr, var_ptr, value OPLINE_CC);
+ } while (0);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);
@@ -39157,265 +39167,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_simple_helper
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_SPEC_CV_CONST(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC)
-{
-#if 1 && IS_CONST == IS_UNUSED
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CV_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-#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));
- }
- if (EXPECTED(0)) {
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CV_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
- }
-# endif
-
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_CV_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-#endif
-}
-
-static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_SPEC_CV_CONST_DIM(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC)
-{
-#if 1 && IS_CONST == IS_UNUSED
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CV_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-#else
-# if 0 || IS_CV != IS_UNUSED
-# if 0
- /* opline->extended_value checks are specialized, don't need opline */
- USE_OPLINE
-# endif
-
- if (EXPECTED(0)) {
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_simple_helper_SPEC_CV_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
- }
- if (EXPECTED(1)) {
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CV_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
- }
-# endif
-
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_CV_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-#endif
-}
-
-static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_SPEC_CV_CONST_OBJ(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC)
-{
-#if 1 && IS_CONST == IS_UNUSED
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CV_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-#else
-# if 0 || IS_CV != IS_UNUSED
-# if 0
- /* opline->extended_value checks are specialized, don't need opline */
- USE_OPLINE
-# endif
-
- if (EXPECTED(0)) {
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_simple_helper_SPEC_CV_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
- }
- if (EXPECTED(0)) {
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CV_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
- }
-# endif
-
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_CV_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-#endif
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST(add_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_CV_CONST_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST_DIM(add_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_CV_CONST_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST_OBJ(add_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SUB_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST(sub_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SUB_SPEC_CV_CONST_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST_DIM(sub_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SUB_SPEC_CV_CONST_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST_OBJ(sub_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MUL_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST(mul_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MUL_SPEC_CV_CONST_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST_DIM(mul_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MUL_SPEC_CV_CONST_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST_OBJ(mul_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIV_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST(div_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIV_SPEC_CV_CONST_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST_DIM(div_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIV_SPEC_CV_CONST_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST_OBJ(div_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MOD_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST(mod_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MOD_SPEC_CV_CONST_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST_DIM(mod_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MOD_SPEC_CV_CONST_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST_OBJ(mod_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SL_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST(shift_left_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SL_SPEC_CV_CONST_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST_DIM(shift_left_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SL_SPEC_CV_CONST_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST_OBJ(shift_left_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SR_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST(shift_right_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SR_SPEC_CV_CONST_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST_DIM(shift_right_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SR_SPEC_CV_CONST_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST_OBJ(shift_right_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_CONCAT_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST(concat_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_CONCAT_SPEC_CV_CONST_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST_DIM(concat_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_CONCAT_SPEC_CV_CONST_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST_OBJ(concat_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_OR_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST(bitwise_or_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_OR_SPEC_CV_CONST_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST_DIM(bitwise_or_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_OR_SPEC_CV_CONST_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST_OBJ(bitwise_or_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_AND_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST(bitwise_and_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_AND_SPEC_CV_CONST_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST_DIM(bitwise_and_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_AND_SPEC_CV_CONST_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST_OBJ(bitwise_and_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST(bitwise_xor_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_CV_CONST_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST_DIM(bitwise_xor_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_CV_CONST_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST_OBJ(bitwise_xor_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_POW_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST(pow_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_POW_SPEC_CV_CONST_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST_DIM(pow_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_POW_SPEC_CV_CONST_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST_OBJ(pow_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_CV_CONST(int inc ZEND_OPCODE_HANDLER_ARGS_DC)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_OBJ_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zval *object;
zval *property;
zval *zptr;
+ void **cache_slot;
+ zend_property_info *prop_info;
SAVE_OPLINE();
- object = _get_zval_ptr_cv_BP_VAR_RW(opline->op1.var EXECUTE_DATA_CC);
+ 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));
@@ -39425,47 +39188,38 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE
do {
if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
- if (Z_ISREF_P(object)) {
+ if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) {
object = Z_REFVAL_P(object);
- if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
- goto pre_incdec_object;
- }
+ goto pre_incdec_object;
+ }
+ if (IS_CV == IS_CV
+ && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
+ ZVAL_UNDEFINED_OP1();
}
- if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
+ object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC);
+ if (UNEXPECTED(!object)) {
break;
}
}
- /* here we are sure we are dealing with an object */
pre_incdec_object:
- if (EXPECTED(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->extended_value) : NULL))) != NULL)) {
+ /* here we are sure we are dealing with an object */
+ cache_slot = (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL;
+ if (EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, cache_slot)) != NULL)) {
if (UNEXPECTED(Z_ISERROR_P(zptr))) {
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_NULL(EX_VAR(opline->result.var));
}
} else {
- if (EXPECTED(Z_TYPE_P(zptr) == IS_LONG)) {
- if (inc) {
- fast_long_increment_function(zptr);
- } else {
- fast_long_decrement_function(zptr);
- }
+ if (IS_CONST == IS_CONST) {
+ prop_info = (zend_property_info *) CACHED_PTR_EX(cache_slot + 2);
} else {
- ZVAL_DEREF(zptr);
-
- if (inc) {
- increment_function(zptr);
- } else {
- decrement_function(zptr);
- }
- }
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY(EX_VAR(opline->result.var), zptr);
+ prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(object), zptr);
}
+ zend_pre_incdec_property_zval(zptr, prop_info OPLINE_CC EXECUTE_DATA_CC);
}
} else {
- zend_pre_incdec_overloaded_property(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), inc OPLINE_CC EXECUTE_DATA_CC);
+ zend_pre_incdec_overloaded_property(object, property, cache_slot OPLINE_CC EXECUTE_DATA_CC);
}
} while (0);
@@ -39473,26 +39227,18 @@ pre_incdec_object:
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_OBJ_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_pre_incdec_property_helper_SPEC_CV_CONST(1 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_OBJ_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_pre_incdec_property_helper_SPEC_CV_CONST(0 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_CV_CONST(int inc ZEND_OPCODE_HANDLER_ARGS_DC)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_OBJ_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zval *object;
zval *property;
zval *zptr;
+ void **cache_slot;
+ zend_property_info *prop_info;
SAVE_OPLINE();
- object = _get_zval_ptr_cv_BP_VAR_RW(opline->op1.var EXECUTE_DATA_CC);
+ 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));
@@ -39502,190 +39248,49 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP
do {
if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
- if (Z_ISREF_P(object)) {
+ if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) {
object = Z_REFVAL_P(object);
- if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
- goto post_incdec_object;
- }
+ goto post_incdec_object;
}
- if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
+ if (IS_CV == IS_CV
+ && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
+ ZVAL_UNDEFINED_OP1();
+ }
+ object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC);
+ if (UNEXPECTED(!object)) {
break;
}
}
- /* here we are sure we are dealing with an object */
post_incdec_object:
- if (EXPECTED(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->extended_value) : NULL))) != NULL)) {
+ /* here we are sure we are dealing with an object */
+ cache_slot = (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL;
+ if (EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, cache_slot)) != NULL)) {
if (UNEXPECTED(Z_ISERROR_P(zptr))) {
ZVAL_NULL(EX_VAR(opline->result.var));
} else {
- if (EXPECTED(Z_TYPE_P(zptr) == IS_LONG)) {
- ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(zptr));
- if (inc) {
- fast_long_increment_function(zptr);
- } else {
- fast_long_decrement_function(zptr);
- }
+ if (IS_CONST == IS_CONST) {
+ prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2);
} else {
- ZVAL_DEREF(zptr);
- ZVAL_COPY(EX_VAR(opline->result.var), zptr);
- if (inc) {
- increment_function(zptr);
- } else {
- decrement_function(zptr);
- }
- }
- }
- } else {
- 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);
-
-
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_OBJ_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_post_incdec_property_helper_SPEC_CV_CONST(1 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_DEC_OBJ_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_post_incdec_property_helper_SPEC_CV_CONST(0 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_CV_CONST(int type ZEND_OPCODE_HANDLER_ARGS_DC)
-{
- USE_OPLINE
-
- zval *varname;
- zval *retval;
- zend_string *name, *tmp_name;
- zend_class_entry *ce;
-
- SAVE_OPLINE();
-
- do {
- if (IS_CONST == IS_CONST) {
- if (IS_CV == IS_CONST && EXPECTED((ce = CACHED_PTR(opline->extended_value)) != NULL)) {
- retval = CACHED_PTR(opline->extended_value + sizeof(void*));
- break;
- } else {
- zval *class_name = RT_CONSTANT(opline, opline->op2);
-
- if (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);
- }
+ prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(object), zptr);
}
- }
- } 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));
+ zend_post_incdec_property_zval(zptr, prop_info OPLINE_CC EXECUTE_DATA_CC);
}
- 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);
+ zend_post_incdec_overloaded_property(object, property, cache_slot OPLINE_CC EXECUTE_DATA_CC);
}
-
- 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 {
- 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_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_fetch_static_prop_helper_SPEC_CV_CONST(BP_VAR_R ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_STATIC_PROP_W_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_fetch_static_prop_helper_SPEC_CV_CONST(BP_VAR_W ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_STATIC_PROP_RW_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_fetch_static_prop_helper_SPEC_CV_CONST(BP_VAR_RW ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_STATIC_PROP_FUNC_ARG_SPEC_CV_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_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)
-{
- ZEND_VM_TAIL_CALL(zend_fetch_static_prop_helper_SPEC_CV_CONST(BP_VAR_UNSET ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_STATIC_PROP_IS_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_fetch_static_prop_helper_SPEC_CV_CONST(BP_VAR_IS ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_R_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zval *container, *dim, *value, *result;
+ zval *container, *dim, *value;
SAVE_OPLINE();
container = EX_VAR(opline->op1.var);
@@ -39694,8 +39299,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_R_SPEC_CV_CONST_HAND
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_DEREF(result, value);
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value);
} else if (EXPECTED(Z_TYPE_P(container) == IS_REFERENCE)) {
container = Z_REFVAL_P(container);
if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
@@ -39768,6 +39372,10 @@ 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)
{
+#if 0
+ USE_OPLINE
+#endif
+
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));
@@ -39798,7 +39406,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_UNSET_SPEC_CV_CONST_
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static zend_always_inline ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_CONST_INLINE_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -39826,12 +39434,14 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_C
}
}
if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
- GET_OP1_UNDEF_CV(container, BP_VAR_R);
+ ZVAL_UNDEFINED_OP1();
}
if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(offset) == IS_UNDEF)) {
- GET_OP2_UNDEF_CV(offset, BP_VAR_R);
+ ZVAL_UNDEFINED_OP2();
}
- goto fetch_obj_r_no_object;
+ zend_wrong_property_read(offset);
+ ZVAL_NULL(EX_VAR(opline->result.var));
+ goto fetch_obj_r_finish;
} while (0);
}
@@ -39841,7 +39451,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_C
zval *retval;
if (IS_CONST == IS_CONST) {
- cache_slot = CACHE_ADDR(opline->extended_value);
+ cache_slot = CACHE_ADDR(opline->extended_value & ~ZEND_FETCH_REF /* FUNC_ARG fetch may contain it */);
if (EXPECTED(zobj->ce == CACHED_PTR_EX(cache_slot))) {
uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1);
@@ -39849,8 +39459,13 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_C
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;
+ if (0 || (IS_CV & (IS_TMP_VAR|IS_VAR)) != 0) {
+ goto fetch_obj_r_copy;
+ } else {
+fetch_obj_r_fast_copy:
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
+ ZEND_VM_NEXT_OPCODE();
+ }
}
} else if (EXPECTED(zobj->properties != NULL)) {
if (!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET(prop_offset)) {
@@ -39864,8 +39479,12 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_C
(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;
+ retval = &p->val;
+ if (0 || (IS_CV & (IS_TMP_VAR|IS_VAR)) != 0) {
+ goto fetch_obj_r_copy;
+ } else {
+ goto fetch_obj_r_fast_copy;
+ }
}
}
CACHE_PTR_EX(cache_slot + 1, (void*)ZEND_DYNAMIC_PROPERTY_OFFSET);
@@ -39874,34 +39493,39 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_C
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;
+ if (0 || (IS_CV & (IS_TMP_VAR|IS_VAR)) != 0) {
+ goto fetch_obj_r_copy;
+ } else {
+ goto fetch_obj_r_fast_copy;
+ }
}
}
}
} else if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(offset) == IS_UNDEF)) {
- GET_OP2_UNDEF_CV(offset, BP_VAR_R);
+ ZVAL_UNDEFINED_OP2();
}
- 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));
+ 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);
- }
+ if (retval != EX_VAR(opline->result.var)) {
+fetch_obj_r_copy:
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
+ } else if (UNEXPECTED(Z_ISREF_P(retval))) {
+ zend_unwrap_reference(retval);
}
} while (0);
+fetch_obj_r_finish:
+
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)
+{
+ ZEND_VM_TAIL_CALL(ZEND_FETCH_OBJ_R_SPEC_CV_CONST_INLINE_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
+}
+
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -39917,7 +39541,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_CONST_HAND
property = RT_CONSTANT(opline, opline->op2);
result = EX_VAR(opline->result.var);
- zend_fetch_property_address(result, container, IS_CV, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_W OPLINE_CC);
+ zend_fetch_property_address(
+ result, container, IS_CV, property, IS_CONST,
+ ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_FETCH_OBJ_FLAGS) : NULL),
+ BP_VAR_W, opline->extended_value & ZEND_FETCH_OBJ_FLAGS, 1 OPLINE_CC EXECUTE_DATA_CC);
if (IS_CV == IS_VAR) {
FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result);
@@ -39932,14 +39559,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_CV_CONST_HAN
zval *property, *container, *result;
SAVE_OPLINE();
- container = _get_zval_ptr_cv_BP_VAR_RW(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 = RT_CONSTANT(opline, opline->op2);
result = EX_VAR(opline->result.var);
- zend_fetch_property_address(result, container, IS_CV, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_RW OPLINE_CC);
+ zend_fetch_property_address(result, container, IS_CV, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_RW, 0, 1 OPLINE_CC EXECUTE_DATA_CC);
if (IS_CV == IS_VAR) {
FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result);
@@ -39974,7 +39601,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_CV_CONST_HAN
break;
}
}
- goto fetch_obj_is_no_object;
+ ZVAL_NULL(EX_VAR(opline->result.var));
+ goto fetch_obj_is_finish;
} while (0);
}
@@ -39992,8 +39620,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_CV_CONST_HAN
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;
+ if (0 || (IS_CV & (IS_TMP_VAR|IS_VAR)) != 0) {
+ goto fetch_obj_is_copy;
+ } else {
+fetch_obj_is_fast_copy:
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
+ ZEND_VM_NEXT_OPCODE();
+ }
}
} else if (EXPECTED(zobj->properties != NULL)) {
if (!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET(prop_offset)) {
@@ -40007,8 +39640,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_CV_CONST_HAN
(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;
+ retval = &p->val;
+ if (0 || (IS_CV & (IS_TMP_VAR|IS_VAR)) != 0) {
+ goto fetch_obj_is_copy;
+ } else {
+ goto fetch_obj_is_fast_copy;
+ }
}
}
CACHE_PTR_EX(cache_slot + 1, (void*)ZEND_DYNAMIC_PROPERTY_OFFSET);
@@ -40017,38 +39654,43 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_CV_CONST_HAN
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 (0 || (IS_CV & (IS_TMP_VAR|IS_VAR)) != 0) {
+ goto fetch_obj_is_copy;
+ } else {
+ goto fetch_obj_is_fast_copy;
+ }
}
}
}
}
- 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));
+ 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);
- }
+ if (retval != EX_VAR(opline->result.var)) {
+fetch_obj_is_copy:
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
+ } else if (UNEXPECTED(Z_ISREF_P(retval))) {
+ zend_unwrap_reference(retval);
}
} while (0);
+fetch_obj_is_finish:
+
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
+#if 0
+ USE_OPLINE
+#endif
+
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_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));
@@ -40062,7 +39704,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_CV_CONST_
zval *container, *property, *result;
SAVE_OPLINE();
- container = _get_zval_ptr_cv_BP_VAR_UNSET(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));
@@ -40070,7 +39712,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_CV_CONST_
property = RT_CONSTANT(opline, opline->op2);
result = EX_VAR(opline->result.var);
- zend_fetch_property_address(result, container, IS_CV, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_UNSET OPLINE_CC);
+ zend_fetch_property_address(result, container, IS_CV, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_UNSET, 0, 1 OPLINE_CC EXECUTE_DATA_CC);
if (IS_CV == IS_VAR) {
FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result);
@@ -40095,34 +39737,52 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA
value = RT_CONSTANT((opline+1), (opline+1)->op1);
if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
- if (Z_ISREF_P(object)) {
+ if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) {
object = Z_REFVAL_P(object);
- if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
- goto assign_object;
- }
+ goto assign_object;
}
- if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
-
- goto exit_assign_obj;
+ object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC);
+ if (UNEXPECTED(!object)) {
+ value = &EG(uninitialized_zval);
+ goto free_and_exit_assign_obj;
}
}
assign_object:
if (IS_CONST == IS_CONST &&
EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(opline->extended_value))) {
- uintptr_t prop_offset = (uintptr_t)CACHED_PTR(opline->extended_value + sizeof(void*));
+ void **cache_slot = CACHE_ADDR(opline->extended_value);
+ uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1);
zend_object *zobj = Z_OBJ_P(object);
zval *property_val;
if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
property_val = OBJ_PROP(zobj, prop_offset);
if (Z_TYPE_P(property_val) != IS_UNDEF) {
+ zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2);
+
+ if (UNEXPECTED(prop_info != NULL)) {
+ zend_uchar orig_type = IS_UNDEF;
+
+ if (IS_CONST == IS_CONST) {
+ orig_type = Z_TYPE_P(value);
+ }
+
+ value = zend_assign_to_typed_prop(prop_info, property_val, value EXECUTE_DATA_CC);
+
+ /* will remain valid, thus no need to check prop_info in future here */
+ if (IS_CONST == IS_CONST && Z_TYPE_P(value) == orig_type) {
+ CACHE_PTR_EX(cache_slot + 2, NULL);
+ }
+ goto free_and_exit_assign_obj;
+ } else {
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);
+ value = zend_assign_to_variable(property_val, value, IS_CONST, EX_USES_STRICT_TYPES());
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+ ZVAL_COPY(EX_VAR(opline->result.var), value);
+ }
+ goto exit_assign_obj;
}
- goto exit_assign_obj;
}
} else {
if (EXPECTED(zobj->properties != NULL)) {
@@ -40176,18 +39836,13 @@ fast_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_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL);
+ value = Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL);
+free_and_exit_assign_obj:
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
}
@@ -40199,6 +39854,7 @@ exit_assign_obj:
ZEND_VM_NEXT_OPCODE_EX(1, 2);
}
+/* No specialization for op_types (CONST|TMPVAR|CV, UNUSED|CONST|VAR) */
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DATA_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -40216,34 +39872,52 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA
value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
- if (Z_ISREF_P(object)) {
+ if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) {
object = Z_REFVAL_P(object);
- if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
- goto assign_object;
- }
+ goto assign_object;
}
- if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
- zval_ptr_dtor_nogc(free_op_data);
- goto exit_assign_obj;
+ object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC);
+ if (UNEXPECTED(!object)) {
+ value = &EG(uninitialized_zval);
+ goto free_and_exit_assign_obj;
}
}
assign_object:
if (IS_CONST == IS_CONST &&
EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(opline->extended_value))) {
- uintptr_t prop_offset = (uintptr_t)CACHED_PTR(opline->extended_value + sizeof(void*));
+ void **cache_slot = CACHE_ADDR(opline->extended_value);
+ uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1);
zend_object *zobj = Z_OBJ_P(object);
zval *property_val;
if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
property_val = OBJ_PROP(zobj, prop_offset);
if (Z_TYPE_P(property_val) != IS_UNDEF) {
+ zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2);
+
+ if (UNEXPECTED(prop_info != NULL)) {
+ zend_uchar orig_type = IS_UNDEF;
+
+ if (IS_TMP_VAR == IS_CONST) {
+ orig_type = Z_TYPE_P(value);
+ }
+
+ value = zend_assign_to_typed_prop(prop_info, property_val, value EXECUTE_DATA_CC);
+
+ /* will remain valid, thus no need to check prop_info in future here */
+ if (IS_TMP_VAR == IS_CONST && Z_TYPE_P(value) == orig_type) {
+ CACHE_PTR_EX(cache_slot + 2, NULL);
+ }
+ goto free_and_exit_assign_obj;
+ } else {
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);
+ value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES());
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+ ZVAL_COPY(EX_VAR(opline->result.var), value);
+ }
+ goto exit_assign_obj;
}
- goto exit_assign_obj;
}
} else {
if (EXPECTED(zobj->properties != NULL)) {
@@ -40297,18 +39971,13 @@ fast_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_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL);
+ value = Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL);
+free_and_exit_assign_obj:
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
}
@@ -40320,6 +39989,7 @@ exit_assign_obj:
ZEND_VM_NEXT_OPCODE_EX(1, 2);
}
+/* No specialization for op_types (CONST|TMPVAR|CV, UNUSED|CONST|VAR) */
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -40337,34 +40007,52 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA
value = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
- if (Z_ISREF_P(object)) {
+ if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) {
object = Z_REFVAL_P(object);
- if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
- goto assign_object;
- }
+ goto assign_object;
}
- if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
- zval_ptr_dtor_nogc(free_op_data);
- goto exit_assign_obj;
+ object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC);
+ if (UNEXPECTED(!object)) {
+ value = &EG(uninitialized_zval);
+ goto free_and_exit_assign_obj;
}
}
assign_object:
if (IS_CONST == IS_CONST &&
EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(opline->extended_value))) {
- uintptr_t prop_offset = (uintptr_t)CACHED_PTR(opline->extended_value + sizeof(void*));
+ void **cache_slot = CACHE_ADDR(opline->extended_value);
+ uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1);
zend_object *zobj = Z_OBJ_P(object);
zval *property_val;
if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
property_val = OBJ_PROP(zobj, prop_offset);
if (Z_TYPE_P(property_val) != IS_UNDEF) {
+ zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2);
+
+ if (UNEXPECTED(prop_info != NULL)) {
+ zend_uchar orig_type = IS_UNDEF;
+
+ if (IS_VAR == IS_CONST) {
+ orig_type = Z_TYPE_P(value);
+ }
+
+ value = zend_assign_to_typed_prop(prop_info, property_val, value EXECUTE_DATA_CC);
+
+ /* will remain valid, thus no need to check prop_info in future here */
+ if (IS_VAR == IS_CONST && Z_TYPE_P(value) == orig_type) {
+ CACHE_PTR_EX(cache_slot + 2, NULL);
+ }
+ goto free_and_exit_assign_obj;
+ } else {
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);
+ value = zend_assign_to_variable(property_val, value, IS_VAR, EX_USES_STRICT_TYPES());
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+ ZVAL_COPY(EX_VAR(opline->result.var), value);
+ }
+ goto exit_assign_obj;
}
- goto exit_assign_obj;
}
} else {
if (EXPECTED(zobj->properties != NULL)) {
@@ -40418,18 +40106,13 @@ fast_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_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL);
+ value = Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL);
+free_and_exit_assign_obj:
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
}
@@ -40441,6 +40124,7 @@ exit_assign_obj:
ZEND_VM_NEXT_OPCODE_EX(1, 2);
}
+/* No specialization for op_types (CONST|TMPVAR|CV, UNUSED|CONST|VAR) */
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -40458,34 +40142,52 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA
value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC);
if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
- if (Z_ISREF_P(object)) {
+ if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) {
object = Z_REFVAL_P(object);
- if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
- goto assign_object;
- }
+ goto assign_object;
}
- if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
-
- goto exit_assign_obj;
+ object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC);
+ if (UNEXPECTED(!object)) {
+ value = &EG(uninitialized_zval);
+ goto free_and_exit_assign_obj;
}
}
assign_object:
if (IS_CONST == IS_CONST &&
EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(opline->extended_value))) {
- uintptr_t prop_offset = (uintptr_t)CACHED_PTR(opline->extended_value + sizeof(void*));
+ void **cache_slot = CACHE_ADDR(opline->extended_value);
+ uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1);
zend_object *zobj = Z_OBJ_P(object);
zval *property_val;
if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
property_val = OBJ_PROP(zobj, prop_offset);
if (Z_TYPE_P(property_val) != IS_UNDEF) {
+ zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2);
+
+ if (UNEXPECTED(prop_info != NULL)) {
+ zend_uchar orig_type = IS_UNDEF;
+
+ if (IS_CV == IS_CONST) {
+ orig_type = Z_TYPE_P(value);
+ }
+
+ value = zend_assign_to_typed_prop(prop_info, property_val, value EXECUTE_DATA_CC);
+
+ /* will remain valid, thus no need to check prop_info in future here */
+ if (IS_CV == IS_CONST && Z_TYPE_P(value) == orig_type) {
+ CACHE_PTR_EX(cache_slot + 2, NULL);
+ }
+ goto free_and_exit_assign_obj;
+ } else {
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);
+ value = zend_assign_to_variable(property_val, value, IS_CV, EX_USES_STRICT_TYPES());
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+ ZVAL_COPY(EX_VAR(opline->result.var), value);
+ }
+ goto exit_assign_obj;
}
- goto exit_assign_obj;
}
} else {
if (EXPECTED(zobj->properties != NULL)) {
@@ -40539,18 +40241,13 @@ fast_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_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL);
+ value = Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL);
+free_and_exit_assign_obj:
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
}
@@ -40562,30 +40259,30 @@ exit_assign_obj:
ZEND_VM_NEXT_OPCODE_EX(1, 2);
}
+/* No specialization for op_types (CONST|TMPVAR|CV, UNUSED|CONST|VAR) */
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DATA_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zval *object_ptr;
+ zval *object_ptr, *orig_object_ptr;
zend_free_op free_op_data;
zval *value;
zval *variable_ptr;
zval *dim;
SAVE_OPLINE();
- object_ptr = EX_VAR(opline->op1.var);
+ orig_object_ptr = object_ptr = EX_VAR(opline->op1.var);
if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) {
try_assign_dim_array:
+ value = RT_CONSTANT((opline+1), (opline+1)->op1);
SEPARATE_ARRAY(object_ptr);
if (IS_CONST == 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) {
@@ -40614,8 +40311,7 @@ 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 = zend_assign_to_variable(variable_ptr, value, IS_CONST, EX_USES_STRICT_TYPES());
}
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
@@ -40640,9 +40336,7 @@ try_assign_dim_array:
if (IS_CONST == IS_UNUSED) {
zend_use_new_element_for_string();
-
UNDEF_RESULT();
- HANDLE_EXCEPTION();
} else {
dim = RT_CONSTANT(opline, opline->op2);
value = RT_CONSTANT((opline+1), (opline+1)->op1);
@@ -40650,8 +40344,16 @@ try_assign_dim_array:
}
} else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) {
- ZVAL_ARR(object_ptr, zend_new_array(8));
- goto try_assign_dim_array;
+ if (Z_ISREF_P(orig_object_ptr)
+ && ZEND_REF_HAS_TYPE_SOURCES(Z_REF_P(orig_object_ptr))
+ && !zend_verify_ref_array_assignable(Z_REF_P(orig_object_ptr))) {
+ dim = RT_CONSTANT(opline, opline->op2);
+
+ UNDEF_RESULT();
+ } else {
+ 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();
@@ -40676,26 +40378,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DA
{
USE_OPLINE
- zval *object_ptr;
+ zval *object_ptr, *orig_object_ptr;
zend_free_op free_op_data;
zval *value;
zval *variable_ptr;
zval *dim;
SAVE_OPLINE();
- object_ptr = EX_VAR(opline->op1.var);
+ orig_object_ptr = object_ptr = EX_VAR(opline->op1.var);
if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) {
try_assign_dim_array:
+ value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
SEPARATE_ARRAY(object_ptr);
if (IS_CONST == 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) {
@@ -40724,8 +40425,7 @@ 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 = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR, EX_USES_STRICT_TYPES());
}
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
@@ -40751,9 +40451,7 @@ try_assign_dim_array:
if (IS_CONST == IS_UNUSED) {
zend_use_new_element_for_string();
zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
-
UNDEF_RESULT();
- HANDLE_EXCEPTION();
} else {
dim = RT_CONSTANT(opline, opline->op2);
value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
@@ -40761,8 +40459,16 @@ try_assign_dim_array:
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;
+ if (Z_ISREF_P(orig_object_ptr)
+ && ZEND_REF_HAS_TYPE_SOURCES(Z_REF_P(orig_object_ptr))
+ && !zend_verify_ref_array_assignable(Z_REF_P(orig_object_ptr))) {
+ dim = RT_CONSTANT(opline, opline->op2);
+ zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
+ UNDEF_RESULT();
+ } else {
+ 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();
@@ -40787,26 +40493,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DA
{
USE_OPLINE
- zval *object_ptr;
+ zval *object_ptr, *orig_object_ptr;
zend_free_op free_op_data;
zval *value;
zval *variable_ptr;
zval *dim;
SAVE_OPLINE();
- object_ptr = EX_VAR(opline->op1.var);
+ orig_object_ptr = object_ptr = EX_VAR(opline->op1.var);
if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) {
try_assign_dim_array:
+ value = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
SEPARATE_ARRAY(object_ptr);
if (IS_CONST == 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) {
@@ -40835,8 +40540,7 @@ 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 = zend_assign_to_variable(variable_ptr, value, IS_VAR, EX_USES_STRICT_TYPES());
}
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
@@ -40862,9 +40566,7 @@ try_assign_dim_array:
if (IS_CONST == IS_UNUSED) {
zend_use_new_element_for_string();
zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
-
UNDEF_RESULT();
- HANDLE_EXCEPTION();
} else {
dim = RT_CONSTANT(opline, opline->op2);
value = _get_zval_ptr_var_deref((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
@@ -40872,8 +40574,16 @@ try_assign_dim_array:
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;
+ if (Z_ISREF_P(orig_object_ptr)
+ && ZEND_REF_HAS_TYPE_SOURCES(Z_REF_P(orig_object_ptr))
+ && !zend_verify_ref_array_assignable(Z_REF_P(orig_object_ptr))) {
+ dim = RT_CONSTANT(opline, opline->op2);
+ zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
+ UNDEF_RESULT();
+ } else {
+ 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();
@@ -40898,26 +40608,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DA
{
USE_OPLINE
- zval *object_ptr;
+ zval *object_ptr, *orig_object_ptr;
zend_free_op free_op_data;
zval *value;
zval *variable_ptr;
zval *dim;
SAVE_OPLINE();
- object_ptr = EX_VAR(opline->op1.var);
+ orig_object_ptr = object_ptr = EX_VAR(opline->op1.var);
if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) {
try_assign_dim_array:
+ value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC);
SEPARATE_ARRAY(object_ptr);
if (IS_CONST == 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) {
@@ -40946,8 +40655,7 @@ 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 = zend_assign_to_variable(variable_ptr, value, IS_CV, EX_USES_STRICT_TYPES());
}
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
@@ -40972,9 +40680,7 @@ try_assign_dim_array:
if (IS_CONST == IS_UNUSED) {
zend_use_new_element_for_string();
-
UNDEF_RESULT();
- HANDLE_EXCEPTION();
} else {
dim = RT_CONSTANT(opline, opline->op2);
value = _get_zval_ptr_cv_deref_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC);
@@ -40982,8 +40688,16 @@ try_assign_dim_array:
}
} else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) {
- ZVAL_ARR(object_ptr, zend_new_array(8));
- goto try_assign_dim_array;
+ if (Z_ISREF_P(orig_object_ptr)
+ && ZEND_REF_HAS_TYPE_SOURCES(Z_REF_P(orig_object_ptr))
+ && !zend_verify_ref_array_assignable(Z_REF_P(orig_object_ptr))) {
+ dim = RT_CONSTANT(opline, opline->op2);
+
+ UNDEF_RESULT();
+ } else {
+ 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();
@@ -41021,7 +40735,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SPEC_CV_CONST_RETVAL_UN
ZVAL_NULL(EX_VAR(opline->result.var));
}
} else {
- value = zend_assign_to_variable(variable_ptr, value, IS_CONST);
+ value = zend_assign_to_variable(variable_ptr, value, IS_CONST, EX_USES_STRICT_TYPES());
if (UNEXPECTED(0)) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
}
@@ -41049,7 +40763,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SPEC_CV_CONST_RETVAL_US
ZVAL_NULL(EX_VAR(opline->result.var));
}
} else {
- value = zend_assign_to_variable(variable_ptr, value, IS_CONST);
+ value = zend_assign_to_variable(variable_ptr, value, IS_CONST, EX_USES_STRICT_TYPES());
if (UNEXPECTED(1)) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
}
@@ -41060,6 +40774,90 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SPEC_CV_CONST_RETVAL_US
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op_data;
+ zval *property, *container, *value_ptr;
+
+ SAVE_OPLINE();
+
+ container = EX_VAR(opline->op1.var);
+
+ if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
+ ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
+ }
+
+ property = RT_CONSTANT(opline, opline->op2);
+
+ value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
+
+ if (1) {
+ if (IS_CV == IS_UNUSED) {
+ if (IS_CONST == IS_CONST) {
+ zend_assign_to_property_reference_this_const(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ } else {
+ zend_assign_to_property_reference_this_var(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ }
+ } else {
+ if (IS_CONST == IS_CONST) {
+ zend_assign_to_property_reference_var_const(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ } else {
+ zend_assign_to_property_reference_var_var(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ }
+ }
+ } else {
+ zend_assign_to_property_reference(container, IS_CV, property, IS_CONST, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ }
+
+
+ if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);};
+ ZEND_VM_NEXT_OPCODE_EX(1, 2);
+}
+
+/* No specialization for op_types (CONST|TMPVAR|CV, UNUSED|CONST|VAR) */
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+
+ zval *property, *container, *value_ptr;
+
+ SAVE_OPLINE();
+
+ container = EX_VAR(opline->op1.var);
+
+ if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
+ ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
+ }
+
+ property = RT_CONSTANT(opline, opline->op2);
+
+ value_ptr = _get_zval_ptr_cv_BP_VAR_W((opline+1)->op1.var EXECUTE_DATA_CC);
+
+ if (1) {
+ if (IS_CV == IS_UNUSED) {
+ if (IS_CONST == IS_CONST) {
+ zend_assign_to_property_reference_this_const(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ } else {
+ zend_assign_to_property_reference_this_var(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ }
+ } else {
+ if (IS_CONST == IS_CONST) {
+ zend_assign_to_property_reference_var_const(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ } else {
+ zend_assign_to_property_reference_var_var(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ }
+ }
+ } else {
+ zend_assign_to_property_reference(container, IS_CV, property, IS_CONST, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ }
+
+
+
+ ZEND_VM_NEXT_OPCODE_EX(1, 2);
+}
+
+/* No specialization for op_types (CONST|TMPVAR|CV, UNUSED|CONST|VAR) */
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FAST_CONCAT_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -41082,14 +40880,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FAST_CONCAT_SPEC_CV_CONST_HAND
} else {
ZVAL_STR(EX_VAR(opline->result.var), op2_str);
}
-
+ if (IS_CV & (IS_TMP_VAR|IS_VAR)) {
+ zend_string_release_ex(op1_str, 0);
+ }
} 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 {
ZVAL_STR(EX_VAR(opline->result.var), op1_str);
}
-
+ if (IS_CONST & (IS_TMP_VAR|IS_VAR)) {
+ zend_string_release_ex(op2_str, 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);
@@ -41097,14 +40899,20 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FAST_CONCAT_SPEC_CV_CONST_HAND
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);
-
+ if (IS_CONST & (IS_TMP_VAR|IS_VAR)) {
+ zend_string_release_ex(op2_str, 0);
+ }
} 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_TMP_VAR|IS_VAR)) {
+ zend_string_release_ex(op1_str, 0);
+ }
+ if (IS_CONST & (IS_TMP_VAR|IS_VAR)) {
+ zend_string_release_ex(op2_str, 0);
+ }
}
ZEND_VM_NEXT_OPCODE();
}
@@ -41116,7 +40924,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FAST_CONCAT_SPEC_CV_CONST_HAND
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);
+ ZVAL_UNDEFINED_OP1();
}
op1_str = zval_get_string_func(op1);
}
@@ -41126,7 +40934,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FAST_CONCAT_SPEC_CV_CONST_HAND
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);
+ ZVAL_UNDEFINED_OP2();
}
op2_str = zval_get_string_func(op2);
}
@@ -41204,7 +41012,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_S
break;
}
} else if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(function_name) == IS_UNDEF)) {
- GET_OP2_UNDEF_CV(function_name, BP_VAR_R);
+ ZVAL_UNDEFINED_OP2();
if (UNEXPECTED(EG(exception) != NULL)) {
HANDLE_EXCEPTION();
@@ -41227,7 +41035,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_S
}
}
if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
- object = GET_OP1_UNDEF_CV(object, BP_VAR_R);
+ object = ZVAL_UNDEFINED_OP1();
if (UNEXPECTED(EG(exception) != NULL)) {
if (IS_CONST != IS_CONST) {
@@ -41255,13 +41063,6 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_S
} else {
zend_object *orig_obj = obj;
- if (UNEXPECTED(obj->handlers->get_method == NULL)) {
- zend_throw_error(NULL, "Object does not support method calls");
-
-
- HANDLE_EXCEPTION();
- }
-
if (IS_CONST == IS_CONST) {
function_name = RT_CONSTANT(opline, opline->op2);
}
@@ -41286,7 +41087,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_S
/* Reset "object" to trigger reference counting */
object = NULL;
}
- if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
+ if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!RUN_TIME_CACHE(&fbc->op_array))) {
init_func_run_time_cache(&fbc->op_array);
}
}
@@ -41295,26 +41096,28 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_S
}
- call_info = ZEND_CALL_NESTED_FUNCTION;
+ call_info = ZEND_CALL_NESTED_FUNCTION | ZEND_CALL_HAS_THIS;
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();
}
+ /* call static method */
+ obj = (zend_object*)called_scope;
+ call_info = ZEND_CALL_NESTED_FUNCTION;
} 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;
if (IS_CV == IS_CV) {
GC_ADDREF(obj); /* For $this pointer */
} else if (free_op1 != object) {
GC_ADDREF(obj); /* For $this pointer */
}
+ /* CV may be changed indirectly (e.g. when it's a reference) */
+ call_info = ZEND_CALL_NESTED_FUNCTION | ZEND_CALL_HAS_THIS | ZEND_CALL_RELEASE_THIS;
}
call = zend_vm_stack_push_call_frame(call_info,
- fbc, opline->extended_value, called_scope, obj);
+ fbc, opline->extended_value, obj);
call->prev_execute_data = EX(call);
EX(call) = call;
@@ -41397,8 +41200,12 @@ num_index:
} else if (Z_TYPE_P(offset) == IS_TRUE) {
hval = 1;
goto num_index;
+ } else if (Z_TYPE_P(offset) == IS_RESOURCE) {
+ zend_use_resource_as_offset(offset);
+ hval = Z_RES_HANDLE_P(offset);
+ goto num_index;
} else if (IS_CONST == IS_CV && Z_TYPE_P(offset) == IS_UNDEF) {
- GET_OP2_UNDEF_CV(offset, BP_VAR_R);
+ ZVAL_UNDEFINED_OP2();
str = ZSTR_EMPTY_ALLOC();
goto str_index;
} else {
@@ -41431,65 +41238,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_CV_CONST_HANDL
}
ZEND_VM_TAIL_CALL(ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
} else {
- ZVAL_EMPTY_ARRAY(array);
+ ZVAL_ARR(array, zend_new_array(0));
ZEND_VM_NEXT_OPCODE();
}
}
-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 *varname;
- zend_string *name, *tmp_name;
- zend_class_entry *ce;
-
-
- SAVE_OPLINE();
-
- 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_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
- if (UNEXPECTED(ce == NULL)) {
- ZEND_ASSERT(EG(exception));
-
- HANDLE_EXCEPTION();
- }
- /*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));
-
- HANDLE_EXCEPTION();
- }
- } 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);
- }
-
- zend_std_unset_static_property(ce, 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_UNSET_DIM_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -41547,7 +41300,7 @@ num_index_dim:
hval = Z_RES_HANDLE_P(offset);
goto num_index_dim;
} else if (IS_CONST == IS_CV && Z_TYPE_P(offset) == IS_UNDEF) {
- GET_OP2_UNDEF_CV(offset, BP_VAR_R);
+ ZVAL_UNDEFINED_OP2();
key = ZSTR_EMPTY_ALLOC();
goto str_index_dim;
} else {
@@ -41561,20 +41314,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);
+ container = ZVAL_UNDEFINED_OP1();
}
if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(offset) == IS_UNDEF)) {
- offset = GET_OP2_UNDEF_CV(offset, BP_VAR_R);
+ offset = ZVAL_UNDEFINED_OP2();
}
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_CONST == IS_CONST && Z_EXTRA_P(offset) == ZEND_EXTRA_VALUE) {
- offset++;
- }
- Z_OBJ_HT_P(container)->unset_dimension(container, offset);
+ 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)) {
zend_throw_error(NULL, "Cannot unset string offsets");
}
@@ -41592,7 +41341,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_CV_CONST_HANDLE
zval *offset;
SAVE_OPLINE();
- container = _get_zval_ptr_cv_BP_VAR_UNSET(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));
}
@@ -41603,99 +41352,23 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_CV_CONST_HANDLE
if (Z_ISREF_P(container)) {
container = Z_REFVAL_P(container);
if (Z_TYPE_P(container) != IS_OBJECT) {
+ if (IS_CV == IS_CV
+ && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
+ ZVAL_UNDEFINED_OP1();
+ }
break;
}
} else {
break;
}
}
- if (Z_OBJ_HT_P(container)->unset_property) {
- Z_OBJ_HT_P(container)->unset_property(container, offset, ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL));
- } else {
- zend_wrong_property_unset(offset);
- }
+ Z_OBJ_HT_P(container)->unset_property(container, offset, ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL));
} while (0);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zval *value;
- int result;
-
- zval *varname;
- zend_string *name, *tmp_name;
- zend_class_entry *ce;
-
- SAVE_OPLINE();
- if (IS_CONST == IS_CONST) {
- if (IS_CV == IS_CONST && EXPECTED((ce = CACHED_PTR(opline->extended_value & ~ZEND_ISEMPTY)) != NULL)) {
- value = CACHED_PTR((opline->extended_value & ~ZEND_ISEMPTY) + sizeof(void*));
- goto is_static_prop_return;
- } else if (UNEXPECTED((ce = CACHED_PTR(opline->extended_value & ~ZEND_ISEMPTY)) == NULL)) {
- ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op2)), RT_CONSTANT(opline, opline->op2) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
- if (UNEXPECTED(ce == NULL)) {
- ZEND_ASSERT(EG(exception));
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
- }
- if (IS_CV != IS_CONST) {
- CACHE_PTR(opline->extended_value & ~ZEND_ISEMPTY, ce);
- }
- }
- } else {
- if (IS_CONST == IS_UNUSED) {
- ce = zend_fetch_class(NULL, opline->op2.num);
- if (UNEXPECTED(ce == NULL)) {
- ZEND_ASSERT(EG(exception));
-
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
- }
- } else {
- ce = Z_CE_P(EX_VAR(opline->op2.var));
- }
- if (IS_CV == IS_CONST &&
- EXPECTED(CACHED_PTR(opline->extended_value & ~ZEND_ISEMPTY) == ce)) {
-
- value = CACHED_PTR((opline->extended_value & ~ZEND_ISEMPTY) + sizeof(void*));
- goto is_static_prop_return;
- }
- }
-
- varname = _get_zval_ptr_cv_BP_VAR_IS(opline->op1.var EXECUTE_DATA_CC);
- if (IS_CV == IS_CONST) {
- name = Z_STR_P(varname);
- } else {
- name = zval_get_tmp_string(varname, &tmp_name);
- }
-
- value = zend_std_get_static_property(ce, name, 1);
-
- if (IS_CV == IS_CONST && value) {
- CACHE_POLYMORPHIC_PTR(opline->extended_value & ~ZEND_ISEMPTY, ce, value);
- }
-
- if (IS_CV != IS_CONST) {
- zend_tmp_string_release(tmp_name);
- }
-
-is_static_prop_return:
- if (!(opline->extended_value & ZEND_ISEMPTY)) {
- result = value && Z_TYPE_P(value) > IS_NULL &&
- (!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_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -41740,6 +41413,14 @@ num_index_prop:
/* > 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);
+
+ if (IS_CV & (IS_CONST|IS_CV)) {
+ /* avoid exception check */
+
+ ZEND_VM_SMART_BRANCH(result, 0);
+ ZVAL_BOOL(EX_VAR(opline->result.var), result);
+ ZEND_VM_NEXT_OPCODE();
+ }
} else {
result = (value == NULL || !i_zend_is_true(value));
}
@@ -41790,21 +41471,20 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CV
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;
+ result = (opline->extended_value & ZEND_ISEMPTY);
+ goto isset_object_finish;
}
} else {
- goto isset_no_object;
+ result = (opline->extended_value & ZEND_ISEMPTY);
+ goto isset_object_finish;
}
}
- 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));
- }
+
+ 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));
+
+isset_object_finish:
ZEND_VM_SMART_BRANCH(result, 1);
@@ -41812,6 +41492,41 @@ isset_no_object:
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ARRAY_KEY_EXISTS_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+
+
+ zval *key, *subject;
+ HashTable *ht;
+ uint32_t result;
+
+ SAVE_OPLINE();
+
+ key = EX_VAR(opline->op1.var);
+ subject = RT_CONSTANT(opline, opline->op2);
+
+ if (EXPECTED(Z_TYPE_P(subject) == IS_ARRAY)) {
+array_key_exists_array:
+ ht = Z_ARRVAL_P(subject);
+ result = zend_array_key_exists_fast(ht, key OPLINE_CC EXECUTE_DATA_CC);
+ } else {
+ if ((IS_CONST & (IS_VAR|IS_CV)) && EXPECTED(Z_ISREF_P(subject))) {
+ subject = Z_REFVAL_P(subject);
+ if (EXPECTED(Z_TYPE_P(subject) == IS_ARRAY)) {
+ goto array_key_exists_array;
+ }
+ }
+ result = zend_array_key_exists_slow(subject, key OPLINE_CC EXECUTE_DATA_CC);
+ }
+
+
+ ZEND_VM_SMART_BRANCH(result == IS_TRUE, 1);
+ Z_TYPE_INFO_P(EX_VAR(opline->result.var)) = result;
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+}
+
+/* No specialization for op_types (CONST|TMPVAR|UNUSED|CV, ANY) */
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INSTANCEOF_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -41829,7 +41544,7 @@ try_instanceof:
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);
+ ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op2)), Z_STR_P(RT_CONSTANT(opline, opline->op2) + 1), ZEND_FETCH_CLASS_NO_AUTOLOAD);
if (EXPECTED(ce)) {
CACHE_PTR(opline->extended_value, ce);
}
@@ -41851,7 +41566,7 @@ try_instanceof:
goto try_instanceof;
} else {
if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(expr) == IS_UNDEF)) {
- GET_OP1_UNDEF_CV(expr, BP_VAR_R);
+ ZVAL_UNDEFINED_OP1();
}
result = 0;
}
@@ -41902,20 +41617,23 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_CV_CONST_HANDLER(ZE
/* 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 {
+ do {
+ if (IS_CV == IS_VAR) {
+ ZEND_ASSERT(value_ptr != &EG(uninitialized_zval));
+ if (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);
+ break;
+ }
+ }
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));
- }
+ } while (0);
}
} else {
@@ -42002,7 +41720,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BIND_GLOBAL_SPEC_C
{
USE_OPLINE
- zval *varname;
+ zend_string *varname;
zval *value;
zval *variable_ptr;
uintptr_t idx;
@@ -42010,7 +41728,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BIND_GLOBAL_SPEC_C
ZEND_VM_REPEATABLE_OPCODE
- varname = RT_CONSTANT(opline, opline->op2);
+ varname = Z_STR_P(RT_CONSTANT(opline, opline->op2));
/* We store "hash slot index" + 1 (NULL is a mark of uninitialized cache slot) */
idx = (uintptr_t)CACHED_PTR(opline->extended_value) - 1;
@@ -42018,19 +41736,19 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BIND_GLOBAL_SPEC_C
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 == varname) ||
+ (EXPECTED(p->h == ZSTR_H(varname)) &&
EXPECTED(p->key != NULL) &&
- EXPECTED(zend_string_equal_content(p->key, Z_STR_P(varname)))))) {
+ EXPECTED(zend_string_equal_content(p->key, varname))))) {
value = (zval*)p; /* value = &p->val; */
goto check_indirect;
}
}
- value = zend_hash_find_ex(&EG(symbol_table), Z_STR_P(varname), 1);
+ value = zend_hash_find_ex(&EG(symbol_table), varname, 1);
if (UNEXPECTED(value == NULL)) {
- value = zend_hash_add_new(&EG(symbol_table), Z_STR_P(varname), &EG(uninitialized_zval));
+ value = zend_hash_add_new(&EG(symbol_table), varname, &EG(uninitialized_zval));
idx = (char*)value - (char*)EG(symbol_table).arData;
/* Store "hash slot index" + 1 (NULL is a mark of uninitialized cache slot) */
CACHE_PTR(opline->extended_value, (void*)(idx + 1));
@@ -42081,92 +41799,43 @@ check_indirect:
ZEND_VM_NEXT_OPCODE();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BIND_STATIC_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
-
- HashTable *ht;
- zval *value;
- zval *variable_ptr;
-
- 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_DELREF(ht);
- }
- EX(func)->op_array.static_variables = ht = zend_array_dup(ht);
- }
-
- value = (zval*)((char*)ht->arData + (opline->extended_value & ~ZEND_BIND_REF));
-
- 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);
- HANDLE_EXCEPTION();
- }
- }
- if (UNEXPECTED(!Z_ISREF_P(value))) {
- zend_reference *ref = (zend_reference*)emalloc(sizeof(zend_reference));
- GC_SET_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_REF(variable_ptr, ref);
- } else {
- Z_ADDREF_P(value);
- ZVAL_REF(variable_ptr, Z_REF_P(value));
- }
- } else {
- ZVAL_COPY(variable_ptr, value);
- }
-
- ZEND_VM_NEXT_OPCODE();
-}
-
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(RT_CONSTANT(opline, opline->op2));
- int result;
+ zval *result;
SAVE_OPLINE();
op1 = _get_zval_ptr_cv_deref_BP_VAR_R(opline->op1.var EXECUTE_DATA_CC);
if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
- result = zend_hash_exists(ht, Z_STR_P(op1));
+ result = zend_hash_find_ex(ht, Z_STR_P(op1), IS_CV == IS_CONST);
} else if (opline->extended_value) {
if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
- result = zend_hash_index_exists(ht, Z_LVAL_P(op1));
+ result = zend_hash_index_find(ht, Z_LVAL_P(op1));
} else {
- result = 0;
+ result = NULL;
}
} else if (Z_TYPE_P(op1) <= IS_FALSE) {
- result = zend_hash_exists(ht, ZSTR_EMPTY_ALLOC());
+ result = zend_hash_find_ex(ht, ZSTR_EMPTY_ALLOC(), 1);
} else {
zend_string *key;
- zval key_tmp, result_tmp;
+ zval key_tmp, result_tmp, *val;
- result = 0;
- ZEND_HASH_FOREACH_STR_KEY(ht, key) {
+ result = NULL;
+ ZEND_HASH_FOREACH_STR_KEY_VAL(ht, key, val) {
ZVAL_STR(&key_tmp, key);
compare_function(&result_tmp, op1, &key_tmp);
if (Z_LVAL(result_tmp) == 0) {
- result = 1;
+ result = val;
break;
}
} ZEND_HASH_FOREACH_END();
}
ZEND_VM_SMART_BRANCH(result, 1);
- ZVAL_BOOL(EX_VAR(opline->result.var), result);
+ ZVAL_BOOL(EX_VAR(opline->result.var), result != NULL);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
@@ -42276,138 +41945,6 @@ fetch_dim_r_index_undef:
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-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 = 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);
- 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_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);
-
- zval_ptr_dtor_nogc(free_op2);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
-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 = 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);
- 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_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();
-}
-
-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 = 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;
-
- 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_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();
-}
-
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DIV_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -42423,98 +41960,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DIV_SPEC_CV_TMPVAR_HANDLER(ZEN
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-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 = 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)) {
- 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_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);
- }
- 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)
-{
- USE_OPLINE
- zend_free_op free_op2;
- zval *op1, *op2;
-
- 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)) {
- 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();
-}
-
-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 = 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)) {
- 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);
-
- zval_ptr_dtor_nogc(free_op2);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POW_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -42551,14 +41996,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CONCAT_SPEC_CV_TMPVAR_HANDLER(
} else {
ZVAL_STR(EX_VAR(opline->result.var), op2_str);
}
-
+ if (IS_CV & (IS_TMP_VAR|IS_VAR)) {
+ zend_string_release_ex(op1_str, 0);
+ }
} 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 {
ZVAL_STR(EX_VAR(opline->result.var), op1_str);
}
- zval_ptr_dtor_nogc(free_op2);
+ if ((IS_TMP_VAR|IS_VAR) & (IS_TMP_VAR|IS_VAR)) {
+ zend_string_release_ex(op2_str, 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);
@@ -42566,24 +42015,30 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CONCAT_SPEC_CV_TMPVAR_HANDLER(
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);
+ if ((IS_TMP_VAR|IS_VAR) & (IS_TMP_VAR|IS_VAR)) {
+ zend_string_release_ex(op2_str, 0);
+ }
} 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);
+ if (IS_CV & (IS_TMP_VAR|IS_VAR)) {
+ zend_string_release_ex(op1_str, 0);
+ }
+ if ((IS_TMP_VAR|IS_VAR) & (IS_TMP_VAR|IS_VAR)) {
+ zend_string_release_ex(op2_str, 0);
+ }
}
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);
+ op1 = ZVAL_UNDEFINED_OP1();
}
if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
- op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
+ op2 = ZVAL_UNDEFINED_OP2();
}
concat_function(EX_VAR(opline->result.var), op1, op2);
@@ -42596,309 +42051,390 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_CV_TMPVAR_HANDLE
{
USE_OPLINE
zend_free_op free_op2;
- zval *op1, *op2, *result;
+ zval *op1, *op2;
+ double d1, d2;
op1 = EX_VAR(opline->op1.var);
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));
+ if (1 && IS_CV == IS_CONST && (IS_TMP_VAR|IS_VAR) == IS_CONST) {
+ /* pass */
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_LVAL_P(op1) == Z_LVAL_P(op2))) {
+is_equal_true:
+
+ ZVAL_TRUE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
} else {
- break;
+is_equal_false:
+
+ ZVAL_FALSE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
}
- } 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 if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ d1 = (double)Z_LVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+ goto is_equal_double;
+ }
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+is_equal_double:
+ if (d1 == d2) {
+ goto is_equal_true;
} else {
- break;
+ goto is_equal_false;
}
- } 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 if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = (double)Z_LVAL_P(op2);
+ goto is_equal_double;
+ }
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
+ if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
+ int result = zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2));
+ if (IS_CV & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_str(op1);
+ }
+ if ((IS_TMP_VAR|IS_VAR) & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_str(op2);
+ }
+ if (result) {
+ goto is_equal_true;
} else {
- break;
+ goto is_equal_false;
}
- } 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_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();
+ ZEND_VM_TAIL_CALL(zend_is_equal_helper_SPEC(op1, op2 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-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_IS_EQUAL_SPEC_CV_TMPVAR_JMPZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zend_free_op free_op2;
- zval *op1, *op2, *result;
+ zval *op1, *op2;
+ double d1, d2;
op1 = EX_VAR(opline->op1.var);
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));
+ if (1 && IS_CV == IS_CONST && (IS_TMP_VAR|IS_VAR) == IS_CONST) {
+ /* pass */
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_LVAL_P(op1) == Z_LVAL_P(op2))) {
+is_equal_true:
+ ZEND_VM_SMART_BRANCH_TRUE_JMPZ();
+ ZVAL_TRUE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
} else {
- break;
+is_equal_false:
+ ZEND_VM_SMART_BRANCH_FALSE_JMPZ();
+ ZVAL_FALSE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
}
- } 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 if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ d1 = (double)Z_LVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+ goto is_equal_double;
+ }
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+is_equal_double:
+ if (d1 == d2) {
+ goto is_equal_true;
} else {
- break;
+ goto is_equal_false;
}
- } 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 if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = (double)Z_LVAL_P(op2);
+ goto is_equal_double;
+ }
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
+ if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
+ int result = zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2));
+ if (IS_CV & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_str(op1);
+ }
+ if ((IS_TMP_VAR|IS_VAR) & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_str(op2);
+ }
+ if (result) {
+ goto is_equal_true;
} else {
- break;
+ goto is_equal_false;
}
- } 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_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();
+ ZEND_VM_TAIL_CALL(zend_is_equal_helper_SPEC(op1, op2 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_CV_TMPVAR_JMPNZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zend_free_op free_op2;
- zval *op1, *op2, *result;
+ zval *op1, *op2;
+ double d1, d2;
op1 = EX_VAR(opline->op1.var);
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));
+ if (1 && IS_CV == IS_CONST && (IS_TMP_VAR|IS_VAR) == IS_CONST) {
+ /* pass */
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_LVAL_P(op1) == Z_LVAL_P(op2))) {
+is_equal_true:
+ ZEND_VM_SMART_BRANCH_TRUE_JMPNZ();
+ ZVAL_TRUE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
} else {
- break;
+is_equal_false:
+ ZEND_VM_SMART_BRANCH_FALSE_JMPNZ();
+ ZVAL_FALSE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
}
- } 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 if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ d1 = (double)Z_LVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+ goto is_equal_double;
+ }
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+is_equal_double:
+ if (d1 == d2) {
+ goto is_equal_true;
} else {
- break;
+ goto is_equal_false;
+ }
+ } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = (double)Z_LVAL_P(op2);
+ goto is_equal_double;
+ }
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
+ if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
+ int result = zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2));
+ if (IS_CV & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_str(op1);
+ }
+ if ((IS_TMP_VAR|IS_VAR) & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_str(op2);
+ }
+ if (result) {
+ goto is_equal_true;
+ } else {
+ goto is_equal_false;
}
- } 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_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();
+ ZEND_VM_TAIL_CALL(zend_is_equal_helper_SPEC(op1, op2 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-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_IS_NOT_EQUAL_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zend_free_op free_op2;
- zval *op1, *op2, *result;
+ zval *op1, *op2;
+ double d1, d2;
op1 = EX_VAR(opline->op1.var);
op2 = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
- do {
- int result;
+ if (1 && IS_CV == IS_CONST && (IS_TMP_VAR|IS_VAR) == IS_CONST) {
+ /* pass */
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_LVAL_P(op1) != Z_LVAL_P(op2))) {
+is_not_equal_true:
+
+ ZVAL_TRUE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
+ } else {
+is_not_equal_false:
- 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));
+ ZVAL_FALSE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
+ }
+ } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ d1 = (double)Z_LVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+ goto is_not_equal_double;
+ }
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+is_not_equal_double:
+ if (d1 != d2) {
+ goto is_not_equal_true;
} else {
- break;
+ goto is_not_equal_false;
}
- } 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 if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = (double)Z_LVAL_P(op2);
+ goto is_not_equal_double;
+ }
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
+ if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
+ int result = zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2));
+ if (IS_CV & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_str(op1);
+ }
+ if ((IS_TMP_VAR|IS_VAR) & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_str(op2);
+ }
+ if (!result) {
+ goto is_not_equal_true;
} else {
- break;
+ goto is_not_equal_false;
}
- } 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_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_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();
+ ZEND_VM_TAIL_CALL(zend_is_not_equal_helper_SPEC(op1, op2 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BW_OR_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_CV_TMPVAR_JMPZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zend_free_op free_op2;
zval *op1, *op2;
+ double d1, d2;
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));
- 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);
+ if (1 && IS_CV == IS_CONST && (IS_TMP_VAR|IS_VAR) == IS_CONST) {
+ /* pass */
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_LVAL_P(op1) != Z_LVAL_P(op2))) {
+is_not_equal_true:
+ ZEND_VM_SMART_BRANCH_TRUE_JMPZ();
+ ZVAL_TRUE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
+ } else {
+is_not_equal_false:
+ ZEND_VM_SMART_BRANCH_FALSE_JMPZ();
+ ZVAL_FALSE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
+ }
+ } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ d1 = (double)Z_LVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+ goto is_not_equal_double;
+ }
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+is_not_equal_double:
+ if (d1 != d2) {
+ goto is_not_equal_true;
+ } else {
+ goto is_not_equal_false;
+ }
+ } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = (double)Z_LVAL_P(op2);
+ goto is_not_equal_double;
+ }
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
+ if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
+ int result = zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2));
+ if (IS_CV & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_str(op1);
+ }
+ if ((IS_TMP_VAR|IS_VAR) & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_str(op2);
+ }
+ if (!result) {
+ goto is_not_equal_true;
+ } else {
+ goto is_not_equal_false;
+ }
+ }
}
- bitwise_or_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_is_not_equal_helper_SPEC(op1, op2 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-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_IS_NOT_EQUAL_SPEC_CV_TMPVAR_JMPNZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zend_free_op free_op2;
zval *op1, *op2;
+ double d1, d2;
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));
- 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);
+ if (1 && IS_CV == IS_CONST && (IS_TMP_VAR|IS_VAR) == IS_CONST) {
+ /* pass */
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_LVAL_P(op1) != Z_LVAL_P(op2))) {
+is_not_equal_true:
+ ZEND_VM_SMART_BRANCH_TRUE_JMPNZ();
+ ZVAL_TRUE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
+ } else {
+is_not_equal_false:
+ ZEND_VM_SMART_BRANCH_FALSE_JMPNZ();
+ ZVAL_FALSE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
+ }
+ } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ d1 = (double)Z_LVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+ goto is_not_equal_double;
+ }
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+is_not_equal_double:
+ if (d1 != d2) {
+ goto is_not_equal_true;
+ } else {
+ goto is_not_equal_false;
+ }
+ } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = (double)Z_LVAL_P(op2);
+ goto is_not_equal_double;
+ }
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
+ if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
+ int result = zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2));
+ if (IS_CV & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_str(op1);
+ }
+ if ((IS_TMP_VAR|IS_VAR) & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_str(op2);
+ }
+ if (!result) {
+ goto is_not_equal_true;
+ } else {
+ goto is_not_equal_false;
+ }
+ }
}
- bitwise_and_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_is_not_equal_helper_SPEC(op1, op2 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-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_SPACESHIP_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zend_free_op free_op2;
zval *op1, *op2;
- 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));
- 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);
- }
- bitwise_xor_function(EX_VAR(opline->result.var), op1, op2);
+ 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();
@@ -42919,17 +42455,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BOOL_XOR_SPEC_CV_TMPVAR_HANDLE
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)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_OP_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zend_free_op free_op2, free_op_data1;
+ zend_free_op free_op2, free_op_data;
zval *object;
zval *property;
zval *value;
zval *zptr;
+ void **cache_slot;
+ zend_property_info *prop_info;
SAVE_OPLINE();
- object = _get_zval_ptr_cv_BP_VAR_RW(opline->op1.var EXECUTE_DATA_CC);
+ 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));
@@ -42938,49 +42476,76 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP
property = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
do {
- value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data1);
+ value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data);
if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
- if (Z_ISREF_P(object)) {
+ if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) {
object = Z_REFVAL_P(object);
- if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
- goto assign_op_object;
- }
+ goto assign_op_object;
+ }
+ if (IS_CV == IS_CV
+ && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
+ ZVAL_UNDEFINED_OP1();
}
- if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
+ object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC);
+ if (UNEXPECTED(!object)) {
break;
}
}
- /* here we are sure we are dealing with an object */
assign_op_object:
- if (EXPECTED(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)) {
+ /* here we are sure we are dealing with an object */
+ cache_slot = ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR((opline+1)->extended_value) : NULL;
+ if (EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, cache_slot)) != NULL)) {
if (UNEXPECTED(Z_ISERROR_P(zptr))) {
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_NULL(EX_VAR(opline->result.var));
}
} else {
- ZVAL_DEREF(zptr);
+ zval *orig_zptr = zptr;
+ zend_reference *ref;
+
+ do {
+ if (UNEXPECTED(Z_ISREF_P(zptr))) {
+ ref = Z_REF_P(zptr);
+ zptr = Z_REFVAL_P(zptr);
+ if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) {
+ zend_binary_assign_op_typed_ref(ref, value OPLINE_CC EXECUTE_DATA_CC);
+ break;
+ }
+ }
+
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
+ prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2);
+ } else {
+ prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(object), orig_zptr);
+ }
+ if (UNEXPECTED(prop_info)) {
+ /* special case for typed properties */
+ zend_binary_assign_op_typed_prop(prop_info, zptr, value OPLINE_CC EXECUTE_DATA_CC);
+ } else {
+ zend_binary_op(zptr, zptr, value OPLINE_CC);
+ }
+ } while (0);
- binary_op(zptr, zptr, value);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), zptr);
}
}
} else {
- zend_assign_op_overloaded_property(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR((opline+1)->extended_value) : NULL), value, binary_op OPLINE_CC EXECUTE_DATA_CC);
+ zend_assign_op_overloaded_property(object, property, cache_slot, value OPLINE_CC EXECUTE_DATA_CC);
}
} while (0);
- FREE_OP(free_op_data1);
+ FREE_OP(free_op_data);
zval_ptr_dtor_nogc(free_op2);
/* assign_obj has two opcodes! */
ZEND_VM_NEXT_OPCODE_EX(1, 2);
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SPEC_CV_TMPVAR(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC)
+/* No specialization for op_types (CONST|TMP|VAR|CV, UNUSED|CONST|TMPVAR) */
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_OP_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zend_free_op free_op2, free_op_data1;
@@ -43010,68 +42575,62 @@ assign_dim_op_new_array:
if (UNEXPECTED(!var_ptr)) {
goto assign_dim_op_ret_null;
}
- ZVAL_DEREF(var_ptr);
}
value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data1);
- binary_op(var_ptr, var_ptr, value);
+ do {
+ if ((IS_TMP_VAR|IS_VAR) != IS_UNUSED && UNEXPECTED(Z_ISREF_P(var_ptr))) {
+ zend_reference *ref = Z_REF_P(var_ptr);
+ var_ptr = Z_REFVAL_P(var_ptr);
+ if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) {
+ zend_binary_assign_op_typed_ref(ref, value OPLINE_CC EXECUTE_DATA_CC);
+ break;
+ }
+ }
+ zend_binary_op(var_ptr, var_ptr, value OPLINE_CC);
+ } while (0);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);
}
+ FREE_OP(free_op_data1);
} 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_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);
+ zend_binary_assign_op_obj_dim(container, dim OPLINE_CC EXECUTE_DATA_CC);
+ } else if (EXPECTED(Z_TYPE_P(container) <= IS_FALSE)) {
+ if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(container) == IS_UNDEF)) {
+ ZVAL_UNDEFINED_OP1();
+ }
+ ZVAL_ARR(container, zend_new_array(8));
+ goto assign_dim_op_new_array;
} 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_CV != IS_VAR || EXPECTED(!Z_ISERROR_P(container)))) {
- zend_use_scalar_as_array();
- }
+ zend_binary_assign_op_dim_slow(container, dim OPLINE_CC EXECUTE_DATA_CC);
assign_dim_op_ret_null:
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
+ 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);
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)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OP_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zend_free_op free_op2;
@@ -43087,9 +42646,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_simple_helper
ZVAL_NULL(EX_VAR(opline->result.var));
}
} else {
- ZVAL_DEREF(var_ptr);
-
- binary_op(var_ptr, var_ptr, value);
+ do {
+ if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) {
+ zend_reference *ref = Z_REF_P(var_ptr);
+ var_ptr = Z_REFVAL_P(var_ptr);
+ if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) {
+ zend_binary_assign_op_typed_ref(ref, value OPLINE_CC EXECUTE_DATA_CC);
+ break;
+ }
+ }
+ zend_binary_op(var_ptr, var_ptr, value OPLINE_CC);
+ } while (0);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);
@@ -43101,265 +42668,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_simple_helper
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
-# 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_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)
-{
-#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_TMPVAR(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
-# if 0
- /* opline->extended_value checks are specialized, don't need opline */
- USE_OPLINE
-# endif
-
- if (EXPECTED(0)) {
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_simple_helper_SPEC_CV_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
- }
- if (EXPECTED(0)) {
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CV_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
- }
-# 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_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)
-{
- 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_TMPVAR_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));
-}
-
-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_TMPVAR_OBJ(bitwise_or_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_AND_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR(bitwise_and_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-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_TMPVAR_DIM(bitwise_and_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)
-{
- 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_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR(bitwise_xor_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-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_TMPVAR_DIM(bitwise_xor_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)
-{
- 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_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR(pow_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
-}
-
-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_TMPVAR_DIM(pow_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)
-{
- 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_TMPVAR(int inc ZEND_OPCODE_HANDLER_ARGS_DC)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_OBJ_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zend_free_op free_op2;
zval *object;
zval *property;
zval *zptr;
+ void **cache_slot;
+ zend_property_info *prop_info;
SAVE_OPLINE();
- object = _get_zval_ptr_cv_BP_VAR_RW(opline->op1.var EXECUTE_DATA_CC);
+ 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));
@@ -43369,47 +42689,38 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE
do {
if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
- if (Z_ISREF_P(object)) {
+ if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) {
object = Z_REFVAL_P(object);
- if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
- goto pre_incdec_object;
- }
+ goto pre_incdec_object;
}
- if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
+ if (IS_CV == IS_CV
+ && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
+ ZVAL_UNDEFINED_OP1();
+ }
+ object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC);
+ if (UNEXPECTED(!object)) {
break;
}
}
- /* here we are sure we are dealing with an object */
pre_incdec_object:
- if (EXPECTED(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)) {
+ /* here we are sure we are dealing with an object */
+ cache_slot = ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL;
+ if (EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, cache_slot)) != NULL)) {
if (UNEXPECTED(Z_ISERROR_P(zptr))) {
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_NULL(EX_VAR(opline->result.var));
}
} else {
- if (EXPECTED(Z_TYPE_P(zptr) == IS_LONG)) {
- if (inc) {
- fast_long_increment_function(zptr);
- } else {
- fast_long_decrement_function(zptr);
- }
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
+ prop_info = (zend_property_info *) CACHED_PTR_EX(cache_slot + 2);
} else {
- ZVAL_DEREF(zptr);
-
- if (inc) {
- increment_function(zptr);
- } else {
- decrement_function(zptr);
- }
- }
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY(EX_VAR(opline->result.var), zptr);
+ prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(object), zptr);
}
+ zend_pre_incdec_property_zval(zptr, prop_info OPLINE_CC EXECUTE_DATA_CC);
}
} else {
- zend_pre_incdec_overloaded_property(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), inc OPLINE_CC EXECUTE_DATA_CC);
+ zend_pre_incdec_overloaded_property(object, property, cache_slot OPLINE_CC EXECUTE_DATA_CC);
}
} while (0);
@@ -43418,26 +42729,18 @@ pre_incdec_object:
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)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_OBJ_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zend_free_op free_op2;
zval *object;
zval *property;
zval *zptr;
+ void **cache_slot;
+ zend_property_info *prop_info;
SAVE_OPLINE();
- object = _get_zval_ptr_cv_BP_VAR_RW(opline->op1.var EXECUTE_DATA_CC);
+ 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));
@@ -43447,43 +42750,37 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP
do {
if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
- if (Z_ISREF_P(object)) {
+ if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) {
object = Z_REFVAL_P(object);
- if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
- goto post_incdec_object;
- }
+ goto post_incdec_object;
+ }
+ if (IS_CV == IS_CV
+ && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
+ ZVAL_UNDEFINED_OP1();
}
- if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
+ object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC);
+ if (UNEXPECTED(!object)) {
break;
}
}
- /* here we are sure we are dealing with an object */
post_incdec_object:
- if (EXPECTED(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)) {
+ /* here we are sure we are dealing with an object */
+ cache_slot = ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL;
+ if (EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, cache_slot)) != NULL)) {
if (UNEXPECTED(Z_ISERROR_P(zptr))) {
ZVAL_NULL(EX_VAR(opline->result.var));
} else {
- if (EXPECTED(Z_TYPE_P(zptr) == IS_LONG)) {
- ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(zptr));
- if (inc) {
- fast_long_increment_function(zptr);
- } else {
- fast_long_decrement_function(zptr);
- }
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
+ prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2);
} else {
- ZVAL_DEREF(zptr);
- ZVAL_COPY(EX_VAR(opline->result.var), zptr);
- if (inc) {
- increment_function(zptr);
- } else {
- decrement_function(zptr);
- }
+ prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(object), zptr);
}
+
+ zend_post_incdec_property_zval(zptr, prop_info OPLINE_CC EXECUTE_DATA_CC);
}
} else {
- zend_post_incdec_overloaded_property(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), inc OPLINE_CC EXECUTE_DATA_CC);
+ zend_post_incdec_overloaded_property(object, property, cache_slot OPLINE_CC EXECUTE_DATA_CC);
}
} while (0);
@@ -43492,21 +42789,11 @@ post_incdec_object:
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));
-}
-
-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;
+ zval *container, *dim, *value;
SAVE_OPLINE();
container = EX_VAR(opline->op1.var);
@@ -43515,8 +42802,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_R_SPEC_CV_TMPVAR_HAN
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);
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value);
} else if (EXPECTED(Z_TYPE_P(container) == IS_REFERENCE)) {
container = Z_REFVAL_P(container);
if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
@@ -43589,6 +42875,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_IS_SPEC_CV_TMPVAR_HA
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
+#if 0
+ USE_OPLINE
+#endif
+
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));
@@ -43647,12 +42937,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_TMPVAR_HAN
}
}
if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
- GET_OP1_UNDEF_CV(container, BP_VAR_R);
+ ZVAL_UNDEFINED_OP1();
}
if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(offset) == IS_UNDEF)) {
- GET_OP2_UNDEF_CV(offset, BP_VAR_R);
+ ZVAL_UNDEFINED_OP2();
}
- goto fetch_obj_r_no_object;
+ zend_wrong_property_read(offset);
+ ZVAL_NULL(EX_VAR(opline->result.var));
+ goto fetch_obj_r_finish;
} while (0);
}
@@ -43662,7 +42954,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_TMPVAR_HAN
zval *retval;
if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
- cache_slot = CACHE_ADDR(opline->extended_value);
+ cache_slot = CACHE_ADDR(opline->extended_value & ~ZEND_FETCH_REF /* FUNC_ARG fetch may contain it */);
if (EXPECTED(zobj->ce == CACHED_PTR_EX(cache_slot))) {
uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1);
@@ -43670,8 +42962,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_TMPVAR_HAN
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;
+ if (0 || (IS_CV & (IS_TMP_VAR|IS_VAR)) != 0) {
+ goto fetch_obj_r_copy;
+ } else {
+fetch_obj_r_fast_copy:
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
+ ZEND_VM_NEXT_OPCODE();
+ }
}
} else if (EXPECTED(zobj->properties != NULL)) {
if (!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET(prop_offset)) {
@@ -43685,8 +42982,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_TMPVAR_HAN
(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;
+ retval = &p->val;
+ if (0 || (IS_CV & (IS_TMP_VAR|IS_VAR)) != 0) {
+ goto fetch_obj_r_copy;
+ } else {
+ goto fetch_obj_r_fast_copy;
+ }
}
}
CACHE_PTR_EX(cache_slot + 1, (void*)ZEND_DYNAMIC_PROPERTY_OFFSET);
@@ -43695,30 +42996,29 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_TMPVAR_HAN
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;
+ if (0 || (IS_CV & (IS_TMP_VAR|IS_VAR)) != 0) {
+ goto fetch_obj_r_copy;
+ } else {
+ goto fetch_obj_r_fast_copy;
+ }
}
}
}
} 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);
+ ZVAL_UNDEFINED_OP2();
}
- 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));
+ 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);
- }
+ if (retval != EX_VAR(opline->result.var)) {
+fetch_obj_r_copy:
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
+ } else if (UNEXPECTED(Z_ISREF_P(retval))) {
+ zend_unwrap_reference(retval);
}
} while (0);
+fetch_obj_r_finish:
zval_ptr_dtor_nogc(free_op2);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
@@ -43739,7 +43039,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_TMPVAR_HAN
property = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
result = EX_VAR(opline->result.var);
- zend_fetch_property_address(result, container, IS_CV, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_W OPLINE_CC);
+ zend_fetch_property_address(
+ result, container, IS_CV, property, (IS_TMP_VAR|IS_VAR),
+ (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_FETCH_OBJ_FLAGS) : NULL),
+ BP_VAR_W, opline->extended_value & ZEND_FETCH_OBJ_FLAGS, 1 OPLINE_CC EXECUTE_DATA_CC);
zval_ptr_dtor_nogc(free_op2);
if (IS_CV == IS_VAR) {
FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result);
@@ -43754,14 +43057,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_CV_TMPVAR_HA
zval *property, *container, *result;
SAVE_OPLINE();
- container = _get_zval_ptr_cv_BP_VAR_RW(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_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
result = EX_VAR(opline->result.var);
- zend_fetch_property_address(result, container, IS_CV, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_RW OPLINE_CC);
+ zend_fetch_property_address(result, container, IS_CV, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_RW, 0, 1 OPLINE_CC EXECUTE_DATA_CC);
zval_ptr_dtor_nogc(free_op2);
if (IS_CV == IS_VAR) {
FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result);
@@ -43796,7 +43099,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_CV_TMPVAR_HA
break;
}
}
- goto fetch_obj_is_no_object;
+ ZVAL_NULL(EX_VAR(opline->result.var));
+ goto fetch_obj_is_finish;
} while (0);
}
@@ -43814,8 +43118,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_CV_TMPVAR_HA
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;
+ if (0 || (IS_CV & (IS_TMP_VAR|IS_VAR)) != 0) {
+ goto fetch_obj_is_copy;
+ } else {
+fetch_obj_is_fast_copy:
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
+ ZEND_VM_NEXT_OPCODE();
+ }
}
} else if (EXPECTED(zobj->properties != NULL)) {
if (!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET(prop_offset)) {
@@ -43829,8 +43138,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_CV_TMPVAR_HA
(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;
+ retval = &p->val;
+ if (0 || (IS_CV & (IS_TMP_VAR|IS_VAR)) != 0) {
+ goto fetch_obj_is_copy;
+ } else {
+ goto fetch_obj_is_fast_copy;
+ }
}
}
CACHE_PTR_EX(cache_slot + 1, (void*)ZEND_DYNAMIC_PROPERTY_OFFSET);
@@ -43839,26 +43152,27 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_CV_TMPVAR_HA
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 (0 || (IS_CV & (IS_TMP_VAR|IS_VAR)) != 0) {
+ goto fetch_obj_is_copy;
+ } else {
+ goto fetch_obj_is_fast_copy;
+ }
}
}
}
}
- 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));
- 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);
- }
+ if (retval != EX_VAR(opline->result.var)) {
+fetch_obj_is_copy:
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
+ } else if (UNEXPECTED(Z_ISREF_P(retval))) {
+ zend_unwrap_reference(retval);
}
} while (0);
+fetch_obj_is_finish:
zval_ptr_dtor_nogc(free_op2);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
@@ -43866,12 +43180,15 @@ fetch_obj_is_no_object:
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
+#if 0
+ USE_OPLINE
+#endif
+
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_TAIL_CALL(ZEND_FETCH_OBJ_W_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
} else {
ZEND_VM_TAIL_CALL(ZEND_FETCH_OBJ_R_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
@@ -43885,7 +43202,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_CV_TMPVAR
zval *container, *property, *result;
SAVE_OPLINE();
- container = _get_zval_ptr_cv_BP_VAR_UNSET(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));
@@ -43893,7 +43210,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_CV_TMPVAR
property = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
result = EX_VAR(opline->result.var);
- zend_fetch_property_address(result, container, IS_CV, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_UNSET OPLINE_CC);
+ zend_fetch_property_address(result, container, IS_CV, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_UNSET, 0, 1 OPLINE_CC EXECUTE_DATA_CC);
zval_ptr_dtor_nogc(free_op2);
if (IS_CV == IS_VAR) {
FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result);
@@ -43918,34 +43235,52 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D
value = RT_CONSTANT((opline+1), (opline+1)->op1);
if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
- if (Z_ISREF_P(object)) {
+ if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) {
object = Z_REFVAL_P(object);
- if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
- goto assign_object;
- }
+ goto assign_object;
}
- if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
-
- goto exit_assign_obj;
+ object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC);
+ if (UNEXPECTED(!object)) {
+ value = &EG(uninitialized_zval);
+ goto free_and_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*));
+ void **cache_slot = CACHE_ADDR(opline->extended_value);
+ uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1);
zend_object *zobj = Z_OBJ_P(object);
zval *property_val;
if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
property_val = OBJ_PROP(zobj, prop_offset);
if (Z_TYPE_P(property_val) != IS_UNDEF) {
+ zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2);
+
+ if (UNEXPECTED(prop_info != NULL)) {
+ zend_uchar orig_type = IS_UNDEF;
+
+ if (IS_CONST == IS_CONST) {
+ orig_type = Z_TYPE_P(value);
+ }
+
+ value = zend_assign_to_typed_prop(prop_info, property_val, value EXECUTE_DATA_CC);
+
+ /* will remain valid, thus no need to check prop_info in future here */
+ if (IS_CONST == IS_CONST && Z_TYPE_P(value) == orig_type) {
+ CACHE_PTR_EX(cache_slot + 2, NULL);
+ }
+ goto free_and_exit_assign_obj;
+ } else {
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);
+ value = zend_assign_to_variable(property_val, value, IS_CONST, EX_USES_STRICT_TYPES());
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+ ZVAL_COPY(EX_VAR(opline->result.var), value);
+ }
+ goto exit_assign_obj;
}
- goto exit_assign_obj;
}
} else {
if (EXPECTED(zobj->properties != NULL)) {
@@ -43999,18 +43334,13 @@ fast_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);
+ value = Z_OBJ_HT_P(object)->write_property(object, property, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL);
+free_and_exit_assign_obj:
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
}
@@ -44022,6 +43352,7 @@ exit_assign_obj:
ZEND_VM_NEXT_OPCODE_EX(1, 2);
}
+/* No specialization for op_types (CONST|TMPVAR|CV, UNUSED|CONST|VAR) */
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_DATA_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -44039,34 +43370,52 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D
value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
- if (Z_ISREF_P(object)) {
+ if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) {
object = Z_REFVAL_P(object);
- if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
- goto assign_object;
- }
+ goto assign_object;
}
- if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
- zval_ptr_dtor_nogc(free_op_data);
- goto exit_assign_obj;
+ object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC);
+ if (UNEXPECTED(!object)) {
+ value = &EG(uninitialized_zval);
+ goto free_and_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*));
+ void **cache_slot = CACHE_ADDR(opline->extended_value);
+ uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1);
zend_object *zobj = Z_OBJ_P(object);
zval *property_val;
if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
property_val = OBJ_PROP(zobj, prop_offset);
if (Z_TYPE_P(property_val) != IS_UNDEF) {
+ zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2);
+
+ if (UNEXPECTED(prop_info != NULL)) {
+ zend_uchar orig_type = IS_UNDEF;
+
+ if (IS_TMP_VAR == IS_CONST) {
+ orig_type = Z_TYPE_P(value);
+ }
+
+ value = zend_assign_to_typed_prop(prop_info, property_val, value EXECUTE_DATA_CC);
+
+ /* will remain valid, thus no need to check prop_info in future here */
+ if (IS_TMP_VAR == IS_CONST && Z_TYPE_P(value) == orig_type) {
+ CACHE_PTR_EX(cache_slot + 2, NULL);
+ }
+ goto free_and_exit_assign_obj;
+ } else {
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);
+ value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES());
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+ ZVAL_COPY(EX_VAR(opline->result.var), value);
+ }
+ goto exit_assign_obj;
}
- goto exit_assign_obj;
}
} else {
if (EXPECTED(zobj->properties != NULL)) {
@@ -44120,18 +43469,13 @@ fast_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);
+ value = Z_OBJ_HT_P(object)->write_property(object, property, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL);
+free_and_exit_assign_obj:
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
}
@@ -44143,6 +43487,7 @@ exit_assign_obj:
ZEND_VM_NEXT_OPCODE_EX(1, 2);
}
+/* No specialization for op_types (CONST|TMPVAR|CV, UNUSED|CONST|VAR) */
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -44160,34 +43505,52 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D
value = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
- if (Z_ISREF_P(object)) {
+ if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) {
object = Z_REFVAL_P(object);
- if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
- goto assign_object;
- }
+ goto assign_object;
}
- if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
- zval_ptr_dtor_nogc(free_op_data);
- goto exit_assign_obj;
+ object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC);
+ if (UNEXPECTED(!object)) {
+ value = &EG(uninitialized_zval);
+ goto free_and_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*));
+ void **cache_slot = CACHE_ADDR(opline->extended_value);
+ uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1);
zend_object *zobj = Z_OBJ_P(object);
zval *property_val;
if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
property_val = OBJ_PROP(zobj, prop_offset);
if (Z_TYPE_P(property_val) != IS_UNDEF) {
+ zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2);
+
+ if (UNEXPECTED(prop_info != NULL)) {
+ zend_uchar orig_type = IS_UNDEF;
+
+ if (IS_VAR == IS_CONST) {
+ orig_type = Z_TYPE_P(value);
+ }
+
+ value = zend_assign_to_typed_prop(prop_info, property_val, value EXECUTE_DATA_CC);
+
+ /* will remain valid, thus no need to check prop_info in future here */
+ if (IS_VAR == IS_CONST && Z_TYPE_P(value) == orig_type) {
+ CACHE_PTR_EX(cache_slot + 2, NULL);
+ }
+ goto free_and_exit_assign_obj;
+ } else {
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);
+ value = zend_assign_to_variable(property_val, value, IS_VAR, EX_USES_STRICT_TYPES());
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+ ZVAL_COPY(EX_VAR(opline->result.var), value);
+ }
+ goto exit_assign_obj;
}
- goto exit_assign_obj;
}
} else {
if (EXPECTED(zobj->properties != NULL)) {
@@ -44241,18 +43604,13 @@ fast_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);
+ value = Z_OBJ_HT_P(object)->write_property(object, property, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL);
+free_and_exit_assign_obj:
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
}
@@ -44264,6 +43622,7 @@ exit_assign_obj:
ZEND_VM_NEXT_OPCODE_EX(1, 2);
}
+/* No specialization for op_types (CONST|TMPVAR|CV, UNUSED|CONST|VAR) */
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -44281,34 +43640,52 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D
value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC);
if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
- if (Z_ISREF_P(object)) {
+ if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) {
object = Z_REFVAL_P(object);
- if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
- goto assign_object;
- }
+ goto assign_object;
}
- if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
-
- goto exit_assign_obj;
+ object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC);
+ if (UNEXPECTED(!object)) {
+ value = &EG(uninitialized_zval);
+ goto free_and_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*));
+ void **cache_slot = CACHE_ADDR(opline->extended_value);
+ uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1);
zend_object *zobj = Z_OBJ_P(object);
zval *property_val;
if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
property_val = OBJ_PROP(zobj, prop_offset);
if (Z_TYPE_P(property_val) != IS_UNDEF) {
+ zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2);
+
+ if (UNEXPECTED(prop_info != NULL)) {
+ zend_uchar orig_type = IS_UNDEF;
+
+ if (IS_CV == IS_CONST) {
+ orig_type = Z_TYPE_P(value);
+ }
+
+ value = zend_assign_to_typed_prop(prop_info, property_val, value EXECUTE_DATA_CC);
+
+ /* will remain valid, thus no need to check prop_info in future here */
+ if (IS_CV == IS_CONST && Z_TYPE_P(value) == orig_type) {
+ CACHE_PTR_EX(cache_slot + 2, NULL);
+ }
+ goto free_and_exit_assign_obj;
+ } else {
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);
+ value = zend_assign_to_variable(property_val, value, IS_CV, EX_USES_STRICT_TYPES());
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+ ZVAL_COPY(EX_VAR(opline->result.var), value);
+ }
+ goto exit_assign_obj;
}
- goto exit_assign_obj;
}
} else {
if (EXPECTED(zobj->properties != NULL)) {
@@ -44362,18 +43739,13 @@ fast_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);
+ value = Z_OBJ_HT_P(object)->write_property(object, property, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL);
+free_and_exit_assign_obj:
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
}
@@ -44385,30 +43757,30 @@ exit_assign_obj:
ZEND_VM_NEXT_OPCODE_EX(1, 2);
}
+/* No specialization for op_types (CONST|TMPVAR|CV, UNUSED|CONST|VAR) */
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;
+ zval *object_ptr, *orig_object_ptr;
zend_free_op free_op2, free_op_data;
zval *value;
zval *variable_ptr;
zval *dim;
SAVE_OPLINE();
- object_ptr = EX_VAR(opline->op1.var);
+ orig_object_ptr = object_ptr = EX_VAR(opline->op1.var);
if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) {
try_assign_dim_array:
+ value = RT_CONSTANT((opline+1), (opline+1)->op1);
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) {
@@ -44437,8 +43809,7 @@ 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 = zend_assign_to_variable(variable_ptr, value, IS_CONST, EX_USES_STRICT_TYPES());
}
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
@@ -44463,9 +43834,7 @@ try_assign_dim_array:
if ((IS_TMP_VAR|IS_VAR) == 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 = RT_CONSTANT((opline+1), (opline+1)->op1);
@@ -44473,8 +43842,16 @@ try_assign_dim_array:
}
} else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) {
- ZVAL_ARR(object_ptr, zend_new_array(8));
- goto try_assign_dim_array;
+ if (Z_ISREF_P(orig_object_ptr)
+ && ZEND_REF_HAS_TYPE_SOURCES(Z_REF_P(orig_object_ptr))
+ && !zend_verify_ref_array_assignable(Z_REF_P(orig_object_ptr))) {
+ dim = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+
+ UNDEF_RESULT();
+ } else {
+ 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();
@@ -44499,26 +43876,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D
{
USE_OPLINE
- zval *object_ptr;
+ zval *object_ptr, *orig_object_ptr;
zend_free_op free_op2, free_op_data;
zval *value;
zval *variable_ptr;
zval *dim;
SAVE_OPLINE();
- object_ptr = EX_VAR(opline->op1.var);
+ orig_object_ptr = object_ptr = EX_VAR(opline->op1.var);
if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) {
try_assign_dim_array:
+ value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
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) {
@@ -44547,8 +43923,7 @@ 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 = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR, EX_USES_STRICT_TYPES());
}
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
@@ -44574,9 +43949,7 @@ try_assign_dim_array:
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_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
@@ -44584,8 +43957,16 @@ try_assign_dim_array:
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;
+ if (Z_ISREF_P(orig_object_ptr)
+ && ZEND_REF_HAS_TYPE_SOURCES(Z_REF_P(orig_object_ptr))
+ && !zend_verify_ref_array_assignable(Z_REF_P(orig_object_ptr))) {
+ dim = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
+ UNDEF_RESULT();
+ } else {
+ 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();
@@ -44610,26 +43991,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D
{
USE_OPLINE
- zval *object_ptr;
+ zval *object_ptr, *orig_object_ptr;
zend_free_op free_op2, free_op_data;
zval *value;
zval *variable_ptr;
zval *dim;
SAVE_OPLINE();
- object_ptr = EX_VAR(opline->op1.var);
+ orig_object_ptr = object_ptr = EX_VAR(opline->op1.var);
if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) {
try_assign_dim_array:
+ value = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
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) {
@@ -44658,8 +44038,7 @@ 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 = zend_assign_to_variable(variable_ptr, value, IS_VAR, EX_USES_STRICT_TYPES());
}
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
@@ -44685,9 +44064,7 @@ try_assign_dim_array:
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_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);
@@ -44695,8 +44072,16 @@ try_assign_dim_array:
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;
+ if (Z_ISREF_P(orig_object_ptr)
+ && ZEND_REF_HAS_TYPE_SOURCES(Z_REF_P(orig_object_ptr))
+ && !zend_verify_ref_array_assignable(Z_REF_P(orig_object_ptr))) {
+ dim = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+ zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
+ UNDEF_RESULT();
+ } else {
+ 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();
@@ -44721,26 +44106,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D
{
USE_OPLINE
- zval *object_ptr;
+ zval *object_ptr, *orig_object_ptr;
zend_free_op free_op2, free_op_data;
zval *value;
zval *variable_ptr;
zval *dim;
SAVE_OPLINE();
- object_ptr = EX_VAR(opline->op1.var);
+ orig_object_ptr = object_ptr = EX_VAR(opline->op1.var);
if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) {
try_assign_dim_array:
+ value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC);
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) {
@@ -44769,8 +44153,7 @@ 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 = zend_assign_to_variable(variable_ptr, value, IS_CV, EX_USES_STRICT_TYPES());
}
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
@@ -44795,9 +44178,7 @@ try_assign_dim_array:
if ((IS_TMP_VAR|IS_VAR) == 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 = _get_zval_ptr_cv_deref_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC);
@@ -44805,8 +44186,16 @@ try_assign_dim_array:
}
} else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) {
- ZVAL_ARR(object_ptr, zend_new_array(8));
- goto try_assign_dim_array;
+ if (Z_ISREF_P(orig_object_ptr)
+ && ZEND_REF_HAS_TYPE_SOURCES(Z_REF_P(orig_object_ptr))
+ && !zend_verify_ref_array_assignable(Z_REF_P(orig_object_ptr))) {
+ dim = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+
+ UNDEF_RESULT();
+ } else {
+ 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();
@@ -44827,6 +44216,90 @@ assign_dim_error:
ZEND_VM_NEXT_OPCODE_EX(1, 2);
}
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op2, free_op_data;
+ zval *property, *container, *value_ptr;
+
+ SAVE_OPLINE();
+
+ container = EX_VAR(opline->op1.var);
+
+ if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
+ ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
+ }
+
+ property = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+
+ value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
+
+ if (1) {
+ if (IS_CV == IS_UNUSED) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
+ zend_assign_to_property_reference_this_const(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ } else {
+ zend_assign_to_property_reference_this_var(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ }
+ } else {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
+ zend_assign_to_property_reference_var_const(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ } else {
+ zend_assign_to_property_reference_var_var(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ }
+ }
+ } else {
+ zend_assign_to_property_reference(container, IS_CV, property, (IS_TMP_VAR|IS_VAR), value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ }
+
+ zval_ptr_dtor_nogc(free_op2);
+ if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);};
+ ZEND_VM_NEXT_OPCODE_EX(1, 2);
+}
+
+/* No specialization for op_types (CONST|TMPVAR|CV, UNUSED|CONST|VAR) */
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op2;
+ zval *property, *container, *value_ptr;
+
+ SAVE_OPLINE();
+
+ container = EX_VAR(opline->op1.var);
+
+ if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
+ ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
+ }
+
+ property = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+
+ value_ptr = _get_zval_ptr_cv_BP_VAR_W((opline+1)->op1.var EXECUTE_DATA_CC);
+
+ if (1) {
+ if (IS_CV == IS_UNUSED) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
+ zend_assign_to_property_reference_this_const(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ } else {
+ zend_assign_to_property_reference_this_var(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ }
+ } else {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
+ zend_assign_to_property_reference_var_const(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ } else {
+ zend_assign_to_property_reference_var_var(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ }
+ }
+ } else {
+ zend_assign_to_property_reference(container, IS_CV, property, (IS_TMP_VAR|IS_VAR), value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ }
+
+ zval_ptr_dtor_nogc(free_op2);
+
+ ZEND_VM_NEXT_OPCODE_EX(1, 2);
+}
+
+/* No specialization for op_types (CONST|TMPVAR|CV, UNUSED|CONST|VAR) */
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FAST_CONCAT_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -44849,14 +44322,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FAST_CONCAT_SPEC_CV_TMPVAR_HAN
} else {
ZVAL_STR(EX_VAR(opline->result.var), op2_str);
}
-
+ if (IS_CV & (IS_TMP_VAR|IS_VAR)) {
+ zend_string_release_ex(op1_str, 0);
+ }
} 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 {
ZVAL_STR(EX_VAR(opline->result.var), op1_str);
}
- zval_ptr_dtor_nogc(free_op2);
+ if ((IS_TMP_VAR|IS_VAR) & (IS_TMP_VAR|IS_VAR)) {
+ zend_string_release_ex(op2_str, 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);
@@ -44864,14 +44341,20 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FAST_CONCAT_SPEC_CV_TMPVAR_HAN
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);
+ if ((IS_TMP_VAR|IS_VAR) & (IS_TMP_VAR|IS_VAR)) {
+ zend_string_release_ex(op2_str, 0);
+ }
} 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);
+ if (IS_CV & (IS_TMP_VAR|IS_VAR)) {
+ zend_string_release_ex(op1_str, 0);
+ }
+ if ((IS_TMP_VAR|IS_VAR) & (IS_TMP_VAR|IS_VAR)) {
+ zend_string_release_ex(op2_str, 0);
+ }
}
ZEND_VM_NEXT_OPCODE();
}
@@ -44883,7 +44366,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FAST_CONCAT_SPEC_CV_TMPVAR_HAN
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);
+ ZVAL_UNDEFINED_OP1();
}
op1_str = zval_get_string_func(op1);
}
@@ -44893,7 +44376,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FAST_CONCAT_SPEC_CV_TMPVAR_HAN
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);
+ ZVAL_UNDEFINED_OP2();
}
op2_str = zval_get_string_func(op2);
}
@@ -44971,7 +44454,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CV_TMPVA
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);
+ ZVAL_UNDEFINED_OP2();
if (UNEXPECTED(EG(exception) != NULL)) {
HANDLE_EXCEPTION();
@@ -44994,7 +44477,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CV_TMPVA
}
}
if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
- object = GET_OP1_UNDEF_CV(object, BP_VAR_R);
+ object = ZVAL_UNDEFINED_OP1();
if (UNEXPECTED(EG(exception) != NULL)) {
if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
zval_ptr_dtor_nogc(free_op2);
@@ -45022,13 +44505,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CV_TMPVA
} 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);
}
@@ -45053,7 +44529,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CV_TMPVA
/* Reset "object" to trigger reference counting */
object = NULL;
}
- if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
+ if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!RUN_TIME_CACHE(&fbc->op_array))) {
init_func_run_time_cache(&fbc->op_array);
}
}
@@ -45062,26 +44538,28 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CV_TMPVA
zval_ptr_dtor_nogc(free_op2);
}
- call_info = ZEND_CALL_NESTED_FUNCTION;
+ call_info = ZEND_CALL_NESTED_FUNCTION | ZEND_CALL_HAS_THIS;
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();
}
+ /* call static method */
+ obj = (zend_object*)called_scope;
+ call_info = ZEND_CALL_NESTED_FUNCTION;
} 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;
if (IS_CV == IS_CV) {
GC_ADDREF(obj); /* For $this pointer */
} else if (free_op1 != object) {
GC_ADDREF(obj); /* For $this pointer */
}
+ /* CV may be changed indirectly (e.g. when it's a reference) */
+ call_info = ZEND_CALL_NESTED_FUNCTION | ZEND_CALL_HAS_THIS | ZEND_CALL_RELEASE_THIS;
}
call = zend_vm_stack_push_call_frame(call_info,
- fbc, opline->extended_value, called_scope, obj);
+ fbc, opline->extended_value, obj);
call->prev_execute_data = EX(call);
EX(call) = call;
@@ -45164,8 +44642,12 @@ num_index:
} else if (Z_TYPE_P(offset) == IS_TRUE) {
hval = 1;
goto num_index;
+ } else if (Z_TYPE_P(offset) == IS_RESOURCE) {
+ zend_use_resource_as_offset(offset);
+ hval = Z_RES_HANDLE_P(offset);
+ 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);
+ ZVAL_UNDEFINED_OP2();
str = ZSTR_EMPTY_ALLOC();
goto str_index;
} else {
@@ -45198,7 +44680,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_CV_TMPVAR_HAND
}
ZEND_VM_TAIL_CALL(ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
} else {
- ZVAL_EMPTY_ARRAY(array);
+ ZVAL_ARR(array, zend_new_array(0));
ZEND_VM_NEXT_OPCODE();
}
}
@@ -45260,7 +44742,7 @@ num_index_dim:
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);
+ ZVAL_UNDEFINED_OP2();
key = ZSTR_EMPTY_ALLOC();
goto str_index_dim;
} else {
@@ -45274,20 +44756,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);
+ container = ZVAL_UNDEFINED_OP1();
}
if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(offset) == IS_UNDEF)) {
- offset = GET_OP2_UNDEF_CV(offset, BP_VAR_R);
+ offset = ZVAL_UNDEFINED_OP2();
}
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);
+ 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)) {
zend_throw_error(NULL, "Cannot unset string offsets");
}
@@ -45306,7 +44784,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_CV_TMPVAR_HANDL
zval *offset;
SAVE_OPLINE();
- container = _get_zval_ptr_cv_BP_VAR_UNSET(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));
}
@@ -45317,17 +44795,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_CV_TMPVAR_HANDL
if (Z_ISREF_P(container)) {
container = Z_REFVAL_P(container);
if (Z_TYPE_P(container) != IS_OBJECT) {
+ if (IS_CV == IS_CV
+ && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
+ ZVAL_UNDEFINED_OP1();
+ }
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);
- }
+ Z_OBJ_HT_P(container)->unset_property(container, offset, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL));
} while (0);
zval_ptr_dtor_nogc(free_op2);
@@ -45379,6 +44857,14 @@ num_index_prop:
/* > 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);
+
+ if (IS_CV & (IS_CONST|IS_CV)) {
+ /* avoid exception check */
+ zval_ptr_dtor_nogc(free_op2);
+ ZEND_VM_SMART_BRANCH(result, 0);
+ ZVAL_BOOL(EX_VAR(opline->result.var), result);
+ ZEND_VM_NEXT_OPCODE();
+ }
} else {
result = (value == NULL || !i_zend_is_true(value));
}
@@ -45429,22 +44915,20 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CV
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;
+ result = (opline->extended_value & ZEND_ISEMPTY);
+ goto isset_object_finish;
}
} else {
- goto isset_no_object;
+ result = (opline->extended_value & ZEND_ISEMPTY);
+ goto isset_object_finish;
}
}
- 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));
- }
+ 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));
+
+isset_object_finish:
zval_ptr_dtor_nogc(free_op2);
ZEND_VM_SMART_BRANCH(result, 1);
@@ -45452,12 +44936,48 @@ isset_no_object:
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ARRAY_KEY_EXISTS_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+
+ zend_free_op free_op2;
+ zval *key, *subject;
+ HashTable *ht;
+ uint32_t result;
+
+ SAVE_OPLINE();
+
+ key = EX_VAR(opline->op1.var);
+ subject = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+
+ if (EXPECTED(Z_TYPE_P(subject) == IS_ARRAY)) {
+array_key_exists_array:
+ ht = Z_ARRVAL_P(subject);
+ result = zend_array_key_exists_fast(ht, key OPLINE_CC EXECUTE_DATA_CC);
+ } else {
+ if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_CV)) && EXPECTED(Z_ISREF_P(subject))) {
+ subject = Z_REFVAL_P(subject);
+ if (EXPECTED(Z_TYPE_P(subject) == IS_ARRAY)) {
+ goto array_key_exists_array;
+ }
+ }
+ result = zend_array_key_exists_slow(subject, key OPLINE_CC EXECUTE_DATA_CC);
+ }
+
+ zval_ptr_dtor_nogc(free_op2);
+
+ ZEND_VM_SMART_BRANCH(result == IS_TRUE, 1);
+ Z_TYPE_INFO_P(EX_VAR(opline->result.var)) = result;
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+}
+
+/* No specialization for op_types (CONST|TMPVAR|UNUSED|CV, ANY) */
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_bool result;
SAVE_OPLINE();
op1 = _get_zval_ptr_cv_deref_BP_VAR_R(opline->op1.var EXECUTE_DATA_CC);
@@ -45475,7 +44995,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_SPEC_CV_TMP_H
USE_OPLINE
zend_free_op free_op2;
zval *op1, *op2;
- int result;
+ zend_bool result;
SAVE_OPLINE();
op1 = _get_zval_ptr_cv_deref_BP_VAR_R(opline->op1.var EXECUTE_DATA_CC);
@@ -45505,7 +45025,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SPEC_CV_TMP_RETVAL_UNUS
ZVAL_NULL(EX_VAR(opline->result.var));
}
} else {
- value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR);
+ value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR, EX_USES_STRICT_TYPES());
if (UNEXPECTED(0)) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
}
@@ -45533,7 +45053,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SPEC_CV_TMP_RETVAL_USED
ZVAL_NULL(EX_VAR(opline->result.var));
}
} else {
- value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR);
+ value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR, EX_USES_STRICT_TYPES());
if (UNEXPECTED(1)) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
}
@@ -45585,20 +45105,23 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_CV_TMP_HANDLER(ZEND
/* 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 {
+ do {
+ if (IS_CV == IS_VAR) {
+ ZEND_ASSERT(value_ptr != &EG(uninitialized_zval));
+ if (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);
+ break;
+ }
+ }
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));
- }
+ } while (0);
}
} else {
@@ -45686,7 +45209,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_IDENTICAL_SPEC_CV_VAR_HANDL
USE_OPLINE
zend_free_op free_op2;
zval *op1, *op2;
- int result;
+ zend_bool result;
SAVE_OPLINE();
op1 = _get_zval_ptr_cv_deref_BP_VAR_R(opline->op1.var EXECUTE_DATA_CC);
@@ -45704,7 +45227,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_SPEC_CV_VAR_H
USE_OPLINE
zend_free_op free_op2;
zval *op1, *op2;
- int result;
+ zend_bool result;
SAVE_OPLINE();
op1 = _get_zval_ptr_cv_deref_BP_VAR_R(opline->op1.var EXECUTE_DATA_CC);
@@ -45717,131 +45240,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_SPEC_CV_VAR_H
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_CV_VAR(int type ZEND_OPCODE_HANDLER_ARGS_DC)
-{
- USE_OPLINE
-
- zval *varname;
- zval *retval;
- zend_string *name, *tmp_name;
- zend_class_entry *ce;
-
- SAVE_OPLINE();
-
- do {
- if (IS_VAR == IS_CONST) {
- if (IS_CV == IS_CONST && EXPECTED((ce = CACHED_PTR(opline->extended_value)) != NULL)) {
- retval = CACHED_PTR(opline->extended_value + sizeof(void*));
- break;
- } else {
- zval *class_name = RT_CONSTANT(opline, opline->op2);
-
- if (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_VAR == 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 {
- 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_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)
-{
- 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));
-}
-
-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
@@ -45859,7 +45257,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SPEC_CV_VAR_RETVAL_UNUS
ZVAL_NULL(EX_VAR(opline->result.var));
}
} else {
- value = zend_assign_to_variable(variable_ptr, value, IS_VAR);
+ value = zend_assign_to_variable(variable_ptr, value, IS_VAR, EX_USES_STRICT_TYPES());
if (UNEXPECTED(0)) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
}
@@ -45887,7 +45285,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SPEC_CV_VAR_RETVAL_USED
ZVAL_NULL(EX_VAR(opline->result.var));
}
} else {
- value = zend_assign_to_variable(variable_ptr, value, IS_VAR);
+ value = zend_assign_to_variable(variable_ptr, value, IS_VAR, EX_USES_STRICT_TYPES());
if (UNEXPECTED(1)) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
}
@@ -45914,26 +45312,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_CV_VAR_HANDLER
} else if (IS_CV == IS_VAR &&
UNEXPECTED(Z_TYPE_P(EX_VAR(opline->op1.var)) != IS_INDIRECT)) {
- zend_throw_error(NULL, "Cannot assign by reference to overloaded object");
-
- if (UNEXPECTED(free_op2)) {zval_ptr_dtor_nogc(free_op2);};
- UNDEF_RESULT();
- HANDLE_EXCEPTION();
+ zend_throw_error(NULL, "Cannot assign by reference to an array dimension of an object");
+ variable_ptr = &EG(uninitialized_zval);
} 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();
+ if (UNEXPECTED(!zend_wrong_assign_to_variable_reference(variable_ptr, value_ptr OPLINE_CC EXECUTE_DATA_CC))) {
+ variable_ptr = &EG(uninitialized_zval);
}
-
- /* op2 freed by assign_to_variable */
-
- ZEND_VM_NEXT_OPCODE();
} else {
zend_assign_to_variable_reference(variable_ptr, value_ptr);
}
@@ -45947,136 +45336,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_CV_VAR_HANDLER
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_STATIC_PROP_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zval *varname;
- zend_string *name, *tmp_name;
- zend_class_entry *ce;
-
-
- 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();
- }
- /*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));
-
- HANDLE_EXCEPTION();
- }
- } 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);
- }
-
- zend_std_unset_static_property(ce, 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_STATIC_PROP_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zval *value;
- int result;
-
- zval *varname;
- zend_string *name, *tmp_name;
- zend_class_entry *ce;
-
- SAVE_OPLINE();
- if (IS_VAR == IS_CONST) {
- if (IS_CV == IS_CONST && EXPECTED((ce = CACHED_PTR(opline->extended_value & ~ZEND_ISEMPTY)) != NULL)) {
- value = CACHED_PTR((opline->extended_value & ~ZEND_ISEMPTY) + sizeof(void*));
- goto is_static_prop_return;
- } else if (UNEXPECTED((ce = CACHED_PTR(opline->extended_value & ~ZEND_ISEMPTY)) == NULL)) {
- ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op2)), RT_CONSTANT(opline, opline->op2) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
- if (UNEXPECTED(ce == NULL)) {
- ZEND_ASSERT(EG(exception));
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
- }
- if (IS_CV != IS_CONST) {
- CACHE_PTR(opline->extended_value & ~ZEND_ISEMPTY, ce);
- }
- }
- } else {
- if (IS_VAR == IS_UNUSED) {
- ce = zend_fetch_class(NULL, opline->op2.num);
- if (UNEXPECTED(ce == NULL)) {
- ZEND_ASSERT(EG(exception));
-
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
- }
- } else {
- ce = Z_CE_P(EX_VAR(opline->op2.var));
- }
- if (IS_CV == IS_CONST &&
- EXPECTED(CACHED_PTR(opline->extended_value & ~ZEND_ISEMPTY) == ce)) {
-
- value = CACHED_PTR((opline->extended_value & ~ZEND_ISEMPTY) + sizeof(void*));
- goto is_static_prop_return;
- }
- }
-
- varname = _get_zval_ptr_cv_BP_VAR_IS(opline->op1.var EXECUTE_DATA_CC);
- if (IS_CV == IS_CONST) {
- name = Z_STR_P(varname);
- } else {
- name = zval_get_tmp_string(varname, &tmp_name);
- }
-
- value = zend_std_get_static_property(ce, name, 1);
-
- if (IS_CV == IS_CONST && value) {
- CACHE_POLYMORPHIC_PTR(opline->extended_value & ~ZEND_ISEMPTY, ce, value);
- }
-
- if (IS_CV != IS_CONST) {
- zend_tmp_string_release(tmp_name);
- }
-
-is_static_prop_return:
- if (!(opline->extended_value & ZEND_ISEMPTY)) {
- result = value && Z_TYPE_P(value) > IS_NULL &&
- (!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_INSTANCEOF_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -46094,7 +45353,7 @@ try_instanceof:
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);
+ ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op2)), Z_STR_P(RT_CONSTANT(opline, opline->op2) + 1), ZEND_FETCH_CLASS_NO_AUTOLOAD);
if (EXPECTED(ce)) {
CACHE_PTR(opline->extended_value, ce);
}
@@ -46116,7 +45375,7 @@ try_instanceof:
goto try_instanceof;
} else {
if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(expr) == IS_UNDEF)) {
- GET_OP1_UNDEF_CV(expr, BP_VAR_R);
+ ZVAL_UNDEFINED_OP1();
}
result = 0;
}
@@ -46167,20 +45426,23 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_CV_VAR_HANDLER(ZEND
/* 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 {
+ do {
+ if (IS_CV == IS_VAR) {
+ ZEND_ASSERT(value_ptr != &EG(uninitialized_zval));
+ if (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);
+ break;
+ }
+ }
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));
- }
+ } while (0);
}
} else {
@@ -46263,7 +45525,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_CV_VAR_HANDLER(ZEND
ZEND_VM_RETURN();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SPEC_CV_UNUSED(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_OP_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zend_free_op free_op_data1;
@@ -46293,150 +45555,61 @@ assign_dim_op_new_array:
if (UNEXPECTED(!var_ptr)) {
goto assign_dim_op_ret_null;
}
- ZVAL_DEREF(var_ptr);
}
value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data1);
- binary_op(var_ptr, var_ptr, value);
+ do {
+ if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_ISREF_P(var_ptr))) {
+ zend_reference *ref = Z_REF_P(var_ptr);
+ var_ptr = Z_REFVAL_P(var_ptr);
+ if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) {
+ zend_binary_assign_op_typed_ref(ref, value OPLINE_CC EXECUTE_DATA_CC);
+ break;
+ }
+ }
+ zend_binary_op(var_ptr, var_ptr, value OPLINE_CC);
+ } while (0);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);
}
+ FREE_OP(free_op_data1);
} 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_ARR(container, zend_new_array(8));
- goto assign_dim_op_new_array;
}
dim = NULL;
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_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);
+ zend_binary_assign_op_obj_dim(container, dim OPLINE_CC EXECUTE_DATA_CC);
+ } else if (EXPECTED(Z_TYPE_P(container) <= IS_FALSE)) {
+ if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(container) == IS_UNDEF)) {
+ ZVAL_UNDEFINED_OP1();
+ }
+ ZVAL_ARR(container, zend_new_array(8));
+ goto assign_dim_op_new_array;
} else {
- if (UNEXPECTED(Z_TYPE_P(container) == IS_STRING)) {
- if (IS_UNUSED == 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_CV != IS_VAR || EXPECTED(!Z_ISERROR_P(container)))) {
- zend_use_scalar_as_array();
- }
+ zend_binary_assign_op_dim_slow(container, dim OPLINE_CC EXECUTE_DATA_CC);
assign_dim_op_ret_null:
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
+ 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);
}
}
- 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
-# if 0
- /* opline->extended_value checks are specialized, don't need opline */
- USE_OPLINE
-# endif
-
- if (EXPECTED(0)) {
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_simple_helper_SPEC_CV_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
- }
- if (EXPECTED(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)
+static zend_never_inline ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_CV_UNUSED(int type ZEND_OPCODE_HANDLER_ARGS_DC)
{
USE_OPLINE
@@ -46455,9 +45628,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_
tmp_name = NULL;
} else {
if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(varname) == IS_UNDEF)) {
- GET_OP1_UNDEF_CV(varname, BP_VAR_R);
+ ZVAL_UNDEFINED_OP1();
+ }
+ name = zval_try_get_tmp_string(varname, &tmp_name);
+ if (UNEXPECTED(!name)) {
+
+ ZVAL_UNDEF(EX_VAR(opline->result.var));
+ HANDLE_EXCEPTION();
}
- name = zval_get_tmp_string(varname, &tmp_name);
}
target_symbol_table = zend_get_target_symbol_table(opline->extended_value EXECUTE_DATA_CC);
@@ -46555,131 +45733,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_IS_SPEC_CV_UNUSED_HANDLE
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;
- zend_string *name, *tmp_name;
- zend_class_entry *ce;
-
- SAVE_OPLINE();
-
- do {
- if (IS_UNUSED == IS_CONST) {
- if (IS_CV == IS_CONST && EXPECTED((ce = CACHED_PTR(opline->extended_value)) != NULL)) {
- retval = CACHED_PTR(opline->extended_value + sizeof(void*));
- break;
- } else {
- zval *class_name = RT_CONSTANT(opline, opline->op2);
-
- if (UNEXPECTED((ce = CACHED_PTR(opline->extended_value)) == NULL)) {
- ce = zend_fetch_class_by_name(Z_STR_P(class_name), class_name + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
- if (UNEXPECTED(ce == NULL)) {
-
- retval = NULL;
- break;
- }
- if (IS_CV != IS_CONST) {
- CACHE_PTR(opline->extended_value, ce);
- }
- }
- }
- } else {
- if (IS_UNUSED == IS_UNUSED) {
- ce = zend_fetch_class(NULL, opline->op2.num);
- if (UNEXPECTED(ce == NULL)) {
-
- retval = NULL;
- break;
- }
- } else {
- ce = Z_CE_P(EX_VAR(opline->op2.var));
- }
- if (IS_CV == IS_CONST &&
- EXPECTED(CACHED_PTR(opline->extended_value) == ce)) {
- retval = CACHED_PTR(opline->extended_value + sizeof(void*));
- break;
- }
- }
-
- varname = EX_VAR(opline->op1.var);
- if (IS_CV == IS_CONST) {
- name = Z_STR_P(varname);
- } else if (EXPECTED(Z_TYPE_P(varname) == IS_STRING)) {
- name = Z_STR_P(varname);
- tmp_name = NULL;
- } else {
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(varname) == IS_UNDEF)) {
- zval_undefined_cv(EX(opline)->op1.var EXECUTE_DATA_CC);
- }
- name = zval_get_tmp_string(varname, &tmp_name);
- }
-
- retval = zend_std_get_static_property(ce, name, type == BP_VAR_IS);
-
- if (IS_CV != IS_CONST) {
- zend_tmp_string_release(tmp_name);
- }
-
- if (IS_CV == IS_CONST && EXPECTED(retval)) {
- CACHE_POLYMORPHIC_PTR(opline->extended_value, ce, retval);
- }
-
- } while (0);
-
- if (UNEXPECTED(retval == NULL)) {
- if (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_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)
-{
- 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_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));
-}
-
+/* No specialization for op_types (CONST|TMPVAR|CV, UNUSED|CONST|VAR) */
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_W_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -46716,6 +45770,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_RW_SPEC_CV_UNUSED_HA
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
+#if 0
+ USE_OPLINE
+#endif
+
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));
@@ -46733,26 +45791,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D
{
USE_OPLINE
- zval *object_ptr;
+ zval *object_ptr, *orig_object_ptr;
zend_free_op free_op_data;
zval *value;
zval *variable_ptr;
zval *dim;
SAVE_OPLINE();
- object_ptr = EX_VAR(opline->op1.var);
+ orig_object_ptr = object_ptr = EX_VAR(opline->op1.var);
if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) {
try_assign_dim_array:
+ value = RT_CONSTANT((opline+1), (opline+1)->op1);
SEPARATE_ARRAY(object_ptr);
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_cannot_add_element();
goto assign_dim_error;
} else if (IS_CONST == IS_CV) {
@@ -46781,8 +45838,7 @@ 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 = zend_assign_to_variable(variable_ptr, value, IS_CONST, EX_USES_STRICT_TYPES());
}
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
@@ -46807,9 +45863,7 @@ try_assign_dim_array:
if (IS_UNUSED == IS_UNUSED) {
zend_use_new_element_for_string();
-
UNDEF_RESULT();
- HANDLE_EXCEPTION();
} else {
dim = NULL;
value = RT_CONSTANT((opline+1), (opline+1)->op1);
@@ -46817,8 +45871,16 @@ try_assign_dim_array:
}
} else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) {
- ZVAL_ARR(object_ptr, zend_new_array(8));
- goto try_assign_dim_array;
+ if (Z_ISREF_P(orig_object_ptr)
+ && ZEND_REF_HAS_TYPE_SOURCES(Z_REF_P(orig_object_ptr))
+ && !zend_verify_ref_array_assignable(Z_REF_P(orig_object_ptr))) {
+ dim = NULL;
+
+ UNDEF_RESULT();
+ } else {
+ 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();
@@ -46843,26 +45905,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D
{
USE_OPLINE
- zval *object_ptr;
+ zval *object_ptr, *orig_object_ptr;
zend_free_op free_op_data;
zval *value;
zval *variable_ptr;
zval *dim;
SAVE_OPLINE();
- object_ptr = EX_VAR(opline->op1.var);
+ orig_object_ptr = object_ptr = EX_VAR(opline->op1.var);
if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) {
try_assign_dim_array:
+ value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
SEPARATE_ARRAY(object_ptr);
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)) {
- zval_ptr_dtor_nogc(free_op_data);
zend_cannot_add_element();
goto assign_dim_error;
} else if (IS_TMP_VAR == IS_CV) {
@@ -46891,8 +45952,7 @@ 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 = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR, EX_USES_STRICT_TYPES());
}
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
@@ -46918,9 +45978,7 @@ try_assign_dim_array:
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 = NULL;
value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
@@ -46928,8 +45986,16 @@ try_assign_dim_array:
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;
+ if (Z_ISREF_P(orig_object_ptr)
+ && ZEND_REF_HAS_TYPE_SOURCES(Z_REF_P(orig_object_ptr))
+ && !zend_verify_ref_array_assignable(Z_REF_P(orig_object_ptr))) {
+ dim = NULL;
+ zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
+ UNDEF_RESULT();
+ } else {
+ 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();
@@ -46954,26 +46020,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D
{
USE_OPLINE
- zval *object_ptr;
+ zval *object_ptr, *orig_object_ptr;
zend_free_op free_op_data;
zval *value;
zval *variable_ptr;
zval *dim;
SAVE_OPLINE();
- object_ptr = EX_VAR(opline->op1.var);
+ orig_object_ptr = object_ptr = EX_VAR(opline->op1.var);
if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) {
try_assign_dim_array:
+ value = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
SEPARATE_ARRAY(object_ptr);
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)) {
- zval_ptr_dtor_nogc(free_op_data);
zend_cannot_add_element();
goto assign_dim_error;
} else if (IS_VAR == IS_CV) {
@@ -47002,8 +46067,7 @@ 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 = zend_assign_to_variable(variable_ptr, value, IS_VAR, EX_USES_STRICT_TYPES());
}
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
@@ -47029,9 +46093,7 @@ try_assign_dim_array:
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 = NULL;
value = _get_zval_ptr_var_deref((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
@@ -47039,8 +46101,16 @@ try_assign_dim_array:
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;
+ if (Z_ISREF_P(orig_object_ptr)
+ && ZEND_REF_HAS_TYPE_SOURCES(Z_REF_P(orig_object_ptr))
+ && !zend_verify_ref_array_assignable(Z_REF_P(orig_object_ptr))) {
+ dim = NULL;
+ zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
+ UNDEF_RESULT();
+ } else {
+ 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();
@@ -47065,26 +46135,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D
{
USE_OPLINE
- zval *object_ptr;
+ zval *object_ptr, *orig_object_ptr;
zend_free_op free_op_data;
zval *value;
zval *variable_ptr;
zval *dim;
SAVE_OPLINE();
- object_ptr = EX_VAR(opline->op1.var);
+ orig_object_ptr = object_ptr = EX_VAR(opline->op1.var);
if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) {
try_assign_dim_array:
+ value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC);
SEPARATE_ARRAY(object_ptr);
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_cannot_add_element();
goto assign_dim_error;
} else if (IS_CV == IS_CV) {
@@ -47113,8 +46182,7 @@ 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 = zend_assign_to_variable(variable_ptr, value, IS_CV, EX_USES_STRICT_TYPES());
}
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
@@ -47139,9 +46207,7 @@ try_assign_dim_array:
if (IS_UNUSED == IS_UNUSED) {
zend_use_new_element_for_string();
-
UNDEF_RESULT();
- HANDLE_EXCEPTION();
} else {
dim = NULL;
value = _get_zval_ptr_cv_deref_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC);
@@ -47149,8 +46215,16 @@ try_assign_dim_array:
}
} else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) {
- ZVAL_ARR(object_ptr, zend_new_array(8));
- goto try_assign_dim_array;
+ if (Z_ISREF_P(orig_object_ptr)
+ && ZEND_REF_HAS_TYPE_SOURCES(Z_REF_P(orig_object_ptr))
+ && !zend_verify_ref_array_assignable(Z_REF_P(orig_object_ptr))) {
+ dim = NULL;
+
+ UNDEF_RESULT();
+ } else {
+ 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();
@@ -47297,8 +46371,12 @@ num_index:
} else if (Z_TYPE_P(offset) == IS_TRUE) {
hval = 1;
goto num_index;
+ } else if (Z_TYPE_P(offset) == IS_RESOURCE) {
+ zend_use_resource_as_offset(offset);
+ hval = Z_RES_HANDLE_P(offset);
+ goto num_index;
} else if (IS_UNUSED == IS_CV && Z_TYPE_P(offset) == IS_UNDEF) {
- GET_OP2_UNDEF_CV(offset, BP_VAR_R);
+ ZVAL_UNDEFINED_OP2();
str = ZSTR_EMPTY_ALLOC();
goto str_index;
} else {
@@ -47331,7 +46409,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_CV_UNUSED_HAND
}
ZEND_VM_TAIL_CALL(ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
} else {
- ZVAL_EMPTY_ARRAY(array);
+ ZVAL_ARR(array, zend_new_array(0));
ZEND_VM_NEXT_OPCODE();
}
}
@@ -47377,67 +46455,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_VAR_SPEC_CV_UNUSED_HANDL
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);
+ varname = ZVAL_UNDEFINED_OP1();
}
- 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_CV != IS_CONST) {
- zend_tmp_string_release(tmp_name);
- }
-
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
-static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_STATIC_PROP_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zval *varname;
- zend_string *name, *tmp_name;
- zend_class_entry *ce;
-
-
- SAVE_OPLINE();
-
- 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));
-
- 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));
+ name = zval_try_get_tmp_string(varname, &tmp_name);
+ if (UNEXPECTED(!name)) {
HANDLE_EXCEPTION();
}
- } 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);
}
- zend_std_unset_static_property(ce, 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_CV != IS_CONST) {
zend_tmp_string_release(tmp_name);
@@ -47446,52 +46474,69 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_STATIC_PROP
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
+/* No specialization for op_types (CONST|TMPVAR|CV, UNUSED|CLASS_FETCH|CONST|VAR) */
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);
+ if (Z_TYPE_P(value) > IS_NULL &&
+ (!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL)) {
+ ZEND_VM_SMART_BRANCH_TRUE();
+ ZVAL_TRUE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
+ } else {
+ ZEND_VM_SMART_BRANCH_FALSE();
+ ZVAL_FALSE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
+ }
} else {
+ int result;
+
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();
}
- 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_ISSET_ISEMPTY_CV_SPEC_CV_UNUSED_EMPTY_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zval *value;
- int result;
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);
+ if (Z_TYPE_P(value) > IS_NULL &&
+ (!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL)) {
+ ZEND_VM_SMART_BRANCH_TRUE();
+ ZVAL_TRUE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
+ } else {
+ ZEND_VM_SMART_BRANCH_FALSE();
+ ZVAL_FALSE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
+ }
} else {
+ int result;
+
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();
}
- 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_ISSET_ISEMPTY_VAR_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
@@ -47540,82 +46585,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_CV_UNUS
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 *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);
- }
- }
- } else {
- if (IS_UNUSED == IS_UNUSED) {
- ce = zend_fetch_class(NULL, opline->op2.num);
- if (UNEXPECTED(ce == NULL)) {
- ZEND_ASSERT(EG(exception));
-
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
- }
- } else {
- ce = Z_CE_P(EX_VAR(opline->op2.var));
- }
- if (IS_CV == IS_CONST &&
- EXPECTED(CACHED_PTR(opline->extended_value & ~ZEND_ISEMPTY) == ce)) {
-
- value = CACHED_PTR((opline->extended_value & ~ZEND_ISEMPTY) + sizeof(void*));
- goto is_static_prop_return;
- }
- }
-
- varname = _get_zval_ptr_cv_BP_VAR_IS(opline->op1.var EXECUTE_DATA_CC);
- if (IS_CV == IS_CONST) {
- name = Z_STR_P(varname);
- } else {
- name = zval_get_tmp_string(varname, &tmp_name);
- }
-
- value = zend_std_get_static_property(ce, name, 1);
-
- if (IS_CV == IS_CONST && value) {
- CACHE_POLYMORPHIC_PTR(opline->extended_value & ~ZEND_ISEMPTY, ce, value);
- }
-
- if (IS_CV != IS_CONST) {
- zend_tmp_string_release(tmp_name);
- }
-
-is_static_prop_return:
- if (!(opline->extended_value & ZEND_ISEMPTY)) {
- result = value && Z_TYPE_P(value) > IS_NULL &&
- (!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();
-}
-
+/* No specialization for op_types (CONST|TMPVAR|CV, UNUSED|CLASS_FETCH|CONST|VAR) */
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INSTANCEOF_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -47633,7 +46603,7 @@ try_instanceof:
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);
+ ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op2)), Z_STR_P(RT_CONSTANT(opline, opline->op2) + 1), ZEND_FETCH_CLASS_NO_AUTOLOAD);
if (EXPECTED(ce)) {
CACHE_PTR(opline->extended_value, ce);
}
@@ -47655,7 +46625,7 @@ try_instanceof:
goto try_instanceof;
} else {
if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(expr) == IS_UNDEF)) {
- GET_OP1_UNDEF_CV(expr, BP_VAR_R);
+ ZVAL_UNDEFINED_OP1();
}
result = 0;
}
@@ -47706,20 +46676,23 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_CV_UNUSED_HANDLER(Z
/* 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 {
+ do {
+ if (IS_CV == IS_VAR) {
+ ZEND_ASSERT(value_ptr != &EG(uninitialized_zval));
+ if (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);
+ break;
+ }
+ }
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));
- }
+ } while (0);
}
} else {
@@ -47802,6 +46775,60 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_CV_UNUSED_HANDLER(Z
ZEND_VM_RETURN();
}
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BIND_STATIC_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+
+ HashTable *ht;
+ zval *value;
+ zval *variable_ptr;
+
+ variable_ptr = EX_VAR(opline->op1.var);
+ i_zval_ptr_dtor(variable_ptr);
+
+ ht = ZEND_MAP_PTR_GET(EX(func)->op_array.static_variables_ptr);
+ if (!ht) {
+ ZEND_ASSERT(EX(func)->op_array.fn_flags & (ZEND_ACC_IMMUTABLE|ZEND_ACC_PRELOADED));
+ ht = zend_array_dup(EX(func)->op_array.static_variables);
+ ZEND_MAP_PTR_SET(EX(func)->op_array.static_variables_ptr, ht);
+ } else if (GC_REFCOUNT(ht) > 1) {
+ if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE)) {
+ GC_DELREF(ht);
+ }
+ ht = zend_array_dup(ht);
+ ZEND_MAP_PTR_SET(EX(func)->op_array.static_variables_ptr, ht);
+ }
+
+ value = (zval*)((char*)ht->arData + (opline->extended_value & ~(ZEND_BIND_REF|ZEND_BIND_IMPLICIT)));
+
+ 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);
+ HANDLE_EXCEPTION();
+ }
+ }
+ if (UNEXPECTED(!Z_ISREF_P(value))) {
+ zend_reference *ref = (zend_reference*)emalloc(sizeof(zend_reference));
+ GC_SET_REFCOUNT(ref, 2);
+ GC_TYPE_INFO(ref) = IS_REFERENCE;
+ ZVAL_COPY_VALUE(&ref->val, value);
+ ref->sources.ptr = NULL;
+ Z_REF_P(value) = ref;
+ Z_TYPE_INFO_P(value) = IS_REFERENCE_EX;
+ ZVAL_REF(variable_ptr, ref);
+ } else {
+ Z_ADDREF_P(value);
+ ZVAL_REF(variable_ptr, Z_REF_P(value));
+ }
+ } else {
+ ZVAL_COPY(variable_ptr, value);
+ }
+
+ ZEND_VM_NEXT_OPCODE();
+}
+
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CHECK_VAR_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -47809,7 +46836,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CHECK_VAR_SPEC_CV_UNUSED_HANDL
if (UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
SAVE_OPLINE();
- GET_OP1_UNDEF_CV(op1, BP_VAR_R);
+ ZVAL_UNDEFINED_OP1();
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
ZEND_VM_NEXT_OPCODE();
@@ -47856,8 +46883,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_COUNT_SPEC_CV_UNUSED_HANDLER(Z
zend_long count;
SAVE_OPLINE();
- op1 = _get_zval_ptr_cv_deref_BP_VAR_R(opline->op1.var EXECUTE_DATA_CC);
- do {
+ op1 = EX_VAR(opline->op1.var);
+ while (1) {
if (Z_TYPE_P(op1) == IS_ARRAY) {
count = zend_array_count(Z_ARRVAL_P(op1));
break;
@@ -47867,6 +46894,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_COUNT_SPEC_CV_UNUSED_HANDLER(Z
if (SUCCESS == Z_OBJ_HT_P(op1)->count_elements(op1, &count)) {
break;
}
+ if (UNEXPECTED(EG(exception))) {
+ count = 0;
+ break;
+ }
}
/* if not and the object implements Countable we call its count() method */
@@ -47881,13 +46912,20 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_COUNT_SPEC_CV_UNUSED_HANDLER(Z
/* 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) {
+ } else if ((IS_CV & (IS_VAR|IS_CV)) != 0 && Z_TYPE_P(op1) == IS_REFERENCE) {
+ op1 = Z_REFVAL_P(op1);
+ continue;
+ } else if (Z_TYPE_P(op1) <= IS_NULL) {
+ if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ ZVAL_UNDEFINED_OP1();
+ }
count = 0;
} else {
count = 1;
}
- zend_error(E_WARNING, "count(): Parameter must be an array or an object that implements Countable");
- } while (0);
+ zend_error(E_WARNING, "%s(): Parameter must be an array or an object that implements Countable", opline->extended_value ? "sizeof" : "count");
+ break;
+ }
ZVAL_LONG(EX_VAR(opline->result.var), count);
@@ -47913,12 +46951,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_GET_CLASS_SPEC_CV_UNUSED_HANDL
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_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));
+ op1 = EX_VAR(opline->op1.var);
+ while (1) {
+ if (Z_TYPE_P(op1) == IS_OBJECT) {
+ ZVAL_STR_COPY(EX_VAR(opline->result.var), Z_OBJCE_P(op1)->name);
+ } else if ((IS_CV & (IS_VAR|IS_CV)) != 0 && Z_TYPE_P(op1) == IS_REFERENCE) {
+ op1 = Z_REFVAL_P(op1);
+ continue;
+ } else {
+ if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ ZVAL_UNDEFINED_OP1();
+ }
+ 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));
+ }
+ break;
}
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
@@ -47944,138 +46991,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_GET_TYPE_SPEC_CV_UNUSED_HANDLE
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
-
- zval *op1, *op2, *result;
-
- 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);
- 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_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)) {
- op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
- }
- add_function(EX_VAR(opline->result.var), op1, op2);
-
-
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SUB_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
-
- zval *op1, *op2, *result;
-
- 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);
- 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_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)) {
- op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
- }
- sub_function(EX_VAR(opline->result.var), op1, op2);
-
-
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MUL_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
-
- zval *op1, *op2, *result;
-
- 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;
-
- 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_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)) {
- 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_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -48091,98 +47006,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DIV_SPEC_CV_CV_HANDLER(ZEND_OP
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MOD_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
-
- zval *op1, *op2, *result;
-
- 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)) {
- 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_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)) {
- op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
- }
- mod_function(EX_VAR(opline->result.var), op1, op2);
-
-
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SL_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
-
- zval *op1, *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)) {
- 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_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);
-
-
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SR_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
-
- zval *op1, *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)) {
- 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_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);
-
-
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POW_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -48219,14 +47042,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CONCAT_SPEC_CV_CV_HANDLER(ZEND
} else {
ZVAL_STR(EX_VAR(opline->result.var), op2_str);
}
-
+ if (IS_CV & (IS_TMP_VAR|IS_VAR)) {
+ zend_string_release_ex(op1_str, 0);
+ }
} 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 {
ZVAL_STR(EX_VAR(opline->result.var), op1_str);
}
-
+ if (IS_CV & (IS_TMP_VAR|IS_VAR)) {
+ zend_string_release_ex(op2_str, 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);
@@ -48234,24 +47061,30 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CONCAT_SPEC_CV_CV_HANDLER(ZEND
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);
-
+ if (IS_CV & (IS_TMP_VAR|IS_VAR)) {
+ zend_string_release_ex(op2_str, 0);
+ }
} 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_TMP_VAR|IS_VAR)) {
+ zend_string_release_ex(op1_str, 0);
+ }
+ if (IS_CV & (IS_TMP_VAR|IS_VAR)) {
+ zend_string_release_ex(op2_str, 0);
+ }
}
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);
+ op1 = ZVAL_UNDEFINED_OP1();
}
if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
- op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
+ op2 = ZVAL_UNDEFINED_OP2();
}
concat_function(EX_VAR(opline->result.var), op1, op2);
@@ -48265,7 +47098,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_IDENTICAL_SPEC_CV_CV_HANDLE
USE_OPLINE
zval *op1, *op2;
- int result;
+ zend_bool result;
SAVE_OPLINE();
op1 = _get_zval_ptr_cv_deref_BP_VAR_R(opline->op1.var EXECUTE_DATA_CC);
@@ -48283,7 +47116,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_SPEC_CV_CV_HA
USE_OPLINE
zval *op1, *op2;
- int result;
+ zend_bool result;
SAVE_OPLINE();
op1 = _get_zval_ptr_cv_deref_BP_VAR_R(opline->op1.var EXECUTE_DATA_CC);
@@ -48300,309 +47133,390 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_CV_CV_HANDLER(ZE
{
USE_OPLINE
- zval *op1, *op2, *result;
+ zval *op1, *op2;
+ double d1, d2;
op1 = EX_VAR(opline->op1.var);
op2 = EX_VAR(opline->op2.var);
- 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));
+ if (1 && IS_CV == IS_CONST && IS_CV == IS_CONST) {
+ /* pass */
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_LVAL_P(op1) == Z_LVAL_P(op2))) {
+is_equal_true:
+
+ ZVAL_TRUE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
} else {
- break;
+is_equal_false:
+
+ ZVAL_FALSE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
}
- } 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 if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ d1 = (double)Z_LVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+ goto is_equal_double;
+ }
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+is_equal_double:
+ if (d1 == d2) {
+ goto is_equal_true;
} else {
- break;
+ goto is_equal_false;
}
- } 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 if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = (double)Z_LVAL_P(op2);
+ goto is_equal_double;
+ }
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
+ if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
+ int result = zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2));
+ if (IS_CV & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_str(op1);
+ }
+ if (IS_CV & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_str(op2);
+ }
+ if (result) {
+ goto is_equal_true;
} else {
- break;
+ goto is_equal_false;
}
- } 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();
+ ZEND_VM_TAIL_CALL(zend_is_equal_helper_SPEC(op1, op2 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-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_EQUAL_SPEC_CV_CV_JMPZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zval *op1, *op2, *result;
+ zval *op1, *op2;
+ double d1, d2;
op1 = EX_VAR(opline->op1.var);
op2 = EX_VAR(opline->op2.var);
- 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));
+ if (1 && IS_CV == IS_CONST && IS_CV == IS_CONST) {
+ /* pass */
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_LVAL_P(op1) == Z_LVAL_P(op2))) {
+is_equal_true:
+ ZEND_VM_SMART_BRANCH_TRUE_JMPZ();
+ ZVAL_TRUE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
} else {
- break;
+is_equal_false:
+ ZEND_VM_SMART_BRANCH_FALSE_JMPZ();
+ ZVAL_FALSE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
}
- } 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 if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ d1 = (double)Z_LVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+ goto is_equal_double;
+ }
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+is_equal_double:
+ if (d1 == d2) {
+ goto is_equal_true;
} else {
- break;
+ goto is_equal_false;
}
- } 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 if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = (double)Z_LVAL_P(op2);
+ goto is_equal_double;
+ }
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
+ if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
+ int result = zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2));
+ if (IS_CV & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_str(op1);
+ }
+ if (IS_CV & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_str(op2);
+ }
+ if (result) {
+ goto is_equal_true;
} else {
- break;
+ goto is_equal_false;
}
- } 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();
+ ZEND_VM_TAIL_CALL(zend_is_equal_helper_SPEC(op1, op2 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-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_EQUAL_SPEC_CV_CV_JMPNZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zval *op1, *op2, *result;
+ zval *op1, *op2;
+ double d1, d2;
op1 = EX_VAR(opline->op1.var);
op2 = EX_VAR(opline->op2.var);
- 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));
+ if (1 && IS_CV == IS_CONST && IS_CV == IS_CONST) {
+ /* pass */
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_LVAL_P(op1) == Z_LVAL_P(op2))) {
+is_equal_true:
+ ZEND_VM_SMART_BRANCH_TRUE_JMPNZ();
+ ZVAL_TRUE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
} else {
- break;
+is_equal_false:
+ ZEND_VM_SMART_BRANCH_FALSE_JMPNZ();
+ ZVAL_FALSE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
}
- } 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 if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ d1 = (double)Z_LVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+ goto is_equal_double;
+ }
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+is_equal_double:
+ if (d1 == d2) {
+ goto is_equal_true;
} else {
- break;
+ goto is_equal_false;
+ }
+ } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = (double)Z_LVAL_P(op2);
+ goto is_equal_double;
+ }
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
+ if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
+ int result = zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2));
+ if (IS_CV & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_str(op1);
+ }
+ if (IS_CV & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_str(op2);
+ }
+ if (result) {
+ goto is_equal_true;
+ } else {
+ goto is_equal_false;
}
- } 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_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);
-
-
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+ ZEND_VM_TAIL_CALL(zend_is_equal_helper_SPEC(op1, op2 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-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_NOT_EQUAL_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zval *op1, *op2, *result;
+ zval *op1, *op2;
+ double d1, d2;
op1 = EX_VAR(opline->op1.var);
op2 = EX_VAR(opline->op2.var);
- do {
- int result;
+ if (1 && IS_CV == IS_CONST && IS_CV == IS_CONST) {
+ /* pass */
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_LVAL_P(op1) != Z_LVAL_P(op2))) {
+is_not_equal_true:
+
+ ZVAL_TRUE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
+ } else {
+is_not_equal_false:
- 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));
+ ZVAL_FALSE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
+ }
+ } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ d1 = (double)Z_LVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+ goto is_not_equal_double;
+ }
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+is_not_equal_double:
+ if (d1 != d2) {
+ goto is_not_equal_true;
} else {
- break;
+ goto is_not_equal_false;
+ }
+ } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = (double)Z_LVAL_P(op2);
+ goto is_not_equal_double;
+ }
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
+ if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
+ int result = zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2));
+ if (IS_CV & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_str(op1);
}
- } 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)));
+ if (IS_CV & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_str(op2);
+ }
+ if (!result) {
+ goto is_not_equal_true;
} else {
- break;
+ goto is_not_equal_false;
}
- } 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_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);
-
-
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SPACESHIP_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
-
- 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);
- compare_function(EX_VAR(opline->result.var), op1, op2);
-
-
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+ ZEND_VM_TAIL_CALL(zend_is_not_equal_helper_SPEC(op1, op2 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-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_IS_NOT_EQUAL_SPEC_CV_CV_JMPZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zval *op1, *op2;
+ double d1, d2;
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));
- 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_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
- op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
+ if (1 && IS_CV == IS_CONST && IS_CV == IS_CONST) {
+ /* pass */
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_LVAL_P(op1) != Z_LVAL_P(op2))) {
+is_not_equal_true:
+ ZEND_VM_SMART_BRANCH_TRUE_JMPZ();
+ ZVAL_TRUE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
+ } else {
+is_not_equal_false:
+ ZEND_VM_SMART_BRANCH_FALSE_JMPZ();
+ ZVAL_FALSE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
+ }
+ } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ d1 = (double)Z_LVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+ goto is_not_equal_double;
+ }
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+is_not_equal_double:
+ if (d1 != d2) {
+ goto is_not_equal_true;
+ } else {
+ goto is_not_equal_false;
+ }
+ } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = (double)Z_LVAL_P(op2);
+ goto is_not_equal_double;
+ }
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
+ if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
+ int result = zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2));
+ if (IS_CV & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_str(op1);
+ }
+ if (IS_CV & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_str(op2);
+ }
+ if (!result) {
+ goto is_not_equal_true;
+ } else {
+ goto is_not_equal_false;
+ }
+ }
}
- bitwise_or_function(EX_VAR(opline->result.var), op1, op2);
-
-
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+ ZEND_VM_TAIL_CALL(zend_is_not_equal_helper_SPEC(op1, op2 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-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_IS_NOT_EQUAL_SPEC_CV_CV_JMPNZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zval *op1, *op2;
+ double d1, d2;
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));
- 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_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
- op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
+ if (1 && IS_CV == IS_CONST && IS_CV == IS_CONST) {
+ /* pass */
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
+ if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ if (EXPECTED(Z_LVAL_P(op1) != Z_LVAL_P(op2))) {
+is_not_equal_true:
+ ZEND_VM_SMART_BRANCH_TRUE_JMPNZ();
+ ZVAL_TRUE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
+ } else {
+is_not_equal_false:
+ ZEND_VM_SMART_BRANCH_FALSE_JMPNZ();
+ ZVAL_FALSE(EX_VAR(opline->result.var));
+ ZEND_VM_NEXT_OPCODE();
+ }
+ } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ d1 = (double)Z_LVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+ goto is_not_equal_double;
+ }
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
+ if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = Z_DVAL_P(op2);
+is_not_equal_double:
+ if (d1 != d2) {
+ goto is_not_equal_true;
+ } else {
+ goto is_not_equal_false;
+ }
+ } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+ d1 = Z_DVAL_P(op1);
+ d2 = (double)Z_LVAL_P(op2);
+ goto is_not_equal_double;
+ }
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
+ if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
+ int result = zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2));
+ if (IS_CV & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_str(op1);
+ }
+ if (IS_CV & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_str(op2);
+ }
+ if (!result) {
+ goto is_not_equal_true;
+ } else {
+ goto is_not_equal_false;
+ }
+ }
}
- bitwise_and_function(EX_VAR(opline->result.var), op1, op2);
-
-
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+ ZEND_VM_TAIL_CALL(zend_is_not_equal_helper_SPEC(op1, op2 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
}
-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_SPACESHIP_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zval *op1, *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));
- 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_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);
+ 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);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
@@ -48623,17 +47537,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BOOL_XOR_SPEC_CV_CV_HANDLER(ZE
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_ASSIGN_OBJ_OP_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zend_free_op free_op_data1;
+ zend_free_op free_op_data;
zval *object;
zval *property;
zval *value;
zval *zptr;
+ void **cache_slot;
+ zend_property_info *prop_info;
SAVE_OPLINE();
- object = _get_zval_ptr_cv_BP_VAR_RW(opline->op1.var EXECUTE_DATA_CC);
+ 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));
@@ -48642,49 +47558,76 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP
property = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
do {
- value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data1);
+ value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data);
if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
- if (Z_ISREF_P(object)) {
+ if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) {
object = Z_REFVAL_P(object);
- if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
- goto assign_op_object;
- }
+ goto assign_op_object;
+ }
+ if (IS_CV == IS_CV
+ && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
+ ZVAL_UNDEFINED_OP1();
}
- if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
+ object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC);
+ if (UNEXPECTED(!object)) {
break;
}
}
- /* here we are sure we are dealing with an object */
assign_op_object:
- if (EXPECTED(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)) {
+ /* here we are sure we are dealing with an object */
+ cache_slot = (IS_CV == IS_CONST) ? CACHE_ADDR((opline+1)->extended_value) : NULL;
+ if (EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, cache_slot)) != NULL)) {
if (UNEXPECTED(Z_ISERROR_P(zptr))) {
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_NULL(EX_VAR(opline->result.var));
}
} else {
- ZVAL_DEREF(zptr);
+ zval *orig_zptr = zptr;
+ zend_reference *ref;
+
+ do {
+ if (UNEXPECTED(Z_ISREF_P(zptr))) {
+ ref = Z_REF_P(zptr);
+ zptr = Z_REFVAL_P(zptr);
+ if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) {
+ zend_binary_assign_op_typed_ref(ref, value OPLINE_CC EXECUTE_DATA_CC);
+ break;
+ }
+ }
+
+ if (IS_CV == IS_CONST) {
+ prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2);
+ } else {
+ prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(object), orig_zptr);
+ }
+ if (UNEXPECTED(prop_info)) {
+ /* special case for typed properties */
+ zend_binary_assign_op_typed_prop(prop_info, zptr, value OPLINE_CC EXECUTE_DATA_CC);
+ } else {
+ zend_binary_op(zptr, zptr, value OPLINE_CC);
+ }
+ } while (0);
- binary_op(zptr, zptr, value);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), zptr);
}
}
} else {
- zend_assign_op_overloaded_property(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR((opline+1)->extended_value) : NULL), value, binary_op OPLINE_CC EXECUTE_DATA_CC);
+ zend_assign_op_overloaded_property(object, property, cache_slot, value OPLINE_CC EXECUTE_DATA_CC);
}
} while (0);
- FREE_OP(free_op_data1);
+ FREE_OP(free_op_data);
/* assign_obj has two opcodes! */
ZEND_VM_NEXT_OPCODE_EX(1, 2);
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SPEC_CV_CV(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC)
+/* No specialization for op_types (CONST|TMP|VAR|CV, UNUSED|CONST|TMPVAR) */
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_OP_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zend_free_op free_op_data1;
@@ -48714,67 +47657,61 @@ assign_dim_op_new_array:
if (UNEXPECTED(!var_ptr)) {
goto assign_dim_op_ret_null;
}
- ZVAL_DEREF(var_ptr);
}
value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data1);
- binary_op(var_ptr, var_ptr, value);
+ do {
+ if (IS_CV != IS_UNUSED && UNEXPECTED(Z_ISREF_P(var_ptr))) {
+ zend_reference *ref = Z_REF_P(var_ptr);
+ var_ptr = Z_REFVAL_P(var_ptr);
+ if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) {
+ zend_binary_assign_op_typed_ref(ref, value OPLINE_CC EXECUTE_DATA_CC);
+ break;
+ }
+ }
+ zend_binary_op(var_ptr, var_ptr, value OPLINE_CC);
+ } while (0);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);
}
+ FREE_OP(free_op_data1);
} 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_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_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);
+ zend_binary_assign_op_obj_dim(container, dim OPLINE_CC EXECUTE_DATA_CC);
+ } else if (EXPECTED(Z_TYPE_P(container) <= IS_FALSE)) {
+ if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(container) == IS_UNDEF)) {
+ ZVAL_UNDEFINED_OP1();
+ }
+ ZVAL_ARR(container, zend_new_array(8));
+ goto assign_dim_op_new_array;
} else {
- if (UNEXPECTED(Z_TYPE_P(container) == IS_STRING)) {
- if (IS_CV == 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_CV != IS_VAR || EXPECTED(!Z_ISERROR_P(container)))) {
- zend_use_scalar_as_array();
- }
+ zend_binary_assign_op_dim_slow(container, dim OPLINE_CC EXECUTE_DATA_CC);
assign_dim_op_ret_null:
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
+ 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);
}
}
- 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_ASSIGN_OP_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -48790,9 +47727,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_simple_helper
ZVAL_NULL(EX_VAR(opline->result.var));
}
} else {
- ZVAL_DEREF(var_ptr);
-
- binary_op(var_ptr, var_ptr, value);
+ do {
+ if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) {
+ zend_reference *ref = Z_REF_P(var_ptr);
+ var_ptr = Z_REFVAL_P(var_ptr);
+ if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) {
+ zend_binary_assign_op_typed_ref(ref, value OPLINE_CC EXECUTE_DATA_CC);
+ break;
+ }
+ }
+ zend_binary_op(var_ptr, var_ptr, value OPLINE_CC);
+ } while (0);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);
@@ -48803,265 +47748,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_simple_helper
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)
-{
-#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
-# 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));
- }
- 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
-
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_CV_CV(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)
-{
-#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
-# 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));
- }
- 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
-
- ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_CV_CV(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)
-{
-#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
-# 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));
- }
- 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
-
- 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_ASSIGN_ADD_SPEC_CV_CV_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));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_CV_CV_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));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_CV_CV_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));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SUB_SPEC_CV_CV_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));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SUB_SPEC_CV_CV_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));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SUB_SPEC_CV_CV_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));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MUL_SPEC_CV_CV_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));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MUL_SPEC_CV_CV_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));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MUL_SPEC_CV_CV_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));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIV_SPEC_CV_CV_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));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIV_SPEC_CV_CV_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));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIV_SPEC_CV_CV_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));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MOD_SPEC_CV_CV_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));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MOD_SPEC_CV_CV_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));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MOD_SPEC_CV_CV_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));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SL_SPEC_CV_CV_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));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SL_SPEC_CV_CV_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));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SL_SPEC_CV_CV_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));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SR_SPEC_CV_CV_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));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SR_SPEC_CV_CV_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));
-}
-
-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));
-}
-
-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));
-}
-
-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_ASSIGN_CONCAT_SPEC_CV_CV_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));
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_OR_SPEC_CV_CV_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));
-}
-
-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_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_ASSIGN_BW_OR_SPEC_CV_CV_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));
-}
-
-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_ASSIGN_BW_AND_SPEC_CV_CV_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));
-}
-
-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_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_ASSIGN_BW_XOR_SPEC_CV_CV_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));
-}
-
-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));
-}
-
-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));
-}
-
-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));
-}
-
-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));
-}
-
-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_pre_incdec_property_helper_SPEC_CV_CV(int inc ZEND_OPCODE_HANDLER_ARGS_DC)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_OBJ_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zval *object;
zval *property;
zval *zptr;
+ void **cache_slot;
+ zend_property_info *prop_info;
SAVE_OPLINE();
- object = _get_zval_ptr_cv_BP_VAR_RW(opline->op1.var EXECUTE_DATA_CC);
+ 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));
@@ -49071,47 +47769,38 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE
do {
if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
- if (Z_ISREF_P(object)) {
+ if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) {
object = Z_REFVAL_P(object);
- if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
- goto pre_incdec_object;
- }
+ goto pre_incdec_object;
}
- if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
+ if (IS_CV == IS_CV
+ && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
+ ZVAL_UNDEFINED_OP1();
+ }
+ object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC);
+ if (UNEXPECTED(!object)) {
break;
}
}
- /* here we are sure we are dealing with an object */
pre_incdec_object:
- if (EXPECTED(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)) {
+ /* here we are sure we are dealing with an object */
+ cache_slot = (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL;
+ if (EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, cache_slot)) != NULL)) {
if (UNEXPECTED(Z_ISERROR_P(zptr))) {
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_NULL(EX_VAR(opline->result.var));
}
} else {
- if (EXPECTED(Z_TYPE_P(zptr) == IS_LONG)) {
- if (inc) {
- fast_long_increment_function(zptr);
- } else {
- fast_long_decrement_function(zptr);
- }
+ if (IS_CV == IS_CONST) {
+ prop_info = (zend_property_info *) CACHED_PTR_EX(cache_slot + 2);
} else {
- ZVAL_DEREF(zptr);
-
- if (inc) {
- increment_function(zptr);
- } else {
- decrement_function(zptr);
- }
- }
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY(EX_VAR(opline->result.var), zptr);
+ prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(object), zptr);
}
+ zend_pre_incdec_property_zval(zptr, prop_info OPLINE_CC EXECUTE_DATA_CC);
}
} else {
- zend_pre_incdec_overloaded_property(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), inc OPLINE_CC EXECUTE_DATA_CC);
+ zend_pre_incdec_overloaded_property(object, property, cache_slot OPLINE_CC EXECUTE_DATA_CC);
}
} while (0);
@@ -49119,26 +47808,18 @@ pre_incdec_object:
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)
-{
- ZEND_VM_TAIL_CALL(zend_pre_incdec_property_helper_SPEC_CV_CV(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)
-{
- 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_post_incdec_property_helper_SPEC_CV_CV(int inc ZEND_OPCODE_HANDLER_ARGS_DC)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_OBJ_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zval *object;
zval *property;
zval *zptr;
+ void **cache_slot;
+ zend_property_info *prop_info;
SAVE_OPLINE();
- object = _get_zval_ptr_cv_BP_VAR_RW(opline->op1.var EXECUTE_DATA_CC);
+ 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));
@@ -49148,43 +47829,37 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP
do {
if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
- if (Z_ISREF_P(object)) {
+ if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) {
object = Z_REFVAL_P(object);
- if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
- goto post_incdec_object;
- }
+ goto post_incdec_object;
+ }
+ if (IS_CV == IS_CV
+ && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
+ ZVAL_UNDEFINED_OP1();
}
- if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
+ object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC);
+ if (UNEXPECTED(!object)) {
break;
}
}
- /* here we are sure we are dealing with an object */
post_incdec_object:
- if (EXPECTED(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)) {
+ /* here we are sure we are dealing with an object */
+ cache_slot = (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL;
+ if (EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, cache_slot)) != NULL)) {
if (UNEXPECTED(Z_ISERROR_P(zptr))) {
ZVAL_NULL(EX_VAR(opline->result.var));
} else {
- if (EXPECTED(Z_TYPE_P(zptr) == IS_LONG)) {
- ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(zptr));
- if (inc) {
- fast_long_increment_function(zptr);
- } else {
- fast_long_decrement_function(zptr);
- }
+ if (IS_CV == IS_CONST) {
+ prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2);
} else {
- ZVAL_DEREF(zptr);
- ZVAL_COPY(EX_VAR(opline->result.var), zptr);
- if (inc) {
- increment_function(zptr);
- } else {
- decrement_function(zptr);
- }
+ prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(object), zptr);
}
+
+ zend_post_incdec_property_zval(zptr, prop_info OPLINE_CC EXECUTE_DATA_CC);
}
} else {
- zend_post_incdec_overloaded_property(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), inc OPLINE_CC EXECUTE_DATA_CC);
+ zend_post_incdec_overloaded_property(object, property, cache_slot OPLINE_CC EXECUTE_DATA_CC);
}
} while (0);
@@ -49192,21 +47867,11 @@ post_incdec_object:
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)
-{
- 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_POST_DEC_OBJ_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- 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_FETCH_DIM_R_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zval *container, *dim, *value, *result;
+ zval *container, *dim, *value;
SAVE_OPLINE();
container = EX_VAR(opline->op1.var);
@@ -49215,8 +47880,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_R_SPEC_CV_CV_HANDLER
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);
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value);
} else if (EXPECTED(Z_TYPE_P(container) == IS_REFERENCE)) {
container = Z_REFVAL_P(container);
if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
@@ -49289,6 +47953,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_IS_SPEC_CV_CV_HANDLE
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
+#if 0
+ USE_OPLINE
+#endif
+
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));
@@ -49347,12 +48015,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_CV_HANDLER
}
}
if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
- GET_OP1_UNDEF_CV(container, BP_VAR_R);
+ ZVAL_UNDEFINED_OP1();
}
if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(offset) == IS_UNDEF)) {
- GET_OP2_UNDEF_CV(offset, BP_VAR_R);
+ ZVAL_UNDEFINED_OP2();
}
- goto fetch_obj_r_no_object;
+ zend_wrong_property_read(offset);
+ ZVAL_NULL(EX_VAR(opline->result.var));
+ goto fetch_obj_r_finish;
} while (0);
}
@@ -49362,7 +48032,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_CV_HANDLER
zval *retval;
if (IS_CV == IS_CONST) {
- cache_slot = CACHE_ADDR(opline->extended_value);
+ cache_slot = CACHE_ADDR(opline->extended_value & ~ZEND_FETCH_REF /* FUNC_ARG fetch may contain it */);
if (EXPECTED(zobj->ce == CACHED_PTR_EX(cache_slot))) {
uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1);
@@ -49370,8 +48040,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_CV_HANDLER
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;
+ if (0 || (IS_CV & (IS_TMP_VAR|IS_VAR)) != 0) {
+ goto fetch_obj_r_copy;
+ } else {
+fetch_obj_r_fast_copy:
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
+ ZEND_VM_NEXT_OPCODE();
+ }
}
} else if (EXPECTED(zobj->properties != NULL)) {
if (!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET(prop_offset)) {
@@ -49385,8 +48060,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_CV_HANDLER
(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;
+ retval = &p->val;
+ if (0 || (IS_CV & (IS_TMP_VAR|IS_VAR)) != 0) {
+ goto fetch_obj_r_copy;
+ } else {
+ goto fetch_obj_r_fast_copy;
+ }
}
}
CACHE_PTR_EX(cache_slot + 1, (void*)ZEND_DYNAMIC_PROPERTY_OFFSET);
@@ -49395,30 +48074,30 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_CV_HANDLER
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;
+ if (0 || (IS_CV & (IS_TMP_VAR|IS_VAR)) != 0) {
+ goto fetch_obj_r_copy;
+ } else {
+ goto fetch_obj_r_fast_copy;
+ }
}
}
}
} else if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(offset) == IS_UNDEF)) {
- GET_OP2_UNDEF_CV(offset, BP_VAR_R);
+ ZVAL_UNDEFINED_OP2();
}
- 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));
+ 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);
- }
+ if (retval != EX_VAR(opline->result.var)) {
+fetch_obj_r_copy:
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
+ } else if (UNEXPECTED(Z_ISREF_P(retval))) {
+ zend_unwrap_reference(retval);
}
} while (0);
+fetch_obj_r_finish:
+
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
@@ -49438,7 +48117,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_CV_HANDLER
property = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
result = EX_VAR(opline->result.var);
- zend_fetch_property_address(result, container, IS_CV, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_W OPLINE_CC);
+ zend_fetch_property_address(
+ result, container, IS_CV, property, IS_CV,
+ ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_FETCH_OBJ_FLAGS) : NULL),
+ BP_VAR_W, opline->extended_value & ZEND_FETCH_OBJ_FLAGS, 1 OPLINE_CC EXECUTE_DATA_CC);
if (IS_CV == IS_VAR) {
FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result);
@@ -49453,14 +48135,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_CV_CV_HANDLE
zval *property, *container, *result;
SAVE_OPLINE();
- container = _get_zval_ptr_cv_BP_VAR_RW(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);
result = EX_VAR(opline->result.var);
- zend_fetch_property_address(result, container, IS_CV, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_RW OPLINE_CC);
+ zend_fetch_property_address(result, container, IS_CV, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_RW, 0, 1 OPLINE_CC EXECUTE_DATA_CC);
if (IS_CV == IS_VAR) {
FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result);
@@ -49495,7 +48177,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_CV_CV_HANDLE
break;
}
}
- goto fetch_obj_is_no_object;
+ ZVAL_NULL(EX_VAR(opline->result.var));
+ goto fetch_obj_is_finish;
} while (0);
}
@@ -49513,8 +48196,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_CV_CV_HANDLE
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;
+ if (0 || (IS_CV & (IS_TMP_VAR|IS_VAR)) != 0) {
+ goto fetch_obj_is_copy;
+ } else {
+fetch_obj_is_fast_copy:
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
+ ZEND_VM_NEXT_OPCODE();
+ }
}
} else if (EXPECTED(zobj->properties != NULL)) {
if (!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET(prop_offset)) {
@@ -49528,8 +48216,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_CV_CV_HANDLE
(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;
+ retval = &p->val;
+ if (0 || (IS_CV & (IS_TMP_VAR|IS_VAR)) != 0) {
+ goto fetch_obj_is_copy;
+ } else {
+ goto fetch_obj_is_fast_copy;
+ }
}
}
CACHE_PTR_EX(cache_slot + 1, (void*)ZEND_DYNAMIC_PROPERTY_OFFSET);
@@ -49538,38 +48230,43 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_CV_CV_HANDLE
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 (0 || (IS_CV & (IS_TMP_VAR|IS_VAR)) != 0) {
+ goto fetch_obj_is_copy;
+ } else {
+ goto fetch_obj_is_fast_copy;
+ }
}
}
}
}
- 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));
+ 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);
- }
+ if (retval != EX_VAR(opline->result.var)) {
+fetch_obj_is_copy:
+ ZVAL_COPY_DEREF(EX_VAR(opline->result.var), retval);
+ } else if (UNEXPECTED(Z_ISREF_P(retval))) {
+ zend_unwrap_reference(retval);
}
} while (0);
+fetch_obj_is_finish:
+
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)
{
+#if 0
+ USE_OPLINE
+#endif
+
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_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));
@@ -49583,7 +48280,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_CV_CV_HAN
zval *container, *property, *result;
SAVE_OPLINE();
- container = _get_zval_ptr_cv_BP_VAR_UNSET(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));
@@ -49591,7 +48288,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_CV_CV_HAN
property = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
result = EX_VAR(opline->result.var);
- zend_fetch_property_address(result, container, IS_CV, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_UNSET OPLINE_CC);
+ zend_fetch_property_address(result, container, IS_CV, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_UNSET, 0, 1 OPLINE_CC EXECUTE_DATA_CC);
if (IS_CV == IS_VAR) {
FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result);
@@ -49616,34 +48313,52 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_
value = RT_CONSTANT((opline+1), (opline+1)->op1);
if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
- if (Z_ISREF_P(object)) {
+ if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) {
object = Z_REFVAL_P(object);
- if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
- goto assign_object;
- }
+ goto assign_object;
}
- if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
-
- goto exit_assign_obj;
+ object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC);
+ if (UNEXPECTED(!object)) {
+ value = &EG(uninitialized_zval);
+ goto free_and_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*));
+ void **cache_slot = CACHE_ADDR(opline->extended_value);
+ uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1);
zend_object *zobj = Z_OBJ_P(object);
zval *property_val;
if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
property_val = OBJ_PROP(zobj, prop_offset);
if (Z_TYPE_P(property_val) != IS_UNDEF) {
+ zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2);
+
+ if (UNEXPECTED(prop_info != NULL)) {
+ zend_uchar orig_type = IS_UNDEF;
+
+ if (IS_CONST == IS_CONST) {
+ orig_type = Z_TYPE_P(value);
+ }
+
+ value = zend_assign_to_typed_prop(prop_info, property_val, value EXECUTE_DATA_CC);
+
+ /* will remain valid, thus no need to check prop_info in future here */
+ if (IS_CONST == IS_CONST && Z_TYPE_P(value) == orig_type) {
+ CACHE_PTR_EX(cache_slot + 2, NULL);
+ }
+ goto free_and_exit_assign_obj;
+ } else {
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);
+ value = zend_assign_to_variable(property_val, value, IS_CONST, EX_USES_STRICT_TYPES());
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+ ZVAL_COPY(EX_VAR(opline->result.var), value);
+ }
+ goto exit_assign_obj;
}
- goto exit_assign_obj;
}
} else {
if (EXPECTED(zobj->properties != NULL)) {
@@ -49697,18 +48412,13 @@ fast_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_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL);
+ value = Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL);
+free_and_exit_assign_obj:
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
}
@@ -49720,6 +48430,7 @@ exit_assign_obj:
ZEND_VM_NEXT_OPCODE_EX(1, 2);
}
+/* No specialization for op_types (CONST|TMPVAR|CV, UNUSED|CONST|VAR) */
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -49737,34 +48448,52 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_
value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
- if (Z_ISREF_P(object)) {
+ if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) {
object = Z_REFVAL_P(object);
- if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
- goto assign_object;
- }
+ goto assign_object;
}
- if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
- zval_ptr_dtor_nogc(free_op_data);
- goto exit_assign_obj;
+ object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC);
+ if (UNEXPECTED(!object)) {
+ value = &EG(uninitialized_zval);
+ goto free_and_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*));
+ void **cache_slot = CACHE_ADDR(opline->extended_value);
+ uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1);
zend_object *zobj = Z_OBJ_P(object);
zval *property_val;
if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
property_val = OBJ_PROP(zobj, prop_offset);
if (Z_TYPE_P(property_val) != IS_UNDEF) {
+ zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2);
+
+ if (UNEXPECTED(prop_info != NULL)) {
+ zend_uchar orig_type = IS_UNDEF;
+
+ if (IS_TMP_VAR == IS_CONST) {
+ orig_type = Z_TYPE_P(value);
+ }
+
+ value = zend_assign_to_typed_prop(prop_info, property_val, value EXECUTE_DATA_CC);
+
+ /* will remain valid, thus no need to check prop_info in future here */
+ if (IS_TMP_VAR == IS_CONST && Z_TYPE_P(value) == orig_type) {
+ CACHE_PTR_EX(cache_slot + 2, NULL);
+ }
+ goto free_and_exit_assign_obj;
+ } else {
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);
+ value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES());
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+ ZVAL_COPY(EX_VAR(opline->result.var), value);
+ }
+ goto exit_assign_obj;
}
- goto exit_assign_obj;
}
} else {
if (EXPECTED(zobj->properties != NULL)) {
@@ -49818,18 +48547,13 @@ fast_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_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL);
+ value = Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL);
+free_and_exit_assign_obj:
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
}
@@ -49841,6 +48565,7 @@ exit_assign_obj:
ZEND_VM_NEXT_OPCODE_EX(1, 2);
}
+/* No specialization for op_types (CONST|TMPVAR|CV, UNUSED|CONST|VAR) */
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -49858,34 +48583,52 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_
value = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
- if (Z_ISREF_P(object)) {
+ if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) {
object = Z_REFVAL_P(object);
- if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
- goto assign_object;
- }
+ goto assign_object;
}
- if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
- zval_ptr_dtor_nogc(free_op_data);
- goto exit_assign_obj;
+ object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC);
+ if (UNEXPECTED(!object)) {
+ value = &EG(uninitialized_zval);
+ goto free_and_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*));
+ void **cache_slot = CACHE_ADDR(opline->extended_value);
+ uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1);
zend_object *zobj = Z_OBJ_P(object);
zval *property_val;
if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
property_val = OBJ_PROP(zobj, prop_offset);
if (Z_TYPE_P(property_val) != IS_UNDEF) {
+ zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2);
+
+ if (UNEXPECTED(prop_info != NULL)) {
+ zend_uchar orig_type = IS_UNDEF;
+
+ if (IS_VAR == IS_CONST) {
+ orig_type = Z_TYPE_P(value);
+ }
+
+ value = zend_assign_to_typed_prop(prop_info, property_val, value EXECUTE_DATA_CC);
+
+ /* will remain valid, thus no need to check prop_info in future here */
+ if (IS_VAR == IS_CONST && Z_TYPE_P(value) == orig_type) {
+ CACHE_PTR_EX(cache_slot + 2, NULL);
+ }
+ goto free_and_exit_assign_obj;
+ } else {
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);
+ value = zend_assign_to_variable(property_val, value, IS_VAR, EX_USES_STRICT_TYPES());
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+ ZVAL_COPY(EX_VAR(opline->result.var), value);
+ }
+ goto exit_assign_obj;
}
- goto exit_assign_obj;
}
} else {
if (EXPECTED(zobj->properties != NULL)) {
@@ -49939,18 +48682,13 @@ fast_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_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL);
+ value = Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL);
+free_and_exit_assign_obj:
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
}
@@ -49962,6 +48700,7 @@ exit_assign_obj:
ZEND_VM_NEXT_OPCODE_EX(1, 2);
}
+/* No specialization for op_types (CONST|TMPVAR|CV, UNUSED|CONST|VAR) */
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -49979,34 +48718,52 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_
value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC);
if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
- if (Z_ISREF_P(object)) {
+ if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) {
object = Z_REFVAL_P(object);
- if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
- goto assign_object;
- }
+ goto assign_object;
}
- if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) {
-
- goto exit_assign_obj;
+ object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC);
+ if (UNEXPECTED(!object)) {
+ value = &EG(uninitialized_zval);
+ goto free_and_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*));
+ void **cache_slot = CACHE_ADDR(opline->extended_value);
+ uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1);
zend_object *zobj = Z_OBJ_P(object);
zval *property_val;
if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
property_val = OBJ_PROP(zobj, prop_offset);
if (Z_TYPE_P(property_val) != IS_UNDEF) {
+ zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2);
+
+ if (UNEXPECTED(prop_info != NULL)) {
+ zend_uchar orig_type = IS_UNDEF;
+
+ if (IS_CV == IS_CONST) {
+ orig_type = Z_TYPE_P(value);
+ }
+
+ value = zend_assign_to_typed_prop(prop_info, property_val, value EXECUTE_DATA_CC);
+
+ /* will remain valid, thus no need to check prop_info in future here */
+ if (IS_CV == IS_CONST && Z_TYPE_P(value) == orig_type) {
+ CACHE_PTR_EX(cache_slot + 2, NULL);
+ }
+ goto free_and_exit_assign_obj;
+ } else {
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);
+ value = zend_assign_to_variable(property_val, value, IS_CV, EX_USES_STRICT_TYPES());
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+ ZVAL_COPY(EX_VAR(opline->result.var), value);
+ }
+ goto exit_assign_obj;
}
- goto exit_assign_obj;
}
} else {
if (EXPECTED(zobj->properties != NULL)) {
@@ -50060,18 +48817,13 @@ fast_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_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL);
+ value = Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL);
+free_and_exit_assign_obj:
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
}
@@ -50083,30 +48835,30 @@ exit_assign_obj:
ZEND_VM_NEXT_OPCODE_EX(1, 2);
}
+/* No specialization for op_types (CONST|TMPVAR|CV, UNUSED|CONST|VAR) */
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zval *object_ptr;
+ zval *object_ptr, *orig_object_ptr;
zend_free_op free_op_data;
zval *value;
zval *variable_ptr;
zval *dim;
SAVE_OPLINE();
- object_ptr = EX_VAR(opline->op1.var);
+ orig_object_ptr = object_ptr = EX_VAR(opline->op1.var);
if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) {
try_assign_dim_array:
+ value = RT_CONSTANT((opline+1), (opline+1)->op1);
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)) {
-
zend_cannot_add_element();
goto assign_dim_error;
} else if (IS_CONST == IS_CV) {
@@ -50135,8 +48887,7 @@ 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 = zend_assign_to_variable(variable_ptr, value, IS_CONST, EX_USES_STRICT_TYPES());
}
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
@@ -50161,9 +48912,7 @@ try_assign_dim_array:
if (IS_CV == 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 = RT_CONSTANT((opline+1), (opline+1)->op1);
@@ -50171,8 +48920,16 @@ try_assign_dim_array:
}
} else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) {
- ZVAL_ARR(object_ptr, zend_new_array(8));
- goto try_assign_dim_array;
+ if (Z_ISREF_P(orig_object_ptr)
+ && ZEND_REF_HAS_TYPE_SOURCES(Z_REF_P(orig_object_ptr))
+ && !zend_verify_ref_array_assignable(Z_REF_P(orig_object_ptr))) {
+ dim = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
+
+ UNDEF_RESULT();
+ } else {
+ 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();
@@ -50197,26 +48954,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_
{
USE_OPLINE
- zval *object_ptr;
+ zval *object_ptr, *orig_object_ptr;
zend_free_op free_op_data;
zval *value;
zval *variable_ptr;
zval *dim;
SAVE_OPLINE();
- object_ptr = EX_VAR(opline->op1.var);
+ orig_object_ptr = object_ptr = EX_VAR(opline->op1.var);
if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) {
try_assign_dim_array:
+ value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
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);
}
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) {
@@ -50245,8 +49001,7 @@ 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 = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR, EX_USES_STRICT_TYPES());
}
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
@@ -50272,9 +49027,7 @@ try_assign_dim_array:
if (IS_CV == 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);
value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
@@ -50282,8 +49035,16 @@ try_assign_dim_array:
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;
+ if (Z_ISREF_P(orig_object_ptr)
+ && ZEND_REF_HAS_TYPE_SOURCES(Z_REF_P(orig_object_ptr))
+ && !zend_verify_ref_array_assignable(Z_REF_P(orig_object_ptr))) {
+ dim = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
+ zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
+ UNDEF_RESULT();
+ } else {
+ 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();
@@ -50308,26 +49069,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_
{
USE_OPLINE
- zval *object_ptr;
+ zval *object_ptr, *orig_object_ptr;
zend_free_op free_op_data;
zval *value;
zval *variable_ptr;
zval *dim;
SAVE_OPLINE();
- object_ptr = EX_VAR(opline->op1.var);
+ orig_object_ptr = object_ptr = EX_VAR(opline->op1.var);
if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) {
try_assign_dim_array:
+ value = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
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);
}
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) {
@@ -50356,8 +49116,7 @@ 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 = zend_assign_to_variable(variable_ptr, value, IS_VAR, EX_USES_STRICT_TYPES());
}
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
@@ -50383,9 +49142,7 @@ try_assign_dim_array:
if (IS_CV == 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);
value = _get_zval_ptr_var_deref((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
@@ -50393,8 +49150,16 @@ try_assign_dim_array:
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;
+ if (Z_ISREF_P(orig_object_ptr)
+ && ZEND_REF_HAS_TYPE_SOURCES(Z_REF_P(orig_object_ptr))
+ && !zend_verify_ref_array_assignable(Z_REF_P(orig_object_ptr))) {
+ dim = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
+ zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
+ UNDEF_RESULT();
+ } else {
+ 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();
@@ -50419,26 +49184,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_
{
USE_OPLINE
- zval *object_ptr;
+ zval *object_ptr, *orig_object_ptr;
zend_free_op free_op_data;
zval *value;
zval *variable_ptr;
zval *dim;
SAVE_OPLINE();
- object_ptr = EX_VAR(opline->op1.var);
+ orig_object_ptr = object_ptr = EX_VAR(opline->op1.var);
if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) {
try_assign_dim_array:
+ value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC);
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);
}
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) {
@@ -50467,8 +49231,7 @@ 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 = zend_assign_to_variable(variable_ptr, value, IS_CV, EX_USES_STRICT_TYPES());
}
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
@@ -50493,9 +49256,7 @@ try_assign_dim_array:
if (IS_CV == 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 = _get_zval_ptr_cv_deref_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC);
@@ -50503,8 +49264,16 @@ try_assign_dim_array:
}
} else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) {
- ZVAL_ARR(object_ptr, zend_new_array(8));
- goto try_assign_dim_array;
+ if (Z_ISREF_P(orig_object_ptr)
+ && ZEND_REF_HAS_TYPE_SOURCES(Z_REF_P(orig_object_ptr))
+ && !zend_verify_ref_array_assignable(Z_REF_P(orig_object_ptr))) {
+ dim = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
+
+ UNDEF_RESULT();
+ } else {
+ 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();
@@ -50542,7 +49311,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SPEC_CV_CV_RETVAL_UNUSE
ZVAL_NULL(EX_VAR(opline->result.var));
}
} else {
- value = zend_assign_to_variable(variable_ptr, value, IS_CV);
+ value = zend_assign_to_variable(variable_ptr, value, IS_CV, EX_USES_STRICT_TYPES());
if (UNEXPECTED(0)) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
}
@@ -50570,7 +49339,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SPEC_CV_CV_RETVAL_USED_
ZVAL_NULL(EX_VAR(opline->result.var));
}
} else {
- value = zend_assign_to_variable(variable_ptr, value, IS_CV);
+ value = zend_assign_to_variable(variable_ptr, value, IS_CV, EX_USES_STRICT_TYPES());
if (UNEXPECTED(1)) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
}
@@ -50597,26 +49366,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_CV_CV_HANDLER(
} else if (IS_CV == IS_VAR &&
UNEXPECTED(Z_TYPE_P(EX_VAR(opline->op1.var)) != IS_INDIRECT)) {
- zend_throw_error(NULL, "Cannot assign by reference to overloaded object");
-
-
- UNDEF_RESULT();
- HANDLE_EXCEPTION();
+ zend_throw_error(NULL, "Cannot assign by reference to an array dimension of an object");
+ variable_ptr = &EG(uninitialized_zval);
} else if (IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) {
variable_ptr = &EG(uninitialized_zval);
} else if (IS_CV == IS_VAR &&
opline->extended_value == ZEND_RETURNS_FUNCTION &&
UNEXPECTED(!Z_ISREF_P(value_ptr))) {
- if (UNEXPECTED(!zend_wrong_assign_to_variable_reference(variable_ptr, value_ptr, IS_CV OPLINE_CC EXECUTE_DATA_CC))) {
-
- UNDEF_RESULT();
- HANDLE_EXCEPTION();
+ if (UNEXPECTED(!zend_wrong_assign_to_variable_reference(variable_ptr, value_ptr OPLINE_CC EXECUTE_DATA_CC))) {
+ variable_ptr = &EG(uninitialized_zval);
}
-
- /* op2 freed by assign_to_variable */
-
- ZEND_VM_NEXT_OPCODE();
} else {
zend_assign_to_variable_reference(variable_ptr, value_ptr);
}
@@ -50629,6 +49389,90 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_CV_CV_HANDLER(
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op_data;
+ zval *property, *container, *value_ptr;
+
+ SAVE_OPLINE();
+
+ container = EX_VAR(opline->op1.var);
+
+ if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
+ ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
+ }
+
+ property = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
+
+ value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
+
+ if (1) {
+ if (IS_CV == IS_UNUSED) {
+ if (IS_CV == IS_CONST) {
+ zend_assign_to_property_reference_this_const(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ } else {
+ zend_assign_to_property_reference_this_var(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ }
+ } else {
+ if (IS_CV == IS_CONST) {
+ zend_assign_to_property_reference_var_const(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ } else {
+ zend_assign_to_property_reference_var_var(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ }
+ }
+ } else {
+ zend_assign_to_property_reference(container, IS_CV, property, IS_CV, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ }
+
+
+ if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);};
+ ZEND_VM_NEXT_OPCODE_EX(1, 2);
+}
+
+/* No specialization for op_types (CONST|TMPVAR|CV, UNUSED|CONST|VAR) */
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+
+ zval *property, *container, *value_ptr;
+
+ SAVE_OPLINE();
+
+ container = EX_VAR(opline->op1.var);
+
+ if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
+ ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
+ }
+
+ property = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
+
+ value_ptr = _get_zval_ptr_cv_BP_VAR_W((opline+1)->op1.var EXECUTE_DATA_CC);
+
+ if (1) {
+ if (IS_CV == IS_UNUSED) {
+ if (IS_CV == IS_CONST) {
+ zend_assign_to_property_reference_this_const(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ } else {
+ zend_assign_to_property_reference_this_var(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ }
+ } else {
+ if (IS_CV == IS_CONST) {
+ zend_assign_to_property_reference_var_const(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ } else {
+ zend_assign_to_property_reference_var_var(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ }
+ }
+ } else {
+ zend_assign_to_property_reference(container, IS_CV, property, IS_CV, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ }
+
+
+
+ ZEND_VM_NEXT_OPCODE_EX(1, 2);
+}
+
+/* No specialization for op_types (CONST|TMPVAR|CV, UNUSED|CONST|VAR) */
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FAST_CONCAT_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -50651,14 +49495,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FAST_CONCAT_SPEC_CV_CV_HANDLER
} else {
ZVAL_STR(EX_VAR(opline->result.var), op2_str);
}
-
+ if (IS_CV & (IS_TMP_VAR|IS_VAR)) {
+ zend_string_release_ex(op1_str, 0);
+ }
} 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 {
ZVAL_STR(EX_VAR(opline->result.var), op1_str);
}
-
+ if (IS_CV & (IS_TMP_VAR|IS_VAR)) {
+ zend_string_release_ex(op2_str, 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);
@@ -50666,14 +49514,20 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FAST_CONCAT_SPEC_CV_CV_HANDLER
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);
-
+ if (IS_CV & (IS_TMP_VAR|IS_VAR)) {
+ zend_string_release_ex(op2_str, 0);
+ }
} 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_TMP_VAR|IS_VAR)) {
+ zend_string_release_ex(op1_str, 0);
+ }
+ if (IS_CV & (IS_TMP_VAR|IS_VAR)) {
+ zend_string_release_ex(op2_str, 0);
+ }
}
ZEND_VM_NEXT_OPCODE();
}
@@ -50685,7 +49539,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FAST_CONCAT_SPEC_CV_CV_HANDLER
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);
+ ZVAL_UNDEFINED_OP1();
}
op1_str = zval_get_string_func(op1);
}
@@ -50695,7 +49549,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FAST_CONCAT_SPEC_CV_CV_HANDLER
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);
+ ZVAL_UNDEFINED_OP2();
}
op2_str = zval_get_string_func(op2);
}
@@ -50773,7 +49627,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CV_CV_HA
break;
}
} else if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(function_name) == IS_UNDEF)) {
- GET_OP2_UNDEF_CV(function_name, BP_VAR_R);
+ ZVAL_UNDEFINED_OP2();
if (UNEXPECTED(EG(exception) != NULL)) {
HANDLE_EXCEPTION();
@@ -50796,7 +49650,7 @@ 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);
+ object = ZVAL_UNDEFINED_OP1();
if (UNEXPECTED(EG(exception) != NULL)) {
if (IS_CV != IS_CONST) {
@@ -50824,13 +49678,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CV_CV_HA
} else {
zend_object *orig_obj = obj;
- if (UNEXPECTED(obj->handlers->get_method == NULL)) {
- zend_throw_error(NULL, "Object does not support method calls");
-
-
- HANDLE_EXCEPTION();
- }
-
if (IS_CV == IS_CONST) {
function_name = EX_VAR(opline->op2.var);
}
@@ -50855,7 +49702,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CV_CV_HA
/* Reset "object" to trigger reference counting */
object = NULL;
}
- if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
+ if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!RUN_TIME_CACHE(&fbc->op_array))) {
init_func_run_time_cache(&fbc->op_array);
}
}
@@ -50864,26 +49711,28 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CV_CV_HA
}
- call_info = ZEND_CALL_NESTED_FUNCTION;
+ call_info = ZEND_CALL_NESTED_FUNCTION | ZEND_CALL_HAS_THIS;
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();
}
+ /* call static method */
+ obj = (zend_object*)called_scope;
+ call_info = ZEND_CALL_NESTED_FUNCTION;
} 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;
if (IS_CV == IS_CV) {
GC_ADDREF(obj); /* For $this pointer */
} else if (free_op1 != object) {
GC_ADDREF(obj); /* For $this pointer */
}
+ /* CV may be changed indirectly (e.g. when it's a reference) */
+ call_info = ZEND_CALL_NESTED_FUNCTION | ZEND_CALL_HAS_THIS | ZEND_CALL_RELEASE_THIS;
}
call = zend_vm_stack_push_call_frame(call_info,
- fbc, opline->extended_value, called_scope, obj);
+ fbc, opline->extended_value, obj);
call->prev_execute_data = EX(call);
EX(call) = call;
@@ -50966,8 +49815,12 @@ num_index:
} else if (Z_TYPE_P(offset) == IS_TRUE) {
hval = 1;
goto num_index;
+ } else if (Z_TYPE_P(offset) == IS_RESOURCE) {
+ zend_use_resource_as_offset(offset);
+ hval = Z_RES_HANDLE_P(offset);
+ goto num_index;
} else if (IS_CV == IS_CV && Z_TYPE_P(offset) == IS_UNDEF) {
- GET_OP2_UNDEF_CV(offset, BP_VAR_R);
+ ZVAL_UNDEFINED_OP2();
str = ZSTR_EMPTY_ALLOC();
goto str_index;
} else {
@@ -51000,7 +49853,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_CV_CV_HANDLER(
}
ZEND_VM_TAIL_CALL(ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
} else {
- ZVAL_EMPTY_ARRAY(array);
+ ZVAL_ARR(array, zend_new_array(0));
ZEND_VM_NEXT_OPCODE();
}
}
@@ -51062,7 +49915,7 @@ num_index_dim:
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);
+ ZVAL_UNDEFINED_OP2();
key = ZSTR_EMPTY_ALLOC();
goto str_index_dim;
} else {
@@ -51076,20 +49929,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);
+ container = ZVAL_UNDEFINED_OP1();
}
if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(offset) == IS_UNDEF)) {
- offset = GET_OP2_UNDEF_CV(offset, BP_VAR_R);
+ offset = ZVAL_UNDEFINED_OP2();
}
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);
+ 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");
}
@@ -51107,7 +49956,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_CV_CV_HANDLER(Z
zval *offset;
SAVE_OPLINE();
- container = _get_zval_ptr_cv_BP_VAR_UNSET(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));
}
@@ -51118,17 +49967,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_CV_CV_HANDLER(Z
if (Z_ISREF_P(container)) {
container = Z_REFVAL_P(container);
if (Z_TYPE_P(container) != IS_OBJECT) {
+ if (IS_CV == IS_CV
+ && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
+ ZVAL_UNDEFINED_OP1();
+ }
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);
- }
+ Z_OBJ_HT_P(container)->unset_property(container, offset, ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL));
} while (0);
@@ -51179,6 +50028,14 @@ num_index_prop:
/* > 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);
+
+ if (IS_CV & (IS_CONST|IS_CV)) {
+ /* avoid exception check */
+
+ ZEND_VM_SMART_BRANCH(result, 0);
+ ZVAL_BOOL(EX_VAR(opline->result.var), result);
+ ZEND_VM_NEXT_OPCODE();
+ }
} else {
result = (value == NULL || !i_zend_is_true(value));
}
@@ -51229,21 +50086,20 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CV
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;
+ result = (opline->extended_value & ZEND_ISEMPTY);
+ goto isset_object_finish;
}
} else {
- goto isset_no_object;
+ result = (opline->extended_value & ZEND_ISEMPTY);
+ goto isset_object_finish;
}
}
- 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));
- }
+
+ 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));
+
+isset_object_finish:
ZEND_VM_SMART_BRANCH(result, 1);
@@ -51251,6 +50107,41 @@ isset_no_object:
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ARRAY_KEY_EXISTS_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+
+
+ zval *key, *subject;
+ HashTable *ht;
+ uint32_t result;
+
+ SAVE_OPLINE();
+
+ key = EX_VAR(opline->op1.var);
+ subject = EX_VAR(opline->op2.var);
+
+ if (EXPECTED(Z_TYPE_P(subject) == IS_ARRAY)) {
+array_key_exists_array:
+ ht = Z_ARRVAL_P(subject);
+ result = zend_array_key_exists_fast(ht, key OPLINE_CC EXECUTE_DATA_CC);
+ } else {
+ if ((IS_CV & (IS_VAR|IS_CV)) && EXPECTED(Z_ISREF_P(subject))) {
+ subject = Z_REFVAL_P(subject);
+ if (EXPECTED(Z_TYPE_P(subject) == IS_ARRAY)) {
+ goto array_key_exists_array;
+ }
+ }
+ result = zend_array_key_exists_slow(subject, key OPLINE_CC EXECUTE_DATA_CC);
+ }
+
+
+ ZEND_VM_SMART_BRANCH(result == IS_TRUE, 1);
+ Z_TYPE_INFO_P(EX_VAR(opline->result.var)) = result;
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+}
+
+/* No specialization for op_types (CONST|TMPVAR|UNUSED|CV, ANY) */
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -51292,20 +50183,23 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_CV_CV_HANDLER(ZEND_
/* 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 {
+ do {
+ if (IS_CV == IS_VAR) {
+ ZEND_ASSERT(value_ptr != &EG(uninitialized_zval));
+ if (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);
+ break;
+ }
+ }
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));
- }
+ } while (0);
}
} else {
@@ -51408,6 +50302,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_NULL_HANDLER(ZEND_OPCODE_HANDL
#endif
+#if (ZEND_VM_KIND != ZEND_VM_KIND_CALL) && (ZEND_GCC_VERSION >= 4000) && !defined(__clang__)
+# pragma GCC push_options
+# pragma GCC optimize("no-gcse")
+# pragma GCC optimize("no-ivopts")
+#endif
ZEND_API void execute_ex(zend_execute_data *ex)
{
DCL_OPLINE
@@ -51427,80 +50326,80 @@ ZEND_API void execute_ex(zend_execute_data *ex)
static const void * const labels[] = {
(void*)&&ZEND_NOP_SPEC_LABEL,
(void*)&&ZEND_ADD_SPEC_CONST_CONST_LABEL,
- (void*)&&ZEND_ADD_SPEC_CONST_TMPVAR_LABEL,
- (void*)&&ZEND_ADD_SPEC_CONST_TMPVAR_LABEL,
+ (void*)&&ZEND_ADD_SPEC_CONST_TMPVARCV_LABEL,
+ (void*)&&ZEND_ADD_SPEC_CONST_TMPVARCV_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ADD_SPEC_CONST_CV_LABEL,
- (void*)&&ZEND_ADD_SPEC_TMPVAR_CONST_LABEL,
- (void*)&&ZEND_ADD_SPEC_TMPVAR_TMPVAR_LABEL,
- (void*)&&ZEND_ADD_SPEC_TMPVAR_TMPVAR_LABEL,
+ (void*)&&ZEND_ADD_SPEC_CONST_TMPVARCV_LABEL,
+ (void*)&&ZEND_ADD_SPEC_TMPVARCV_CONST_LABEL,
+ (void*)&&ZEND_ADD_SPEC_TMPVARCV_TMPVARCV_LABEL,
+ (void*)&&ZEND_ADD_SPEC_TMPVARCV_TMPVARCV_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ADD_SPEC_TMPVAR_CV_LABEL,
- (void*)&&ZEND_ADD_SPEC_TMPVAR_CONST_LABEL,
- (void*)&&ZEND_ADD_SPEC_TMPVAR_TMPVAR_LABEL,
- (void*)&&ZEND_ADD_SPEC_TMPVAR_TMPVAR_LABEL,
+ (void*)&&ZEND_ADD_SPEC_TMPVARCV_TMPVARCV_LABEL,
+ (void*)&&ZEND_ADD_SPEC_TMPVARCV_CONST_LABEL,
+ (void*)&&ZEND_ADD_SPEC_TMPVARCV_TMPVARCV_LABEL,
+ (void*)&&ZEND_ADD_SPEC_TMPVARCV_TMPVARCV_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ADD_SPEC_TMPVAR_CV_LABEL,
+ (void*)&&ZEND_ADD_SPEC_TMPVARCV_TMPVARCV_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ADD_SPEC_CV_CONST_LABEL,
- (void*)&&ZEND_ADD_SPEC_CV_TMPVAR_LABEL,
- (void*)&&ZEND_ADD_SPEC_CV_TMPVAR_LABEL,
+ (void*)&&ZEND_ADD_SPEC_TMPVARCV_CONST_LABEL,
+ (void*)&&ZEND_ADD_SPEC_TMPVARCV_TMPVARCV_LABEL,
+ (void*)&&ZEND_ADD_SPEC_TMPVARCV_TMPVARCV_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ADD_SPEC_CV_CV_LABEL,
+ (void*)&&ZEND_ADD_SPEC_TMPVARCV_TMPVARCV_LABEL,
(void*)&&ZEND_SUB_SPEC_CONST_CONST_LABEL,
- (void*)&&ZEND_SUB_SPEC_CONST_TMPVAR_LABEL,
- (void*)&&ZEND_SUB_SPEC_CONST_TMPVAR_LABEL,
+ (void*)&&ZEND_SUB_SPEC_CONST_TMPVARCV_LABEL,
+ (void*)&&ZEND_SUB_SPEC_CONST_TMPVARCV_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_SUB_SPEC_CONST_CV_LABEL,
- (void*)&&ZEND_SUB_SPEC_TMPVAR_CONST_LABEL,
- (void*)&&ZEND_SUB_SPEC_TMPVAR_TMPVAR_LABEL,
- (void*)&&ZEND_SUB_SPEC_TMPVAR_TMPVAR_LABEL,
+ (void*)&&ZEND_SUB_SPEC_CONST_TMPVARCV_LABEL,
+ (void*)&&ZEND_SUB_SPEC_TMPVARCV_CONST_LABEL,
+ (void*)&&ZEND_SUB_SPEC_TMPVARCV_TMPVARCV_LABEL,
+ (void*)&&ZEND_SUB_SPEC_TMPVARCV_TMPVARCV_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_SUB_SPEC_TMPVAR_CV_LABEL,
- (void*)&&ZEND_SUB_SPEC_TMPVAR_CONST_LABEL,
- (void*)&&ZEND_SUB_SPEC_TMPVAR_TMPVAR_LABEL,
- (void*)&&ZEND_SUB_SPEC_TMPVAR_TMPVAR_LABEL,
+ (void*)&&ZEND_SUB_SPEC_TMPVARCV_TMPVARCV_LABEL,
+ (void*)&&ZEND_SUB_SPEC_TMPVARCV_CONST_LABEL,
+ (void*)&&ZEND_SUB_SPEC_TMPVARCV_TMPVARCV_LABEL,
+ (void*)&&ZEND_SUB_SPEC_TMPVARCV_TMPVARCV_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_SUB_SPEC_TMPVAR_CV_LABEL,
+ (void*)&&ZEND_SUB_SPEC_TMPVARCV_TMPVARCV_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_SUB_SPEC_CV_CONST_LABEL,
- (void*)&&ZEND_SUB_SPEC_CV_TMPVAR_LABEL,
- (void*)&&ZEND_SUB_SPEC_CV_TMPVAR_LABEL,
+ (void*)&&ZEND_SUB_SPEC_TMPVARCV_CONST_LABEL,
+ (void*)&&ZEND_SUB_SPEC_TMPVARCV_TMPVARCV_LABEL,
+ (void*)&&ZEND_SUB_SPEC_TMPVARCV_TMPVARCV_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_SUB_SPEC_CV_CV_LABEL,
+ (void*)&&ZEND_SUB_SPEC_TMPVARCV_TMPVARCV_LABEL,
(void*)&&ZEND_MUL_SPEC_CONST_CONST_LABEL,
(void*)&&ZEND_NULL_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_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_MUL_SPEC_TMPVARCV_CONST_LABEL,
+ (void*)&&ZEND_MUL_SPEC_TMPVARCV_TMPVARCV_LABEL,
+ (void*)&&ZEND_MUL_SPEC_TMPVARCV_TMPVARCV_LABEL,
(void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_MUL_SPEC_TMPVARCV_TMPVARCV_LABEL,
+ (void*)&&ZEND_MUL_SPEC_TMPVARCV_CONST_LABEL,
+ (void*)&&ZEND_MUL_SPEC_TMPVARCV_TMPVARCV_LABEL,
+ (void*)&&ZEND_MUL_SPEC_TMPVARCV_TMPVARCV_LABEL,
(void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_MUL_SPEC_TMPVARCV_TMPVARCV_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_MUL_SPEC_CV_CONST_LABEL,
- (void*)&&ZEND_MUL_SPEC_CV_TMPVAR_LABEL,
- (void*)&&ZEND_MUL_SPEC_CV_TMPVAR_LABEL,
+ (void*)&&ZEND_MUL_SPEC_TMPVARCV_CONST_LABEL,
+ (void*)&&ZEND_MUL_SPEC_TMPVARCV_TMPVARCV_LABEL,
+ (void*)&&ZEND_MUL_SPEC_TMPVARCV_TMPVARCV_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_MUL_SPEC_CV_CV_LABEL,
+ (void*)&&ZEND_MUL_SPEC_TMPVARCV_TMPVARCV_LABEL,
(void*)&&ZEND_DIV_SPEC_CONST_CONST_LABEL,
(void*)&&ZEND_DIV_SPEC_CONST_TMPVAR_LABEL,
(void*)&&ZEND_DIV_SPEC_CONST_TMPVAR_LABEL,
@@ -51527,80 +50426,80 @@ ZEND_API void execute_ex(zend_execute_data *ex)
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_DIV_SPEC_CV_CV_LABEL,
(void*)&&ZEND_MOD_SPEC_CONST_CONST_LABEL,
- (void*)&&ZEND_MOD_SPEC_CONST_TMPVAR_LABEL,
- (void*)&&ZEND_MOD_SPEC_CONST_TMPVAR_LABEL,
+ (void*)&&ZEND_MOD_SPEC_CONST_TMPVARCV_LABEL,
+ (void*)&&ZEND_MOD_SPEC_CONST_TMPVARCV_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_MOD_SPEC_CONST_CV_LABEL,
- (void*)&&ZEND_MOD_SPEC_TMPVAR_CONST_LABEL,
- (void*)&&ZEND_MOD_SPEC_TMPVAR_TMPVAR_LABEL,
- (void*)&&ZEND_MOD_SPEC_TMPVAR_TMPVAR_LABEL,
+ (void*)&&ZEND_MOD_SPEC_CONST_TMPVARCV_LABEL,
+ (void*)&&ZEND_MOD_SPEC_TMPVARCV_CONST_LABEL,
+ (void*)&&ZEND_MOD_SPEC_TMPVARCV_TMPVARCV_LABEL,
+ (void*)&&ZEND_MOD_SPEC_TMPVARCV_TMPVARCV_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_MOD_SPEC_TMPVAR_CV_LABEL,
- (void*)&&ZEND_MOD_SPEC_TMPVAR_CONST_LABEL,
- (void*)&&ZEND_MOD_SPEC_TMPVAR_TMPVAR_LABEL,
- (void*)&&ZEND_MOD_SPEC_TMPVAR_TMPVAR_LABEL,
+ (void*)&&ZEND_MOD_SPEC_TMPVARCV_TMPVARCV_LABEL,
+ (void*)&&ZEND_MOD_SPEC_TMPVARCV_CONST_LABEL,
+ (void*)&&ZEND_MOD_SPEC_TMPVARCV_TMPVARCV_LABEL,
+ (void*)&&ZEND_MOD_SPEC_TMPVARCV_TMPVARCV_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_MOD_SPEC_TMPVAR_CV_LABEL,
+ (void*)&&ZEND_MOD_SPEC_TMPVARCV_TMPVARCV_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_MOD_SPEC_CV_CONST_LABEL,
- (void*)&&ZEND_MOD_SPEC_CV_TMPVAR_LABEL,
- (void*)&&ZEND_MOD_SPEC_CV_TMPVAR_LABEL,
+ (void*)&&ZEND_MOD_SPEC_TMPVARCV_CONST_LABEL,
+ (void*)&&ZEND_MOD_SPEC_TMPVARCV_TMPVARCV_LABEL,
+ (void*)&&ZEND_MOD_SPEC_TMPVARCV_TMPVARCV_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_MOD_SPEC_CV_CV_LABEL,
+ (void*)&&ZEND_MOD_SPEC_TMPVARCV_TMPVARCV_LABEL,
(void*)&&ZEND_SL_SPEC_CONST_CONST_LABEL,
- (void*)&&ZEND_SL_SPEC_CONST_TMPVAR_LABEL,
- (void*)&&ZEND_SL_SPEC_CONST_TMPVAR_LABEL,
+ (void*)&&ZEND_SL_SPEC_CONST_TMPVARCV_LABEL,
+ (void*)&&ZEND_SL_SPEC_CONST_TMPVARCV_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_SL_SPEC_CONST_CV_LABEL,
- (void*)&&ZEND_SL_SPEC_TMPVAR_CONST_LABEL,
- (void*)&&ZEND_SL_SPEC_TMPVAR_TMPVAR_LABEL,
- (void*)&&ZEND_SL_SPEC_TMPVAR_TMPVAR_LABEL,
+ (void*)&&ZEND_SL_SPEC_CONST_TMPVARCV_LABEL,
+ (void*)&&ZEND_SL_SPEC_TMPVARCV_CONST_LABEL,
+ (void*)&&ZEND_SL_SPEC_TMPVARCV_TMPVARCV_LABEL,
+ (void*)&&ZEND_SL_SPEC_TMPVARCV_TMPVARCV_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_SL_SPEC_TMPVAR_CV_LABEL,
- (void*)&&ZEND_SL_SPEC_TMPVAR_CONST_LABEL,
- (void*)&&ZEND_SL_SPEC_TMPVAR_TMPVAR_LABEL,
- (void*)&&ZEND_SL_SPEC_TMPVAR_TMPVAR_LABEL,
+ (void*)&&ZEND_SL_SPEC_TMPVARCV_TMPVARCV_LABEL,
+ (void*)&&ZEND_SL_SPEC_TMPVARCV_CONST_LABEL,
+ (void*)&&ZEND_SL_SPEC_TMPVARCV_TMPVARCV_LABEL,
+ (void*)&&ZEND_SL_SPEC_TMPVARCV_TMPVARCV_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_SL_SPEC_TMPVAR_CV_LABEL,
+ (void*)&&ZEND_SL_SPEC_TMPVARCV_TMPVARCV_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_SL_SPEC_CV_CONST_LABEL,
- (void*)&&ZEND_SL_SPEC_CV_TMPVAR_LABEL,
- (void*)&&ZEND_SL_SPEC_CV_TMPVAR_LABEL,
+ (void*)&&ZEND_SL_SPEC_TMPVARCV_CONST_LABEL,
+ (void*)&&ZEND_SL_SPEC_TMPVARCV_TMPVARCV_LABEL,
+ (void*)&&ZEND_SL_SPEC_TMPVARCV_TMPVARCV_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_SL_SPEC_CV_CV_LABEL,
+ (void*)&&ZEND_SL_SPEC_TMPVARCV_TMPVARCV_LABEL,
(void*)&&ZEND_SR_SPEC_CONST_CONST_LABEL,
- (void*)&&ZEND_SR_SPEC_CONST_TMPVAR_LABEL,
- (void*)&&ZEND_SR_SPEC_CONST_TMPVAR_LABEL,
+ (void*)&&ZEND_SR_SPEC_CONST_TMPVARCV_LABEL,
+ (void*)&&ZEND_SR_SPEC_CONST_TMPVARCV_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_SR_SPEC_CONST_CV_LABEL,
- (void*)&&ZEND_SR_SPEC_TMPVAR_CONST_LABEL,
- (void*)&&ZEND_SR_SPEC_TMPVAR_TMPVAR_LABEL,
- (void*)&&ZEND_SR_SPEC_TMPVAR_TMPVAR_LABEL,
+ (void*)&&ZEND_SR_SPEC_CONST_TMPVARCV_LABEL,
+ (void*)&&ZEND_SR_SPEC_TMPVARCV_CONST_LABEL,
+ (void*)&&ZEND_SR_SPEC_TMPVARCV_TMPVARCV_LABEL,
+ (void*)&&ZEND_SR_SPEC_TMPVARCV_TMPVARCV_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_SR_SPEC_TMPVAR_CV_LABEL,
- (void*)&&ZEND_SR_SPEC_TMPVAR_CONST_LABEL,
- (void*)&&ZEND_SR_SPEC_TMPVAR_TMPVAR_LABEL,
- (void*)&&ZEND_SR_SPEC_TMPVAR_TMPVAR_LABEL,
+ (void*)&&ZEND_SR_SPEC_TMPVARCV_TMPVARCV_LABEL,
+ (void*)&&ZEND_SR_SPEC_TMPVARCV_CONST_LABEL,
+ (void*)&&ZEND_SR_SPEC_TMPVARCV_TMPVARCV_LABEL,
+ (void*)&&ZEND_SR_SPEC_TMPVARCV_TMPVARCV_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_SR_SPEC_TMPVAR_CV_LABEL,
+ (void*)&&ZEND_SR_SPEC_TMPVARCV_TMPVARCV_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_SR_SPEC_CV_CONST_LABEL,
- (void*)&&ZEND_SR_SPEC_CV_TMPVAR_LABEL,
- (void*)&&ZEND_SR_SPEC_CV_TMPVAR_LABEL,
+ (void*)&&ZEND_SR_SPEC_TMPVARCV_CONST_LABEL,
+ (void*)&&ZEND_SR_SPEC_TMPVARCV_TMPVARCV_LABEL,
+ (void*)&&ZEND_SR_SPEC_TMPVARCV_TMPVARCV_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_SR_SPEC_CV_CV_LABEL,
+ (void*)&&ZEND_SR_SPEC_TMPVARCV_TMPVARCV_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_CONCAT_SPEC_CONST_TMPVAR_LABEL,
(void*)&&ZEND_CONCAT_SPEC_CONST_TMPVAR_LABEL,
@@ -51631,76 +50530,101 @@ ZEND_API void execute_ex(zend_execute_data *ex)
(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_BW_OR_SPEC_TMPVARCV_CONST_LABEL,
+ (void*)&&ZEND_BW_OR_SPEC_TMPVARCV_TMPVARCV_LABEL,
+ (void*)&&ZEND_BW_OR_SPEC_TMPVARCV_TMPVARCV_LABEL,
(void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_BW_OR_SPEC_TMPVARCV_TMPVARCV_LABEL,
+ (void*)&&ZEND_BW_OR_SPEC_TMPVARCV_CONST_LABEL,
+ (void*)&&ZEND_BW_OR_SPEC_TMPVARCV_TMPVARCV_LABEL,
+ (void*)&&ZEND_BW_OR_SPEC_TMPVARCV_TMPVARCV_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_BW_OR_SPEC_TMPVARCV_TMPVARCV_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_BW_OR_SPEC_TMPVARCV_CONST_LABEL,
+ (void*)&&ZEND_BW_OR_SPEC_TMPVARCV_TMPVARCV_LABEL,
+ (void*)&&ZEND_BW_OR_SPEC_TMPVARCV_TMPVARCV_LABEL,
(void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_BW_OR_SPEC_TMPVARCV_TMPVARCV_LABEL,
+ (void*)&&ZEND_BW_AND_SPEC_CONST_CONST_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_BW_OR_SPEC_CV_CONST_LABEL,
- (void*)&&ZEND_BW_OR_SPEC_CV_TMPVAR_LABEL,
- (void*)&&ZEND_BW_OR_SPEC_CV_TMPVAR_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_BW_OR_SPEC_CV_CV_LABEL,
- (void*)&&ZEND_BW_AND_SPEC_CONST_CONST_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_BW_AND_SPEC_TMPVARCV_CONST_LABEL,
+ (void*)&&ZEND_BW_AND_SPEC_TMPVARCV_TMPVARCV_LABEL,
+ (void*)&&ZEND_BW_AND_SPEC_TMPVARCV_TMPVARCV_LABEL,
(void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_BW_AND_SPEC_TMPVARCV_TMPVARCV_LABEL,
+ (void*)&&ZEND_BW_AND_SPEC_TMPVARCV_CONST_LABEL,
+ (void*)&&ZEND_BW_AND_SPEC_TMPVARCV_TMPVARCV_LABEL,
+ (void*)&&ZEND_BW_AND_SPEC_TMPVARCV_TMPVARCV_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_BW_AND_SPEC_TMPVARCV_TMPVARCV_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_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_BW_AND_SPEC_TMPVARCV_CONST_LABEL,
+ (void*)&&ZEND_BW_AND_SPEC_TMPVARCV_TMPVARCV_LABEL,
+ (void*)&&ZEND_BW_AND_SPEC_TMPVARCV_TMPVARCV_LABEL,
(void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_BW_AND_SPEC_TMPVARCV_TMPVARCV_LABEL,
+ (void*)&&ZEND_BW_XOR_SPEC_CONST_CONST_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_BW_AND_SPEC_CV_CONST_LABEL,
- (void*)&&ZEND_BW_AND_SPEC_CV_TMPVAR_LABEL,
- (void*)&&ZEND_BW_AND_SPEC_CV_TMPVAR_LABEL,
(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_TMPVARCV_CONST_LABEL,
+ (void*)&&ZEND_BW_XOR_SPEC_TMPVARCV_TMPVARCV_LABEL,
+ (void*)&&ZEND_BW_XOR_SPEC_TMPVARCV_TMPVARCV_LABEL,
+ (void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_BW_XOR_SPEC_TMPVARCV_TMPVARCV_LABEL,
+ (void*)&&ZEND_BW_XOR_SPEC_TMPVARCV_CONST_LABEL,
+ (void*)&&ZEND_BW_XOR_SPEC_TMPVARCV_TMPVARCV_LABEL,
+ (void*)&&ZEND_BW_XOR_SPEC_TMPVARCV_TMPVARCV_LABEL,
+ (void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_BW_XOR_SPEC_TMPVARCV_TMPVARCV_LABEL,
+ (void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_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_BW_XOR_SPEC_TMPVARCV_CONST_LABEL,
+ (void*)&&ZEND_BW_XOR_SPEC_TMPVARCV_TMPVARCV_LABEL,
+ (void*)&&ZEND_BW_XOR_SPEC_TMPVARCV_TMPVARCV_LABEL,
(void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_BW_XOR_SPEC_TMPVARCV_TMPVARCV_LABEL,
+ (void*)&&ZEND_POW_SPEC_CONST_CONST_LABEL,
+ (void*)&&ZEND_POW_SPEC_CONST_TMPVAR_LABEL,
+ (void*)&&ZEND_POW_SPEC_CONST_TMPVAR_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_POW_SPEC_CONST_CV_LABEL,
+ (void*)&&ZEND_POW_SPEC_TMPVAR_CONST_LABEL,
+ (void*)&&ZEND_POW_SPEC_TMPVAR_TMPVAR_LABEL,
+ (void*)&&ZEND_POW_SPEC_TMPVAR_TMPVAR_LABEL,
(void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_POW_SPEC_TMPVAR_CV_LABEL,
+ (void*)&&ZEND_POW_SPEC_TMPVAR_CONST_LABEL,
+ (void*)&&ZEND_POW_SPEC_TMPVAR_TMPVAR_LABEL,
+ (void*)&&ZEND_POW_SPEC_TMPVAR_TMPVAR_LABEL,
(void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_POW_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_BW_XOR_SPEC_CV_CONST_LABEL,
- (void*)&&ZEND_BW_XOR_SPEC_CV_TMPVAR_LABEL,
- (void*)&&ZEND_BW_XOR_SPEC_CV_TMPVAR_LABEL,
+ (void*)&&ZEND_POW_SPEC_CV_CONST_LABEL,
+ (void*)&&ZEND_POW_SPEC_CV_TMPVAR_LABEL,
+ (void*)&&ZEND_POW_SPEC_CV_TMPVAR_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_BW_XOR_SPEC_CV_CV_LABEL,
+ (void*)&&ZEND_POW_SPEC_CV_CV_LABEL,
(void*)&&ZEND_BW_NOT_SPEC_CONST_LABEL,
(void*)&&ZEND_BW_NOT_SPEC_TMPVAR_LABEL,
(void*)&&ZEND_BW_NOT_SPEC_TMPVAR_LABEL,
@@ -51787,125 +50711,44 @@ 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_NULL_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_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_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_SPEC_CV_CONST_LABEL,
- (void*)&&ZEND_IS_EQUAL_SPEC_CV_TMPVAR_LABEL,
- (void*)&&ZEND_IS_EQUAL_SPEC_CV_TMPVAR_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_IS_EQUAL_SPEC_CV_CV_LABEL,
- (void*)&&ZEND_IS_NOT_EQUAL_SPEC_CONST_CONST_LABEL,
- (void*)&&ZEND_NULL_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_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_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_SPEC_CV_CONST_LABEL,
- (void*)&&ZEND_IS_NOT_EQUAL_SPEC_CV_TMPVAR_LABEL,
- (void*)&&ZEND_IS_NOT_EQUAL_SPEC_CV_TMPVAR_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_IS_NOT_EQUAL_SPEC_CV_CV_LABEL,
- (void*)&&ZEND_IS_SMALLER_SPEC_CONST_CONST_LABEL,
- (void*)&&ZEND_IS_SMALLER_SPEC_CONST_TMPVAR_LABEL,
- (void*)&&ZEND_IS_SMALLER_SPEC_CONST_TMPVAR_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_IS_SMALLER_SPEC_CONST_CV_LABEL,
- (void*)&&ZEND_IS_SMALLER_SPEC_TMPVAR_CONST_LABEL,
- (void*)&&ZEND_IS_SMALLER_SPEC_TMPVAR_TMPVAR_LABEL,
- (void*)&&ZEND_IS_SMALLER_SPEC_TMPVAR_TMPVAR_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_IS_SMALLER_SPEC_TMPVAR_CV_LABEL,
- (void*)&&ZEND_IS_SMALLER_SPEC_TMPVAR_CONST_LABEL,
- (void*)&&ZEND_IS_SMALLER_SPEC_TMPVAR_TMPVAR_LABEL,
- (void*)&&ZEND_IS_SMALLER_SPEC_TMPVAR_TMPVAR_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_IS_SMALLER_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_IS_SMALLER_SPEC_CV_CONST_LABEL,
- (void*)&&ZEND_IS_SMALLER_SPEC_CV_TMPVAR_LABEL,
- (void*)&&ZEND_IS_SMALLER_SPEC_CV_TMPVAR_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_IS_SMALLER_SPEC_CV_CV_LABEL,
- (void*)&&ZEND_IS_SMALLER_OR_EQUAL_SPEC_CONST_CONST_LABEL,
- (void*)&&ZEND_IS_SMALLER_OR_EQUAL_SPEC_CONST_TMPVAR_LABEL,
- (void*)&&ZEND_IS_SMALLER_OR_EQUAL_SPEC_CONST_TMPVAR_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_IS_SMALLER_OR_EQUAL_SPEC_CONST_CV_LABEL,
- (void*)&&ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVAR_CONST_LABEL,
- (void*)&&ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVAR_TMPVAR_LABEL,
- (void*)&&ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVAR_TMPVAR_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVAR_CV_LABEL,
- (void*)&&ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVAR_CONST_LABEL,
- (void*)&&ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVAR_TMPVAR_LABEL,
- (void*)&&ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVAR_TMPVAR_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVAR_CV_LABEL,
+ (void*)&&ZEND_IS_EQUAL_SPEC_CONST_CONST_LABEL,
+ (void*)&&ZEND_IS_EQUAL_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_IS_SMALLER_OR_EQUAL_SPEC_CV_CONST_LABEL,
- (void*)&&ZEND_IS_SMALLER_OR_EQUAL_SPEC_CV_TMPVAR_LABEL,
- (void*)&&ZEND_IS_SMALLER_OR_EQUAL_SPEC_CV_TMPVAR_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_IS_SMALLER_OR_EQUAL_SPEC_CV_CV_LABEL,
- (void*)&&ZEND_CAST_SPEC_CONST_LABEL,
- (void*)&&ZEND_CAST_SPEC_TMP_LABEL,
- (void*)&&ZEND_CAST_SPEC_VAR_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_CAST_SPEC_CV_LABEL,
- (void*)&&ZEND_QM_ASSIGN_SPEC_CONST_LABEL,
- (void*)&&ZEND_QM_ASSIGN_SPEC_TMP_LABEL,
- (void*)&&ZEND_QM_ASSIGN_SPEC_VAR_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_QM_ASSIGN_SPEC_CV_LABEL,
(void*)&&ZEND_NULL_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_CONST_JMPZ_LABEL,
+ (void*)&&ZEND_IS_EQUAL_SPEC_TMPVAR_CONST_JMPNZ_LABEL,
+ (void*)&&ZEND_IS_EQUAL_SPEC_TMPVAR_TMPVAR_LABEL,
+ (void*)&&ZEND_IS_EQUAL_SPEC_TMPVAR_TMPVAR_JMPZ_LABEL,
+ (void*)&&ZEND_IS_EQUAL_SPEC_TMPVAR_TMPVAR_JMPNZ_LABEL,
+ (void*)&&ZEND_IS_EQUAL_SPEC_TMPVAR_TMPVAR_LABEL,
+ (void*)&&ZEND_IS_EQUAL_SPEC_TMPVAR_TMPVAR_JMPZ_LABEL,
+ (void*)&&ZEND_IS_EQUAL_SPEC_TMPVAR_TMPVAR_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_IS_EQUAL_SPEC_TMPVAR_CONST_LABEL,
+ (void*)&&ZEND_IS_EQUAL_SPEC_TMPVAR_CONST_JMPZ_LABEL,
+ (void*)&&ZEND_IS_EQUAL_SPEC_TMPVAR_CONST_JMPNZ_LABEL,
+ (void*)&&ZEND_IS_EQUAL_SPEC_TMPVAR_TMPVAR_LABEL,
+ (void*)&&ZEND_IS_EQUAL_SPEC_TMPVAR_TMPVAR_JMPZ_LABEL,
+ (void*)&&ZEND_IS_EQUAL_SPEC_TMPVAR_TMPVAR_JMPNZ_LABEL,
+ (void*)&&ZEND_IS_EQUAL_SPEC_TMPVAR_TMPVAR_LABEL,
+ (void*)&&ZEND_IS_EQUAL_SPEC_TMPVAR_TMPVAR_JMPZ_LABEL,
+ (void*)&&ZEND_IS_EQUAL_SPEC_TMPVAR_TMPVAR_JMPNZ_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
@@ -51926,58 +50769,61 @@ ZEND_API void execute_ex(zend_execute_data *ex)
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_ADD_SPEC_VAR_CONST_LABEL,
- (void*)&&ZEND_ASSIGN_ADD_SPEC_VAR_CONST_DIM_LABEL,
- (void*)&&ZEND_ASSIGN_ADD_SPEC_VAR_CONST_OBJ_LABEL,
- (void*)&&ZEND_ASSIGN_ADD_SPEC_VAR_TMPVAR_LABEL,
- (void*)&&ZEND_ASSIGN_ADD_SPEC_VAR_TMPVAR_DIM_LABEL,
- (void*)&&ZEND_ASSIGN_ADD_SPEC_VAR_TMPVAR_OBJ_LABEL,
- (void*)&&ZEND_ASSIGN_ADD_SPEC_VAR_TMPVAR_LABEL,
- (void*)&&ZEND_ASSIGN_ADD_SPEC_VAR_TMPVAR_DIM_LABEL,
- (void*)&&ZEND_ASSIGN_ADD_SPEC_VAR_TMPVAR_OBJ_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_ADD_SPEC_VAR_UNUSED_DIM_LABEL,
+ (void*)&&ZEND_IS_EQUAL_SPEC_CV_CONST_LABEL,
+ (void*)&&ZEND_IS_EQUAL_SPEC_CV_CONST_JMPZ_LABEL,
+ (void*)&&ZEND_IS_EQUAL_SPEC_CV_CONST_JMPNZ_LABEL,
+ (void*)&&ZEND_IS_EQUAL_SPEC_CV_TMPVAR_LABEL,
+ (void*)&&ZEND_IS_EQUAL_SPEC_CV_TMPVAR_JMPZ_LABEL,
+ (void*)&&ZEND_IS_EQUAL_SPEC_CV_TMPVAR_JMPNZ_LABEL,
+ (void*)&&ZEND_IS_EQUAL_SPEC_CV_TMPVAR_LABEL,
+ (void*)&&ZEND_IS_EQUAL_SPEC_CV_TMPVAR_JMPZ_LABEL,
+ (void*)&&ZEND_IS_EQUAL_SPEC_CV_TMPVAR_JMPNZ_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_ADD_SPEC_VAR_CV_LABEL,
- (void*)&&ZEND_ASSIGN_ADD_SPEC_VAR_CV_DIM_LABEL,
- (void*)&&ZEND_ASSIGN_ADD_SPEC_VAR_CV_OBJ_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_ADD_SPEC_UNUSED_CONST_OBJ_LABEL,
+ (void*)&&ZEND_IS_EQUAL_SPEC_CV_CV_LABEL,
+ (void*)&&ZEND_IS_EQUAL_SPEC_CV_CV_JMPZ_LABEL,
+ (void*)&&ZEND_IS_EQUAL_SPEC_CV_CV_JMPNZ_LABEL,
+ (void*)&&ZEND_IS_NOT_EQUAL_SPEC_CONST_CONST_LABEL,
+ (void*)&&ZEND_IS_NOT_EQUAL_SPEC_CONST_CONST_LABEL,
+ (void*)&&ZEND_IS_NOT_EQUAL_SPEC_CONST_CONST_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_ADD_SPEC_UNUSED_TMPVAR_OBJ_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_ADD_SPEC_UNUSED_TMPVAR_OBJ_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_ADD_SPEC_UNUSED_CV_OBJ_LABEL,
- (void*)&&ZEND_ASSIGN_ADD_SPEC_CV_CONST_LABEL,
- (void*)&&ZEND_ASSIGN_ADD_SPEC_CV_CONST_DIM_LABEL,
- (void*)&&ZEND_ASSIGN_ADD_SPEC_CV_CONST_OBJ_LABEL,
- (void*)&&ZEND_ASSIGN_ADD_SPEC_CV_TMPVAR_LABEL,
- (void*)&&ZEND_ASSIGN_ADD_SPEC_CV_TMPVAR_DIM_LABEL,
- (void*)&&ZEND_ASSIGN_ADD_SPEC_CV_TMPVAR_OBJ_LABEL,
- (void*)&&ZEND_ASSIGN_ADD_SPEC_CV_TMPVAR_LABEL,
- (void*)&&ZEND_ASSIGN_ADD_SPEC_CV_TMPVAR_DIM_LABEL,
- (void*)&&ZEND_ASSIGN_ADD_SPEC_CV_TMPVAR_OBJ_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_ADD_SPEC_CV_UNUSED_DIM_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_ADD_SPEC_CV_CV_LABEL,
- (void*)&&ZEND_ASSIGN_ADD_SPEC_CV_CV_DIM_LABEL,
- (void*)&&ZEND_ASSIGN_ADD_SPEC_CV_CV_OBJ_LABEL,
(void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_CONST_LABEL,
+ (void*)&&ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_CONST_JMPZ_LABEL,
+ (void*)&&ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_CONST_JMPNZ_LABEL,
+ (void*)&&ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_TMPVAR_LABEL,
+ (void*)&&ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_TMPVAR_JMPZ_LABEL,
+ (void*)&&ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_TMPVAR_JMPNZ_LABEL,
+ (void*)&&ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_TMPVAR_LABEL,
+ (void*)&&ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_TMPVAR_JMPZ_LABEL,
+ (void*)&&ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_TMPVAR_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_IS_NOT_EQUAL_SPEC_TMPVAR_CONST_LABEL,
+ (void*)&&ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_CONST_JMPZ_LABEL,
+ (void*)&&ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_CONST_JMPNZ_LABEL,
+ (void*)&&ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_TMPVAR_LABEL,
+ (void*)&&ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_TMPVAR_JMPZ_LABEL,
+ (void*)&&ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_TMPVAR_JMPNZ_LABEL,
+ (void*)&&ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_TMPVAR_LABEL,
+ (void*)&&ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_TMPVAR_JMPZ_LABEL,
+ (void*)&&ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_TMPVAR_JMPNZ_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
@@ -51999,53 +50845,71 @@ 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_SPEC_CV_CONST_LABEL,
+ (void*)&&ZEND_IS_NOT_EQUAL_SPEC_CV_CONST_JMPZ_LABEL,
+ (void*)&&ZEND_IS_NOT_EQUAL_SPEC_CV_CONST_JMPNZ_LABEL,
+ (void*)&&ZEND_IS_NOT_EQUAL_SPEC_CV_TMPVAR_LABEL,
+ (void*)&&ZEND_IS_NOT_EQUAL_SPEC_CV_TMPVAR_JMPZ_LABEL,
+ (void*)&&ZEND_IS_NOT_EQUAL_SPEC_CV_TMPVAR_JMPNZ_LABEL,
+ (void*)&&ZEND_IS_NOT_EQUAL_SPEC_CV_TMPVAR_LABEL,
+ (void*)&&ZEND_IS_NOT_EQUAL_SPEC_CV_TMPVAR_JMPZ_LABEL,
+ (void*)&&ZEND_IS_NOT_EQUAL_SPEC_CV_TMPVAR_JMPNZ_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_SUB_SPEC_VAR_CONST_LABEL,
- (void*)&&ZEND_ASSIGN_SUB_SPEC_VAR_CONST_DIM_LABEL,
- (void*)&&ZEND_ASSIGN_SUB_SPEC_VAR_CONST_OBJ_LABEL,
- (void*)&&ZEND_ASSIGN_SUB_SPEC_VAR_TMPVAR_LABEL,
- (void*)&&ZEND_ASSIGN_SUB_SPEC_VAR_TMPVAR_DIM_LABEL,
- (void*)&&ZEND_ASSIGN_SUB_SPEC_VAR_TMPVAR_OBJ_LABEL,
- (void*)&&ZEND_ASSIGN_SUB_SPEC_VAR_TMPVAR_LABEL,
- (void*)&&ZEND_ASSIGN_SUB_SPEC_VAR_TMPVAR_DIM_LABEL,
- (void*)&&ZEND_ASSIGN_SUB_SPEC_VAR_TMPVAR_OBJ_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_SUB_SPEC_VAR_UNUSED_DIM_LABEL,
+ (void*)&&ZEND_IS_NOT_EQUAL_SPEC_CV_CV_LABEL,
+ (void*)&&ZEND_IS_NOT_EQUAL_SPEC_CV_CV_JMPZ_LABEL,
+ (void*)&&ZEND_IS_NOT_EQUAL_SPEC_CV_CV_JMPNZ_LABEL,
+ (void*)&&ZEND_IS_SMALLER_SPEC_CONST_CONST_LABEL,
+ (void*)&&ZEND_IS_SMALLER_SPEC_CONST_CONST_LABEL,
+ (void*)&&ZEND_IS_SMALLER_SPEC_CONST_CONST_LABEL,
+ (void*)&&ZEND_IS_SMALLER_SPEC_CONST_TMPVARCV_LABEL,
+ (void*)&&ZEND_IS_SMALLER_SPEC_CONST_TMPVARCV_JMPZ_LABEL,
+ (void*)&&ZEND_IS_SMALLER_SPEC_CONST_TMPVARCV_JMPNZ_LABEL,
+ (void*)&&ZEND_IS_SMALLER_SPEC_CONST_TMPVARCV_LABEL,
+ (void*)&&ZEND_IS_SMALLER_SPEC_CONST_TMPVARCV_JMPZ_LABEL,
+ (void*)&&ZEND_IS_SMALLER_SPEC_CONST_TMPVARCV_JMPNZ_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_SUB_SPEC_VAR_CV_LABEL,
- (void*)&&ZEND_ASSIGN_SUB_SPEC_VAR_CV_DIM_LABEL,
- (void*)&&ZEND_ASSIGN_SUB_SPEC_VAR_CV_OBJ_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_SUB_SPEC_UNUSED_CONST_OBJ_LABEL,
+ (void*)&&ZEND_IS_SMALLER_SPEC_CONST_TMPVARCV_LABEL,
+ (void*)&&ZEND_IS_SMALLER_SPEC_CONST_TMPVARCV_JMPZ_LABEL,
+ (void*)&&ZEND_IS_SMALLER_SPEC_CONST_TMPVARCV_JMPNZ_LABEL,
+ (void*)&&ZEND_IS_SMALLER_SPEC_TMPVARCV_CONST_LABEL,
+ (void*)&&ZEND_IS_SMALLER_SPEC_TMPVARCV_CONST_JMPZ_LABEL,
+ (void*)&&ZEND_IS_SMALLER_SPEC_TMPVARCV_CONST_JMPNZ_LABEL,
+ (void*)&&ZEND_IS_SMALLER_SPEC_TMPVARCV_TMPVARCV_LABEL,
+ (void*)&&ZEND_IS_SMALLER_SPEC_TMPVARCV_TMPVARCV_JMPZ_LABEL,
+ (void*)&&ZEND_IS_SMALLER_SPEC_TMPVARCV_TMPVARCV_JMPNZ_LABEL,
+ (void*)&&ZEND_IS_SMALLER_SPEC_TMPVARCV_TMPVARCV_LABEL,
+ (void*)&&ZEND_IS_SMALLER_SPEC_TMPVARCV_TMPVARCV_JMPZ_LABEL,
+ (void*)&&ZEND_IS_SMALLER_SPEC_TMPVARCV_TMPVARCV_JMPNZ_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_SUB_SPEC_UNUSED_TMPVAR_OBJ_LABEL,
(void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_IS_SMALLER_SPEC_TMPVARCV_TMPVARCV_LABEL,
+ (void*)&&ZEND_IS_SMALLER_SPEC_TMPVARCV_TMPVARCV_JMPZ_LABEL,
+ (void*)&&ZEND_IS_SMALLER_SPEC_TMPVARCV_TMPVARCV_JMPNZ_LABEL,
+ (void*)&&ZEND_IS_SMALLER_SPEC_TMPVARCV_CONST_LABEL,
+ (void*)&&ZEND_IS_SMALLER_SPEC_TMPVARCV_CONST_JMPZ_LABEL,
+ (void*)&&ZEND_IS_SMALLER_SPEC_TMPVARCV_CONST_JMPNZ_LABEL,
+ (void*)&&ZEND_IS_SMALLER_SPEC_TMPVARCV_TMPVARCV_LABEL,
+ (void*)&&ZEND_IS_SMALLER_SPEC_TMPVARCV_TMPVARCV_JMPZ_LABEL,
+ (void*)&&ZEND_IS_SMALLER_SPEC_TMPVARCV_TMPVARCV_JMPNZ_LABEL,
+ (void*)&&ZEND_IS_SMALLER_SPEC_TMPVARCV_TMPVARCV_LABEL,
+ (void*)&&ZEND_IS_SMALLER_SPEC_TMPVARCV_TMPVARCV_JMPZ_LABEL,
+ (void*)&&ZEND_IS_SMALLER_SPEC_TMPVARCV_TMPVARCV_JMPNZ_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_SUB_SPEC_UNUSED_TMPVAR_OBJ_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_IS_SMALLER_SPEC_TMPVARCV_TMPVARCV_LABEL,
+ (void*)&&ZEND_IS_SMALLER_SPEC_TMPVARCV_TMPVARCV_JMPZ_LABEL,
+ (void*)&&ZEND_IS_SMALLER_SPEC_TMPVARCV_TMPVARCV_JMPNZ_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_SUB_SPEC_UNUSED_CV_OBJ_LABEL,
- (void*)&&ZEND_ASSIGN_SUB_SPEC_CV_CONST_LABEL,
- (void*)&&ZEND_ASSIGN_SUB_SPEC_CV_CONST_DIM_LABEL,
- (void*)&&ZEND_ASSIGN_SUB_SPEC_CV_CONST_OBJ_LABEL,
- (void*)&&ZEND_ASSIGN_SUB_SPEC_CV_TMPVAR_LABEL,
- (void*)&&ZEND_ASSIGN_SUB_SPEC_CV_TMPVAR_DIM_LABEL,
- (void*)&&ZEND_ASSIGN_SUB_SPEC_CV_TMPVAR_OBJ_LABEL,
- (void*)&&ZEND_ASSIGN_SUB_SPEC_CV_TMPVAR_LABEL,
- (void*)&&ZEND_ASSIGN_SUB_SPEC_CV_TMPVAR_DIM_LABEL,
- (void*)&&ZEND_ASSIGN_SUB_SPEC_CV_TMPVAR_OBJ_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_SUB_SPEC_CV_UNUSED_DIM_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_SUB_SPEC_CV_CV_LABEL,
- (void*)&&ZEND_ASSIGN_SUB_SPEC_CV_CV_DIM_LABEL,
- (void*)&&ZEND_ASSIGN_SUB_SPEC_CV_CV_OBJ_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
@@ -52056,18 +50920,66 @@ ZEND_API void execute_ex(zend_execute_data *ex)
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_IS_SMALLER_SPEC_TMPVARCV_CONST_LABEL,
+ (void*)&&ZEND_IS_SMALLER_SPEC_TMPVARCV_CONST_JMPZ_LABEL,
+ (void*)&&ZEND_IS_SMALLER_SPEC_TMPVARCV_CONST_JMPNZ_LABEL,
+ (void*)&&ZEND_IS_SMALLER_SPEC_TMPVARCV_TMPVARCV_LABEL,
+ (void*)&&ZEND_IS_SMALLER_SPEC_TMPVARCV_TMPVARCV_JMPZ_LABEL,
+ (void*)&&ZEND_IS_SMALLER_SPEC_TMPVARCV_TMPVARCV_JMPNZ_LABEL,
+ (void*)&&ZEND_IS_SMALLER_SPEC_TMPVARCV_TMPVARCV_LABEL,
+ (void*)&&ZEND_IS_SMALLER_SPEC_TMPVARCV_TMPVARCV_JMPZ_LABEL,
+ (void*)&&ZEND_IS_SMALLER_SPEC_TMPVARCV_TMPVARCV_JMPNZ_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_IS_SMALLER_SPEC_TMPVARCV_TMPVARCV_LABEL,
+ (void*)&&ZEND_IS_SMALLER_SPEC_TMPVARCV_TMPVARCV_JMPZ_LABEL,
+ (void*)&&ZEND_IS_SMALLER_SPEC_TMPVARCV_TMPVARCV_JMPNZ_LABEL,
+ (void*)&&ZEND_IS_SMALLER_OR_EQUAL_SPEC_CONST_CONST_LABEL,
+ (void*)&&ZEND_IS_SMALLER_OR_EQUAL_SPEC_CONST_CONST_LABEL,
+ (void*)&&ZEND_IS_SMALLER_OR_EQUAL_SPEC_CONST_CONST_LABEL,
+ (void*)&&ZEND_IS_SMALLER_OR_EQUAL_SPEC_CONST_TMPVARCV_LABEL,
+ (void*)&&ZEND_IS_SMALLER_OR_EQUAL_SPEC_CONST_TMPVARCV_JMPZ_LABEL,
+ (void*)&&ZEND_IS_SMALLER_OR_EQUAL_SPEC_CONST_TMPVARCV_JMPNZ_LABEL,
+ (void*)&&ZEND_IS_SMALLER_OR_EQUAL_SPEC_CONST_TMPVARCV_LABEL,
+ (void*)&&ZEND_IS_SMALLER_OR_EQUAL_SPEC_CONST_TMPVARCV_JMPZ_LABEL,
+ (void*)&&ZEND_IS_SMALLER_OR_EQUAL_SPEC_CONST_TMPVARCV_JMPNZ_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_IS_SMALLER_OR_EQUAL_SPEC_CONST_TMPVARCV_LABEL,
+ (void*)&&ZEND_IS_SMALLER_OR_EQUAL_SPEC_CONST_TMPVARCV_JMPZ_LABEL,
+ (void*)&&ZEND_IS_SMALLER_OR_EQUAL_SPEC_CONST_TMPVARCV_JMPNZ_LABEL,
+ (void*)&&ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_CONST_LABEL,
+ (void*)&&ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_CONST_JMPZ_LABEL,
+ (void*)&&ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_CONST_JMPNZ_LABEL,
+ (void*)&&ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_TMPVARCV_LABEL,
+ (void*)&&ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_TMPVARCV_JMPZ_LABEL,
+ (void*)&&ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_TMPVARCV_JMPNZ_LABEL,
+ (void*)&&ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_TMPVARCV_LABEL,
+ (void*)&&ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_TMPVARCV_JMPZ_LABEL,
+ (void*)&&ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_TMPVARCV_JMPNZ_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_TMPVARCV_LABEL,
+ (void*)&&ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_TMPVARCV_JMPZ_LABEL,
+ (void*)&&ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_TMPVARCV_JMPNZ_LABEL,
+ (void*)&&ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_CONST_LABEL,
+ (void*)&&ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_CONST_JMPZ_LABEL,
+ (void*)&&ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_CONST_JMPNZ_LABEL,
+ (void*)&&ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_TMPVARCV_LABEL,
+ (void*)&&ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_TMPVARCV_JMPZ_LABEL,
+ (void*)&&ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_TMPVARCV_JMPNZ_LABEL,
+ (void*)&&ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_TMPVARCV_LABEL,
+ (void*)&&ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_TMPVARCV_JMPZ_LABEL,
+ (void*)&&ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_TMPVARCV_JMPNZ_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_TMPVARCV_LABEL,
+ (void*)&&ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_TMPVARCV_JMPZ_LABEL,
+ (void*)&&ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_TMPVARCV_JMPNZ_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
@@ -52076,51 +50988,33 @@ ZEND_API void execute_ex(zend_execute_data *ex)
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_MUL_SPEC_VAR_CONST_LABEL,
- (void*)&&ZEND_ASSIGN_MUL_SPEC_VAR_CONST_DIM_LABEL,
- (void*)&&ZEND_ASSIGN_MUL_SPEC_VAR_CONST_OBJ_LABEL,
- (void*)&&ZEND_ASSIGN_MUL_SPEC_VAR_TMPVAR_LABEL,
- (void*)&&ZEND_ASSIGN_MUL_SPEC_VAR_TMPVAR_DIM_LABEL,
- (void*)&&ZEND_ASSIGN_MUL_SPEC_VAR_TMPVAR_OBJ_LABEL,
- (void*)&&ZEND_ASSIGN_MUL_SPEC_VAR_TMPVAR_LABEL,
- (void*)&&ZEND_ASSIGN_MUL_SPEC_VAR_TMPVAR_DIM_LABEL,
- (void*)&&ZEND_ASSIGN_MUL_SPEC_VAR_TMPVAR_OBJ_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_MUL_SPEC_VAR_UNUSED_DIM_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_MUL_SPEC_VAR_CV_LABEL,
- (void*)&&ZEND_ASSIGN_MUL_SPEC_VAR_CV_DIM_LABEL,
- (void*)&&ZEND_ASSIGN_MUL_SPEC_VAR_CV_OBJ_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_MUL_SPEC_UNUSED_CONST_OBJ_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_MUL_SPEC_UNUSED_TMPVAR_OBJ_LABEL,
(void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_CONST_LABEL,
+ (void*)&&ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_CONST_JMPZ_LABEL,
+ (void*)&&ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_CONST_JMPNZ_LABEL,
+ (void*)&&ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_TMPVARCV_LABEL,
+ (void*)&&ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_TMPVARCV_JMPZ_LABEL,
+ (void*)&&ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_TMPVARCV_JMPNZ_LABEL,
+ (void*)&&ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_TMPVARCV_LABEL,
+ (void*)&&ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_TMPVARCV_JMPZ_LABEL,
+ (void*)&&ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_TMPVARCV_JMPNZ_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_MUL_SPEC_UNUSED_TMPVAR_OBJ_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_TMPVARCV_LABEL,
+ (void*)&&ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_TMPVARCV_JMPZ_LABEL,
+ (void*)&&ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_TMPVARCV_JMPNZ_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_MUL_SPEC_UNUSED_CV_OBJ_LABEL,
- (void*)&&ZEND_ASSIGN_MUL_SPEC_CV_CONST_LABEL,
- (void*)&&ZEND_ASSIGN_MUL_SPEC_CV_CONST_DIM_LABEL,
- (void*)&&ZEND_ASSIGN_MUL_SPEC_CV_CONST_OBJ_LABEL,
- (void*)&&ZEND_ASSIGN_MUL_SPEC_CV_TMPVAR_LABEL,
- (void*)&&ZEND_ASSIGN_MUL_SPEC_CV_TMPVAR_DIM_LABEL,
- (void*)&&ZEND_ASSIGN_MUL_SPEC_CV_TMPVAR_OBJ_LABEL,
- (void*)&&ZEND_ASSIGN_MUL_SPEC_CV_TMPVAR_LABEL,
- (void*)&&ZEND_ASSIGN_MUL_SPEC_CV_TMPVAR_DIM_LABEL,
- (void*)&&ZEND_ASSIGN_MUL_SPEC_CV_TMPVAR_OBJ_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_MUL_SPEC_CV_UNUSED_DIM_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_MUL_SPEC_CV_CV_LABEL,
- (void*)&&ZEND_ASSIGN_MUL_SPEC_CV_CV_DIM_LABEL,
- (void*)&&ZEND_ASSIGN_MUL_SPEC_CV_CV_OBJ_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
@@ -52136,8 +51030,16 @@ ZEND_API void execute_ex(zend_execute_data *ex)
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_ASSIGN_SPEC_VAR_CONST_RETVAL_UNUSED_LABEL,
+ (void*)&&ZEND_ASSIGN_SPEC_VAR_CONST_RETVAL_USED_LABEL,
+ (void*)&&ZEND_ASSIGN_SPEC_VAR_TMP_RETVAL_UNUSED_LABEL,
+ (void*)&&ZEND_ASSIGN_SPEC_VAR_TMP_RETVAL_USED_LABEL,
+ (void*)&&ZEND_ASSIGN_SPEC_VAR_VAR_RETVAL_UNUSED_LABEL,
+ (void*)&&ZEND_ASSIGN_SPEC_VAR_VAR_RETVAL_USED_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_ASSIGN_SPEC_VAR_CV_RETVAL_UNUSED_LABEL,
+ (void*)&&ZEND_ASSIGN_SPEC_VAR_CV_RETVAL_USED_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
@@ -52148,54 +51050,32 @@ ZEND_API void execute_ex(zend_execute_data *ex)
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_ASSIGN_SPEC_CV_CONST_RETVAL_UNUSED_LABEL,
+ (void*)&&ZEND_ASSIGN_SPEC_CV_CONST_RETVAL_USED_LABEL,
+ (void*)&&ZEND_ASSIGN_SPEC_CV_TMP_RETVAL_UNUSED_LABEL,
+ (void*)&&ZEND_ASSIGN_SPEC_CV_TMP_RETVAL_USED_LABEL,
+ (void*)&&ZEND_ASSIGN_SPEC_CV_VAR_RETVAL_UNUSED_LABEL,
+ (void*)&&ZEND_ASSIGN_SPEC_CV_VAR_RETVAL_USED_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_ASSIGN_SPEC_CV_CV_RETVAL_UNUSED_LABEL,
+ (void*)&&ZEND_ASSIGN_SPEC_CV_CV_RETVAL_USED_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_DIV_SPEC_VAR_CONST_LABEL,
- (void*)&&ZEND_ASSIGN_DIV_SPEC_VAR_CONST_DIM_LABEL,
- (void*)&&ZEND_ASSIGN_DIV_SPEC_VAR_CONST_OBJ_LABEL,
- (void*)&&ZEND_ASSIGN_DIV_SPEC_VAR_TMPVAR_LABEL,
- (void*)&&ZEND_ASSIGN_DIV_SPEC_VAR_TMPVAR_DIM_LABEL,
- (void*)&&ZEND_ASSIGN_DIV_SPEC_VAR_TMPVAR_OBJ_LABEL,
- (void*)&&ZEND_ASSIGN_DIV_SPEC_VAR_TMPVAR_LABEL,
- (void*)&&ZEND_ASSIGN_DIV_SPEC_VAR_TMPVAR_DIM_LABEL,
- (void*)&&ZEND_ASSIGN_DIV_SPEC_VAR_TMPVAR_OBJ_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_DIV_SPEC_VAR_UNUSED_DIM_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_DIV_SPEC_VAR_CV_LABEL,
- (void*)&&ZEND_ASSIGN_DIV_SPEC_VAR_CV_DIM_LABEL,
- (void*)&&ZEND_ASSIGN_DIV_SPEC_VAR_CV_OBJ_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_DIV_SPEC_UNUSED_CONST_OBJ_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_DIV_SPEC_UNUSED_TMPVAR_OBJ_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_DIV_SPEC_UNUSED_TMPVAR_OBJ_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_DIV_SPEC_UNUSED_CV_OBJ_LABEL,
- (void*)&&ZEND_ASSIGN_DIV_SPEC_CV_CONST_LABEL,
- (void*)&&ZEND_ASSIGN_DIV_SPEC_CV_CONST_DIM_LABEL,
- (void*)&&ZEND_ASSIGN_DIV_SPEC_CV_CONST_OBJ_LABEL,
- (void*)&&ZEND_ASSIGN_DIV_SPEC_CV_TMPVAR_LABEL,
- (void*)&&ZEND_ASSIGN_DIV_SPEC_CV_TMPVAR_DIM_LABEL,
- (void*)&&ZEND_ASSIGN_DIV_SPEC_CV_TMPVAR_OBJ_LABEL,
- (void*)&&ZEND_ASSIGN_DIV_SPEC_CV_TMPVAR_LABEL,
- (void*)&&ZEND_ASSIGN_DIV_SPEC_CV_TMPVAR_DIM_LABEL,
- (void*)&&ZEND_ASSIGN_DIV_SPEC_CV_TMPVAR_OBJ_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_DIV_SPEC_CV_UNUSED_DIM_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_DIV_SPEC_CV_CV_LABEL,
- (void*)&&ZEND_ASSIGN_DIV_SPEC_CV_CV_DIM_LABEL,
- (void*)&&ZEND_ASSIGN_DIV_SPEC_CV_CV_OBJ_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
@@ -52226,51 +51106,41 @@ ZEND_API void execute_ex(zend_execute_data *ex)
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_MOD_SPEC_VAR_CONST_LABEL,
- (void*)&&ZEND_ASSIGN_MOD_SPEC_VAR_CONST_DIM_LABEL,
- (void*)&&ZEND_ASSIGN_MOD_SPEC_VAR_CONST_OBJ_LABEL,
- (void*)&&ZEND_ASSIGN_MOD_SPEC_VAR_TMPVAR_LABEL,
- (void*)&&ZEND_ASSIGN_MOD_SPEC_VAR_TMPVAR_DIM_LABEL,
- (void*)&&ZEND_ASSIGN_MOD_SPEC_VAR_TMPVAR_OBJ_LABEL,
- (void*)&&ZEND_ASSIGN_MOD_SPEC_VAR_TMPVAR_LABEL,
- (void*)&&ZEND_ASSIGN_MOD_SPEC_VAR_TMPVAR_DIM_LABEL,
- (void*)&&ZEND_ASSIGN_MOD_SPEC_VAR_TMPVAR_OBJ_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_MOD_SPEC_VAR_UNUSED_DIM_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_MOD_SPEC_VAR_CV_LABEL,
- (void*)&&ZEND_ASSIGN_MOD_SPEC_VAR_CV_DIM_LABEL,
- (void*)&&ZEND_ASSIGN_MOD_SPEC_VAR_CV_OBJ_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_MOD_SPEC_UNUSED_CONST_OBJ_LABEL,
+ (void*)&&ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_DATA_CONST_LABEL,
+ (void*)&&ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_DATA_TMP_LABEL,
+ (void*)&&ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_DATA_VAR_LABEL,
(void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_DATA_CV_LABEL,
+ (void*)&&ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_DATA_CONST_LABEL,
+ (void*)&&ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_DATA_TMP_LABEL,
+ (void*)&&ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_DATA_VAR_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_MOD_SPEC_UNUSED_TMPVAR_OBJ_LABEL,
+ (void*)&&ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_DATA_CV_LABEL,
+ (void*)&&ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_DATA_CONST_LABEL,
+ (void*)&&ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_DATA_TMP_LABEL,
+ (void*)&&ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_DATA_VAR_LABEL,
(void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_DATA_CV_LABEL,
+ (void*)&&ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_DATA_CONST_LABEL,
+ (void*)&&ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_DATA_TMP_LABEL,
+ (void*)&&ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_DATA_VAR_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_MOD_SPEC_UNUSED_TMPVAR_OBJ_LABEL,
+ (void*)&&ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_DATA_CV_LABEL,
+ (void*)&&ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA_CONST_LABEL,
+ (void*)&&ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA_TMP_LABEL,
+ (void*)&&ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA_VAR_LABEL,
(void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA_CV_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_MOD_SPEC_UNUSED_CV_OBJ_LABEL,
- (void*)&&ZEND_ASSIGN_MOD_SPEC_CV_CONST_LABEL,
- (void*)&&ZEND_ASSIGN_MOD_SPEC_CV_CONST_DIM_LABEL,
- (void*)&&ZEND_ASSIGN_MOD_SPEC_CV_CONST_OBJ_LABEL,
- (void*)&&ZEND_ASSIGN_MOD_SPEC_CV_TMPVAR_LABEL,
- (void*)&&ZEND_ASSIGN_MOD_SPEC_CV_TMPVAR_DIM_LABEL,
- (void*)&&ZEND_ASSIGN_MOD_SPEC_CV_TMPVAR_OBJ_LABEL,
- (void*)&&ZEND_ASSIGN_MOD_SPEC_CV_TMPVAR_LABEL,
- (void*)&&ZEND_ASSIGN_MOD_SPEC_CV_TMPVAR_DIM_LABEL,
- (void*)&&ZEND_ASSIGN_MOD_SPEC_CV_TMPVAR_OBJ_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_MOD_SPEC_CV_UNUSED_DIM_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_MOD_SPEC_CV_CV_LABEL,
- (void*)&&ZEND_ASSIGN_MOD_SPEC_CV_CV_DIM_LABEL,
- (void*)&&ZEND_ASSIGN_MOD_SPEC_CV_CV_OBJ_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
@@ -52290,62 +51160,52 @@ ZEND_API void execute_ex(zend_execute_data *ex)
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DATA_CONST_LABEL,
+ (void*)&&ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DATA_TMP_LABEL,
+ (void*)&&ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DATA_VAR_LABEL,
(void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DATA_CV_LABEL,
+ (void*)&&ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_DATA_CONST_LABEL,
+ (void*)&&ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_DATA_TMP_LABEL,
+ (void*)&&ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_DATA_VAR_LABEL,
(void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_DATA_CV_LABEL,
+ (void*)&&ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_DATA_CONST_LABEL,
+ (void*)&&ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_DATA_TMP_LABEL,
+ (void*)&&ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_DATA_VAR_LABEL,
(void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_DATA_CV_LABEL,
+ (void*)&&ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_DATA_CONST_LABEL,
+ (void*)&&ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_DATA_TMP_LABEL,
+ (void*)&&ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_DATA_VAR_LABEL,
(void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_DATA_CV_LABEL,
+ (void*)&&ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_CONST_LABEL,
+ (void*)&&ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_TMP_LABEL,
+ (void*)&&ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_VAR_LABEL,
(void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_CV_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_SL_SPEC_VAR_CONST_LABEL,
- (void*)&&ZEND_ASSIGN_SL_SPEC_VAR_CONST_DIM_LABEL,
- (void*)&&ZEND_ASSIGN_SL_SPEC_VAR_CONST_OBJ_LABEL,
- (void*)&&ZEND_ASSIGN_SL_SPEC_VAR_TMPVAR_LABEL,
- (void*)&&ZEND_ASSIGN_SL_SPEC_VAR_TMPVAR_DIM_LABEL,
- (void*)&&ZEND_ASSIGN_SL_SPEC_VAR_TMPVAR_OBJ_LABEL,
- (void*)&&ZEND_ASSIGN_SL_SPEC_VAR_TMPVAR_LABEL,
- (void*)&&ZEND_ASSIGN_SL_SPEC_VAR_TMPVAR_DIM_LABEL,
- (void*)&&ZEND_ASSIGN_SL_SPEC_VAR_TMPVAR_OBJ_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_SL_SPEC_VAR_UNUSED_DIM_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_SL_SPEC_VAR_CV_LABEL,
- (void*)&&ZEND_ASSIGN_SL_SPEC_VAR_CV_DIM_LABEL,
- (void*)&&ZEND_ASSIGN_SL_SPEC_VAR_CV_OBJ_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_SL_SPEC_UNUSED_CONST_OBJ_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_SL_SPEC_UNUSED_TMPVAR_OBJ_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_SL_SPEC_UNUSED_TMPVAR_OBJ_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_SL_SPEC_UNUSED_CV_OBJ_LABEL,
- (void*)&&ZEND_ASSIGN_SL_SPEC_CV_CONST_LABEL,
- (void*)&&ZEND_ASSIGN_SL_SPEC_CV_CONST_DIM_LABEL,
- (void*)&&ZEND_ASSIGN_SL_SPEC_CV_CONST_OBJ_LABEL,
- (void*)&&ZEND_ASSIGN_SL_SPEC_CV_TMPVAR_LABEL,
- (void*)&&ZEND_ASSIGN_SL_SPEC_CV_TMPVAR_DIM_LABEL,
- (void*)&&ZEND_ASSIGN_SL_SPEC_CV_TMPVAR_OBJ_LABEL,
- (void*)&&ZEND_ASSIGN_SL_SPEC_CV_TMPVAR_LABEL,
- (void*)&&ZEND_ASSIGN_SL_SPEC_CV_TMPVAR_DIM_LABEL,
- (void*)&&ZEND_ASSIGN_SL_SPEC_CV_TMPVAR_OBJ_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_SL_SPEC_CV_UNUSED_DIM_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_SL_SPEC_CV_CV_LABEL,
- (void*)&&ZEND_ASSIGN_SL_SPEC_CV_CV_DIM_LABEL,
- (void*)&&ZEND_ASSIGN_SL_SPEC_CV_CV_OBJ_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
@@ -52375,64 +51235,86 @@ ZEND_API void execute_ex(zend_execute_data *ex)
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_DATA_CONST_LABEL,
+ (void*)&&ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_DATA_TMP_LABEL,
+ (void*)&&ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_DATA_VAR_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_SR_SPEC_VAR_CONST_LABEL,
- (void*)&&ZEND_ASSIGN_SR_SPEC_VAR_CONST_DIM_LABEL,
- (void*)&&ZEND_ASSIGN_SR_SPEC_VAR_CONST_OBJ_LABEL,
- (void*)&&ZEND_ASSIGN_SR_SPEC_VAR_TMPVAR_LABEL,
- (void*)&&ZEND_ASSIGN_SR_SPEC_VAR_TMPVAR_DIM_LABEL,
- (void*)&&ZEND_ASSIGN_SR_SPEC_VAR_TMPVAR_OBJ_LABEL,
- (void*)&&ZEND_ASSIGN_SR_SPEC_VAR_TMPVAR_LABEL,
- (void*)&&ZEND_ASSIGN_SR_SPEC_VAR_TMPVAR_DIM_LABEL,
- (void*)&&ZEND_ASSIGN_SR_SPEC_VAR_TMPVAR_OBJ_LABEL,
+ (void*)&&ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_DATA_CV_LABEL,
+ (void*)&&ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_DATA_CONST_LABEL,
+ (void*)&&ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_DATA_TMP_LABEL,
+ (void*)&&ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_DATA_VAR_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_SR_SPEC_VAR_UNUSED_DIM_LABEL,
+ (void*)&&ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_DATA_CV_LABEL,
+ (void*)&&ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_DATA_CONST_LABEL,
+ (void*)&&ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_DATA_TMP_LABEL,
+ (void*)&&ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_DATA_VAR_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_SR_SPEC_VAR_CV_LABEL,
- (void*)&&ZEND_ASSIGN_SR_SPEC_VAR_CV_DIM_LABEL,
- (void*)&&ZEND_ASSIGN_SR_SPEC_VAR_CV_OBJ_LABEL,
+ (void*)&&ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_DATA_CV_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_SR_SPEC_UNUSED_CONST_OBJ_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_SR_SPEC_UNUSED_TMPVAR_OBJ_LABEL,
(void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA_CONST_LABEL,
+ (void*)&&ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA_TMP_LABEL,
+ (void*)&&ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA_VAR_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_SR_SPEC_UNUSED_TMPVAR_OBJ_LABEL,
+ (void*)&&ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA_CV_LABEL,
+ (void*)&&ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_OP_DATA_CONST_LABEL,
+ (void*)&&ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_OP_DATA_TMP_LABEL,
+ (void*)&&ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_OP_DATA_VAR_LABEL,
(void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_OP_DATA_CV_LABEL,
+ (void*)&&ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_OP_DATA_CONST_LABEL,
+ (void*)&&ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_OP_DATA_TMP_LABEL,
+ (void*)&&ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_OP_DATA_VAR_LABEL,
(void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_OP_DATA_CV_LABEL,
+ (void*)&&ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_OP_DATA_CONST_LABEL,
+ (void*)&&ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_OP_DATA_TMP_LABEL,
+ (void*)&&ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_OP_DATA_VAR_LABEL,
(void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_OP_DATA_CV_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_SR_SPEC_UNUSED_CV_OBJ_LABEL,
- (void*)&&ZEND_ASSIGN_SR_SPEC_CV_CONST_LABEL,
- (void*)&&ZEND_ASSIGN_SR_SPEC_CV_CONST_DIM_LABEL,
- (void*)&&ZEND_ASSIGN_SR_SPEC_CV_CONST_OBJ_LABEL,
- (void*)&&ZEND_ASSIGN_SR_SPEC_CV_TMPVAR_LABEL,
- (void*)&&ZEND_ASSIGN_SR_SPEC_CV_TMPVAR_DIM_LABEL,
- (void*)&&ZEND_ASSIGN_SR_SPEC_CV_TMPVAR_OBJ_LABEL,
- (void*)&&ZEND_ASSIGN_SR_SPEC_CV_TMPVAR_LABEL,
- (void*)&&ZEND_ASSIGN_SR_SPEC_CV_TMPVAR_DIM_LABEL,
- (void*)&&ZEND_ASSIGN_SR_SPEC_CV_TMPVAR_OBJ_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_SR_SPEC_CV_UNUSED_DIM_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_SR_SPEC_CV_CV_LABEL,
- (void*)&&ZEND_ASSIGN_SR_SPEC_CV_CV_DIM_LABEL,
- (void*)&&ZEND_ASSIGN_SR_SPEC_CV_CV_OBJ_LABEL,
(void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_DATA_CONST_LABEL,
+ (void*)&&ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_DATA_TMP_LABEL,
+ (void*)&&ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_DATA_VAR_LABEL,
(void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_DATA_CV_LABEL,
+ (void*)&&ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DATA_CONST_LABEL,
+ (void*)&&ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DATA_TMP_LABEL,
+ (void*)&&ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DATA_VAR_LABEL,
(void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DATA_CV_LABEL,
+ (void*)&&ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_DATA_CONST_LABEL,
+ (void*)&&ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_DATA_TMP_LABEL,
+ (void*)&&ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_DATA_VAR_LABEL,
(void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_DATA_CV_LABEL,
+ (void*)&&ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_DATA_CONST_LABEL,
+ (void*)&&ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_DATA_TMP_LABEL,
+ (void*)&&ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_DATA_VAR_LABEL,
(void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_DATA_CV_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_CONST_LABEL,
+ (void*)&&ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_TMP_LABEL,
+ (void*)&&ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_VAR_LABEL,
(void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_CV_LABEL,
+ (void*)&&ZEND_ASSIGN_STATIC_PROP_SPEC_OP_DATA_CONST_LABEL,
+ (void*)&&ZEND_ASSIGN_STATIC_PROP_SPEC_OP_DATA_TMP_LABEL,
+ (void*)&&ZEND_ASSIGN_STATIC_PROP_SPEC_OP_DATA_VAR_LABEL,
(void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_ASSIGN_STATIC_PROP_SPEC_OP_DATA_CV_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
@@ -52443,59 +51325,47 @@ ZEND_API void execute_ex(zend_execute_data *ex)
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_ASSIGN_OP_SPEC_VAR_CONST_LABEL,
+ (void*)&&ZEND_ASSIGN_OP_SPEC_VAR_TMPVAR_LABEL,
+ (void*)&&ZEND_ASSIGN_OP_SPEC_VAR_TMPVAR_LABEL,
(void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_ASSIGN_OP_SPEC_VAR_CV_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_ASSIGN_OP_SPEC_CV_CONST_LABEL,
+ (void*)&&ZEND_ASSIGN_OP_SPEC_CV_TMPVAR_LABEL,
+ (void*)&&ZEND_ASSIGN_OP_SPEC_CV_TMPVAR_LABEL,
(void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_ASSIGN_OP_SPEC_CV_CV_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_CONCAT_SPEC_VAR_CONST_LABEL,
- (void*)&&ZEND_ASSIGN_CONCAT_SPEC_VAR_CONST_DIM_LABEL,
- (void*)&&ZEND_ASSIGN_CONCAT_SPEC_VAR_CONST_OBJ_LABEL,
- (void*)&&ZEND_ASSIGN_CONCAT_SPEC_VAR_TMPVAR_LABEL,
- (void*)&&ZEND_ASSIGN_CONCAT_SPEC_VAR_TMPVAR_DIM_LABEL,
- (void*)&&ZEND_ASSIGN_CONCAT_SPEC_VAR_TMPVAR_OBJ_LABEL,
- (void*)&&ZEND_ASSIGN_CONCAT_SPEC_VAR_TMPVAR_LABEL,
- (void*)&&ZEND_ASSIGN_CONCAT_SPEC_VAR_TMPVAR_DIM_LABEL,
- (void*)&&ZEND_ASSIGN_CONCAT_SPEC_VAR_TMPVAR_OBJ_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_CONCAT_SPEC_VAR_UNUSED_DIM_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_CONCAT_SPEC_VAR_CV_LABEL,
- (void*)&&ZEND_ASSIGN_CONCAT_SPEC_VAR_CV_DIM_LABEL,
- (void*)&&ZEND_ASSIGN_CONCAT_SPEC_VAR_CV_OBJ_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_CONCAT_SPEC_UNUSED_CONST_OBJ_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_CONCAT_SPEC_UNUSED_TMPVAR_OBJ_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_CONCAT_SPEC_UNUSED_TMPVAR_OBJ_LABEL,
(void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_ASSIGN_DIM_OP_SPEC_VAR_CONST_LABEL,
+ (void*)&&ZEND_ASSIGN_DIM_OP_SPEC_VAR_TMPVAR_LABEL,
+ (void*)&&ZEND_ASSIGN_DIM_OP_SPEC_VAR_TMPVAR_LABEL,
+ (void*)&&ZEND_ASSIGN_DIM_OP_SPEC_VAR_UNUSED_LABEL,
+ (void*)&&ZEND_ASSIGN_DIM_OP_SPEC_VAR_CV_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_CONCAT_SPEC_UNUSED_CV_OBJ_LABEL,
- (void*)&&ZEND_ASSIGN_CONCAT_SPEC_CV_CONST_LABEL,
- (void*)&&ZEND_ASSIGN_CONCAT_SPEC_CV_CONST_DIM_LABEL,
- (void*)&&ZEND_ASSIGN_CONCAT_SPEC_CV_CONST_OBJ_LABEL,
- (void*)&&ZEND_ASSIGN_CONCAT_SPEC_CV_TMPVAR_LABEL,
- (void*)&&ZEND_ASSIGN_CONCAT_SPEC_CV_TMPVAR_DIM_LABEL,
- (void*)&&ZEND_ASSIGN_CONCAT_SPEC_CV_TMPVAR_OBJ_LABEL,
- (void*)&&ZEND_ASSIGN_CONCAT_SPEC_CV_TMPVAR_LABEL,
- (void*)&&ZEND_ASSIGN_CONCAT_SPEC_CV_TMPVAR_DIM_LABEL,
- (void*)&&ZEND_ASSIGN_CONCAT_SPEC_CV_TMPVAR_OBJ_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_CONCAT_SPEC_CV_UNUSED_DIM_LABEL,
+ (void*)&&ZEND_ASSIGN_DIM_OP_SPEC_CV_CONST_LABEL,
+ (void*)&&ZEND_ASSIGN_DIM_OP_SPEC_CV_TMPVAR_LABEL,
+ (void*)&&ZEND_ASSIGN_DIM_OP_SPEC_CV_TMPVAR_LABEL,
+ (void*)&&ZEND_ASSIGN_DIM_OP_SPEC_CV_UNUSED_LABEL,
+ (void*)&&ZEND_ASSIGN_DIM_OP_SPEC_CV_CV_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_CONCAT_SPEC_CV_CV_LABEL,
- (void*)&&ZEND_ASSIGN_CONCAT_SPEC_CV_CV_DIM_LABEL,
- (void*)&&ZEND_ASSIGN_CONCAT_SPEC_CV_CV_OBJ_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
@@ -52505,9 +51375,22 @@ ZEND_API void execute_ex(zend_execute_data *ex)
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_ASSIGN_OBJ_OP_SPEC_VAR_CONST_LABEL,
+ (void*)&&ZEND_ASSIGN_OBJ_OP_SPEC_VAR_TMPVAR_LABEL,
+ (void*)&&ZEND_ASSIGN_OBJ_OP_SPEC_VAR_TMPVAR_LABEL,
(void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_ASSIGN_OBJ_OP_SPEC_VAR_CV_LABEL,
+ (void*)&&ZEND_ASSIGN_OBJ_OP_SPEC_UNUSED_CONST_LABEL,
+ (void*)&&ZEND_ASSIGN_OBJ_OP_SPEC_UNUSED_TMPVAR_LABEL,
+ (void*)&&ZEND_ASSIGN_OBJ_OP_SPEC_UNUSED_TMPVAR_LABEL,
(void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_ASSIGN_OBJ_OP_SPEC_UNUSED_CV_LABEL,
+ (void*)&&ZEND_ASSIGN_OBJ_OP_SPEC_CV_CONST_LABEL,
+ (void*)&&ZEND_ASSIGN_OBJ_OP_SPEC_CV_TMPVAR_LABEL,
+ (void*)&&ZEND_ASSIGN_OBJ_OP_SPEC_CV_TMPVAR_LABEL,
(void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_ASSIGN_OBJ_OP_SPEC_CV_CV_LABEL,
+ (void*)&&ZEND_ASSIGN_STATIC_PROP_OP_SPEC_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
@@ -52520,57 +51403,35 @@ ZEND_API void execute_ex(zend_execute_data *ex)
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_ASSIGN_REF_SPEC_VAR_VAR_LABEL,
(void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_ASSIGN_REF_SPEC_VAR_CV_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_BW_OR_SPEC_VAR_CONST_LABEL,
- (void*)&&ZEND_ASSIGN_BW_OR_SPEC_VAR_CONST_DIM_LABEL,
- (void*)&&ZEND_ASSIGN_BW_OR_SPEC_VAR_CONST_OBJ_LABEL,
- (void*)&&ZEND_ASSIGN_BW_OR_SPEC_VAR_TMPVAR_LABEL,
- (void*)&&ZEND_ASSIGN_BW_OR_SPEC_VAR_TMPVAR_DIM_LABEL,
- (void*)&&ZEND_ASSIGN_BW_OR_SPEC_VAR_TMPVAR_OBJ_LABEL,
- (void*)&&ZEND_ASSIGN_BW_OR_SPEC_VAR_TMPVAR_LABEL,
- (void*)&&ZEND_ASSIGN_BW_OR_SPEC_VAR_TMPVAR_DIM_LABEL,
- (void*)&&ZEND_ASSIGN_BW_OR_SPEC_VAR_TMPVAR_OBJ_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_BW_OR_SPEC_VAR_UNUSED_DIM_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_BW_OR_SPEC_VAR_CV_LABEL,
- (void*)&&ZEND_ASSIGN_BW_OR_SPEC_VAR_CV_DIM_LABEL,
- (void*)&&ZEND_ASSIGN_BW_OR_SPEC_VAR_CV_OBJ_LABEL,
+ (void*)&&ZEND_ASSIGN_REF_SPEC_CV_VAR_LABEL,
(void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_ASSIGN_REF_SPEC_CV_CV_LABEL,
+ (void*)&&ZEND_QM_ASSIGN_SPEC_CONST_LABEL,
+ (void*)&&ZEND_QM_ASSIGN_SPEC_TMP_LABEL,
+ (void*)&&ZEND_QM_ASSIGN_SPEC_VAR_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_BW_OR_SPEC_UNUSED_CONST_OBJ_LABEL,
+ (void*)&&ZEND_QM_ASSIGN_SPEC_CV_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_BW_OR_SPEC_UNUSED_TMPVAR_OBJ_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_BW_OR_SPEC_UNUSED_TMPVAR_OBJ_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_BW_OR_SPEC_UNUSED_CV_OBJ_LABEL,
- (void*)&&ZEND_ASSIGN_BW_OR_SPEC_CV_CONST_LABEL,
- (void*)&&ZEND_ASSIGN_BW_OR_SPEC_CV_CONST_DIM_LABEL,
- (void*)&&ZEND_ASSIGN_BW_OR_SPEC_CV_CONST_OBJ_LABEL,
- (void*)&&ZEND_ASSIGN_BW_OR_SPEC_CV_TMPVAR_LABEL,
- (void*)&&ZEND_ASSIGN_BW_OR_SPEC_CV_TMPVAR_DIM_LABEL,
- (void*)&&ZEND_ASSIGN_BW_OR_SPEC_CV_TMPVAR_OBJ_LABEL,
- (void*)&&ZEND_ASSIGN_BW_OR_SPEC_CV_TMPVAR_LABEL,
- (void*)&&ZEND_ASSIGN_BW_OR_SPEC_CV_TMPVAR_DIM_LABEL,
- (void*)&&ZEND_ASSIGN_BW_OR_SPEC_CV_TMPVAR_OBJ_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_BW_OR_SPEC_CV_UNUSED_DIM_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_BW_OR_SPEC_CV_CV_LABEL,
- (void*)&&ZEND_ASSIGN_BW_OR_SPEC_CV_CV_DIM_LABEL,
- (void*)&&ZEND_ASSIGN_BW_OR_SPEC_CV_CV_OBJ_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
@@ -52601,54 +51462,30 @@ ZEND_API void execute_ex(zend_execute_data *ex)
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_BW_AND_SPEC_VAR_CONST_LABEL,
- (void*)&&ZEND_ASSIGN_BW_AND_SPEC_VAR_CONST_DIM_LABEL,
- (void*)&&ZEND_ASSIGN_BW_AND_SPEC_VAR_CONST_OBJ_LABEL,
- (void*)&&ZEND_ASSIGN_BW_AND_SPEC_VAR_TMPVAR_LABEL,
- (void*)&&ZEND_ASSIGN_BW_AND_SPEC_VAR_TMPVAR_DIM_LABEL,
- (void*)&&ZEND_ASSIGN_BW_AND_SPEC_VAR_TMPVAR_OBJ_LABEL,
- (void*)&&ZEND_ASSIGN_BW_AND_SPEC_VAR_TMPVAR_LABEL,
- (void*)&&ZEND_ASSIGN_BW_AND_SPEC_VAR_TMPVAR_DIM_LABEL,
- (void*)&&ZEND_ASSIGN_BW_AND_SPEC_VAR_TMPVAR_OBJ_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_BW_AND_SPEC_VAR_UNUSED_DIM_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_BW_AND_SPEC_VAR_CV_LABEL,
- (void*)&&ZEND_ASSIGN_BW_AND_SPEC_VAR_CV_DIM_LABEL,
- (void*)&&ZEND_ASSIGN_BW_AND_SPEC_VAR_CV_OBJ_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_BW_AND_SPEC_UNUSED_CONST_OBJ_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_BW_AND_SPEC_UNUSED_TMPVAR_OBJ_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_BW_AND_SPEC_UNUSED_TMPVAR_OBJ_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_OP_DATA_VAR_LABEL,
(void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_OP_DATA_CV_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_BW_AND_SPEC_UNUSED_CV_OBJ_LABEL,
- (void*)&&ZEND_ASSIGN_BW_AND_SPEC_CV_CONST_LABEL,
- (void*)&&ZEND_ASSIGN_BW_AND_SPEC_CV_CONST_DIM_LABEL,
- (void*)&&ZEND_ASSIGN_BW_AND_SPEC_CV_CONST_OBJ_LABEL,
- (void*)&&ZEND_ASSIGN_BW_AND_SPEC_CV_TMPVAR_LABEL,
- (void*)&&ZEND_ASSIGN_BW_AND_SPEC_CV_TMPVAR_DIM_LABEL,
- (void*)&&ZEND_ASSIGN_BW_AND_SPEC_CV_TMPVAR_OBJ_LABEL,
- (void*)&&ZEND_ASSIGN_BW_AND_SPEC_CV_TMPVAR_LABEL,
- (void*)&&ZEND_ASSIGN_BW_AND_SPEC_CV_TMPVAR_DIM_LABEL,
- (void*)&&ZEND_ASSIGN_BW_AND_SPEC_CV_TMPVAR_OBJ_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_BW_AND_SPEC_CV_UNUSED_DIM_LABEL,
+ (void*)&&ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR_OP_DATA_VAR_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_BW_AND_SPEC_CV_CV_LABEL,
- (void*)&&ZEND_ASSIGN_BW_AND_SPEC_CV_CV_DIM_LABEL,
- (void*)&&ZEND_ASSIGN_BW_AND_SPEC_CV_CV_OBJ_LABEL,
+ (void*)&&ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR_OP_DATA_CV_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR_OP_DATA_VAR_LABEL,
(void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR_OP_DATA_CV_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
@@ -52656,16 +51493,24 @@ ZEND_API void execute_ex(zend_execute_data *ex)
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_DATA_VAR_LABEL,
(void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_DATA_CV_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CONST_OP_DATA_VAR_LABEL,
(void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CONST_OP_DATA_CV_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMPVAR_OP_DATA_VAR_LABEL,
(void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMPVAR_OP_DATA_CV_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMPVAR_OP_DATA_VAR_LABEL,
(void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMPVAR_OP_DATA_CV_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
@@ -52673,54 +51518,35 @@ ZEND_API void execute_ex(zend_execute_data *ex)
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_OP_DATA_VAR_LABEL,
(void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_OP_DATA_CV_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_BW_XOR_SPEC_VAR_CONST_LABEL,
- (void*)&&ZEND_ASSIGN_BW_XOR_SPEC_VAR_CONST_DIM_LABEL,
- (void*)&&ZEND_ASSIGN_BW_XOR_SPEC_VAR_CONST_OBJ_LABEL,
- (void*)&&ZEND_ASSIGN_BW_XOR_SPEC_VAR_TMPVAR_LABEL,
- (void*)&&ZEND_ASSIGN_BW_XOR_SPEC_VAR_TMPVAR_DIM_LABEL,
- (void*)&&ZEND_ASSIGN_BW_XOR_SPEC_VAR_TMPVAR_OBJ_LABEL,
- (void*)&&ZEND_ASSIGN_BW_XOR_SPEC_VAR_TMPVAR_LABEL,
- (void*)&&ZEND_ASSIGN_BW_XOR_SPEC_VAR_TMPVAR_DIM_LABEL,
- (void*)&&ZEND_ASSIGN_BW_XOR_SPEC_VAR_TMPVAR_OBJ_LABEL,
+ (void*)&&ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_OP_DATA_VAR_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_BW_XOR_SPEC_VAR_UNUSED_DIM_LABEL,
+ (void*)&&ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_OP_DATA_CV_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_BW_XOR_SPEC_VAR_CV_LABEL,
- (void*)&&ZEND_ASSIGN_BW_XOR_SPEC_VAR_CV_DIM_LABEL,
- (void*)&&ZEND_ASSIGN_BW_XOR_SPEC_VAR_CV_OBJ_LABEL,
(void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_OP_DATA_VAR_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_BW_XOR_SPEC_UNUSED_CONST_OBJ_LABEL,
+ (void*)&&ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_OP_DATA_CV_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_BW_XOR_SPEC_UNUSED_TMPVAR_OBJ_LABEL,
+ (void*)&&ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_OP_DATA_VAR_LABEL,
(void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_OP_DATA_CV_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_BW_XOR_SPEC_UNUSED_TMPVAR_OBJ_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_BW_XOR_SPEC_UNUSED_CV_OBJ_LABEL,
- (void*)&&ZEND_ASSIGN_BW_XOR_SPEC_CV_CONST_LABEL,
- (void*)&&ZEND_ASSIGN_BW_XOR_SPEC_CV_CONST_DIM_LABEL,
- (void*)&&ZEND_ASSIGN_BW_XOR_SPEC_CV_CONST_OBJ_LABEL,
- (void*)&&ZEND_ASSIGN_BW_XOR_SPEC_CV_TMPVAR_LABEL,
- (void*)&&ZEND_ASSIGN_BW_XOR_SPEC_CV_TMPVAR_DIM_LABEL,
- (void*)&&ZEND_ASSIGN_BW_XOR_SPEC_CV_TMPVAR_OBJ_LABEL,
- (void*)&&ZEND_ASSIGN_BW_XOR_SPEC_CV_TMPVAR_LABEL,
- (void*)&&ZEND_ASSIGN_BW_XOR_SPEC_CV_TMPVAR_DIM_LABEL,
- (void*)&&ZEND_ASSIGN_BW_XOR_SPEC_CV_TMPVAR_OBJ_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_BW_XOR_SPEC_CV_UNUSED_DIM_LABEL,
+ (void*)&&ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_DATA_VAR_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_BW_XOR_SPEC_CV_CV_LABEL,
- (void*)&&ZEND_ASSIGN_BW_XOR_SPEC_CV_CV_DIM_LABEL,
- (void*)&&ZEND_ASSIGN_BW_XOR_SPEC_CV_CV_OBJ_LABEL,
+ (void*)&&ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_DATA_CV_LABEL,
+ (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
@@ -52751,87 +51577,8 @@ ZEND_API void execute_ex(zend_execute_data *ex)
(void*)&&ZEND_POST_DEC_SPEC_VAR_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_POST_DEC_SPEC_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_ASSIGN_SPEC_VAR_CONST_RETVAL_UNUSED_LABEL,
- (void*)&&ZEND_ASSIGN_SPEC_VAR_CONST_RETVAL_USED_LABEL,
- (void*)&&ZEND_ASSIGN_SPEC_VAR_TMP_RETVAL_UNUSED_LABEL,
- (void*)&&ZEND_ASSIGN_SPEC_VAR_TMP_RETVAL_USED_LABEL,
- (void*)&&ZEND_ASSIGN_SPEC_VAR_VAR_RETVAL_UNUSED_LABEL,
- (void*)&&ZEND_ASSIGN_SPEC_VAR_VAR_RETVAL_USED_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_SPEC_VAR_CV_RETVAL_UNUSED_LABEL,
- (void*)&&ZEND_ASSIGN_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_ASSIGN_SPEC_CV_CONST_RETVAL_UNUSED_LABEL,
- (void*)&&ZEND_ASSIGN_SPEC_CV_CONST_RETVAL_USED_LABEL,
- (void*)&&ZEND_ASSIGN_SPEC_CV_TMP_RETVAL_UNUSED_LABEL,
- (void*)&&ZEND_ASSIGN_SPEC_CV_TMP_RETVAL_USED_LABEL,
- (void*)&&ZEND_ASSIGN_SPEC_CV_VAR_RETVAL_UNUSED_LABEL,
- (void*)&&ZEND_ASSIGN_SPEC_CV_VAR_RETVAL_USED_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_SPEC_CV_CV_RETVAL_UNUSED_LABEL,
- (void*)&&ZEND_ASSIGN_SPEC_CV_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_ASSIGN_REF_SPEC_VAR_VAR_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_REF_SPEC_VAR_CV_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_REF_SPEC_CV_VAR_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_REF_SPEC_CV_CV_LABEL,
- (void*)&&ZEND_ECHO_SPEC_CONST_LABEL,
- (void*)&&ZEND_ECHO_SPEC_TMPVAR_LABEL,
- (void*)&&ZEND_ECHO_SPEC_TMPVAR_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ECHO_SPEC_CV_LABEL,
- (void*)&&ZEND_GENERATOR_CREATE_SPEC_LABEL,
+ (void*)&&ZEND_PRE_INC_STATIC_PROP_SPEC_LABEL,
+ (void*)&&ZEND_POST_INC_STATIC_PROP_SPEC_LABEL,
(void*)&&ZEND_JMP_SPEC_LABEL,
(void*)&&ZEND_JMPZ_SPEC_CONST_LABEL,
(void*)&&ZEND_JMPZ_SPEC_TMPVAR_LABEL,
@@ -52866,11 +51613,11 @@ ZEND_API void execute_ex(zend_execute_data *ex)
(void*)&&ZEND_CHECK_VAR_SPEC_CV_UNUSED_LABEL,
(void*)&&ZEND_SEND_VAR_NO_REF_EX_SPEC_VAR_LABEL,
(void*)&&ZEND_SEND_VAR_NO_REF_EX_SPEC_VAR_QUICK_LABEL,
+ (void*)&&ZEND_CAST_SPEC_CONST_LABEL,
+ (void*)&&ZEND_CAST_SPEC_TMP_LABEL,
+ (void*)&&ZEND_CAST_SPEC_VAR_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_MAKE_REF_SPEC_VAR_UNUSED_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_MAKE_REF_SPEC_CV_UNUSED_LABEL,
+ (void*)&&ZEND_CAST_SPEC_CV_LABEL,
(void*)&&ZEND_BOOL_SPEC_CONST_LABEL,
(void*)&&ZEND_BOOL_SPEC_TMPVAR_LABEL,
(void*)&&ZEND_BOOL_SPEC_TMPVAR_LABEL,
@@ -52971,11 +51718,11 @@ ZEND_API void execute_ex(zend_execute_data *ex)
(void*)&&ZEND_INIT_ARRAY_SPEC_VAR_TMPVAR_LABEL,
(void*)&&ZEND_INIT_ARRAY_SPEC_VAR_UNUSED_LABEL,
(void*)&&ZEND_INIT_ARRAY_SPEC_VAR_CV_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_INIT_ARRAY_SPEC_UNUSED_CONST_LABEL,
+ (void*)&&ZEND_INIT_ARRAY_SPEC_UNUSED_TMPVAR_LABEL,
+ (void*)&&ZEND_INIT_ARRAY_SPEC_UNUSED_TMPVAR_LABEL,
+ (void*)&&ZEND_INIT_ARRAY_SPEC_UNUSED_UNUSED_LABEL,
+ (void*)&&ZEND_INIT_ARRAY_SPEC_UNUSED_CV_LABEL,
(void*)&&ZEND_INIT_ARRAY_SPEC_CV_CONST_LABEL,
(void*)&&ZEND_INIT_ARRAY_SPEC_CV_TMPVAR_LABEL,
(void*)&&ZEND_INIT_ARRAY_SPEC_CV_TMPVAR_LABEL,
@@ -53072,11 +51819,7 @@ ZEND_API void execute_ex(zend_execute_data *ex)
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_FE_RESET_R_SPEC_CV_LABEL,
(void*)&&ZEND_FE_FETCH_R_SPEC_VAR_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_EXIT_SPEC_LABEL,
(void*)&&ZEND_FETCH_R_SPEC_CONST_UNUSED_LABEL,
(void*)&&ZEND_FETCH_R_SPEC_TMPVAR_UNUSED_LABEL,
(void*)&&ZEND_FETCH_R_SPEC_TMPVAR_UNUSED_LABEL,
@@ -53637,31 +52380,6 @@ ZEND_API void execute_ex(zend_execute_data *ex)
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_PRE_DEC_OBJ_SPEC_VAR_CONST_LABEL,
- (void*)&&ZEND_PRE_DEC_OBJ_SPEC_VAR_TMPVAR_LABEL,
- (void*)&&ZEND_PRE_DEC_OBJ_SPEC_VAR_TMPVAR_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_PRE_DEC_OBJ_SPEC_VAR_CV_LABEL,
- (void*)&&ZEND_PRE_DEC_OBJ_SPEC_UNUSED_CONST_LABEL,
- (void*)&&ZEND_PRE_DEC_OBJ_SPEC_UNUSED_TMPVAR_LABEL,
- (void*)&&ZEND_PRE_DEC_OBJ_SPEC_UNUSED_TMPVAR_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_PRE_DEC_OBJ_SPEC_UNUSED_CV_LABEL,
- (void*)&&ZEND_PRE_DEC_OBJ_SPEC_CV_CONST_LABEL,
- (void*)&&ZEND_PRE_DEC_OBJ_SPEC_CV_TMPVAR_LABEL,
- (void*)&&ZEND_PRE_DEC_OBJ_SPEC_CV_TMPVAR_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_PRE_DEC_OBJ_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_POST_INC_OBJ_SPEC_VAR_CONST_LABEL,
(void*)&&ZEND_POST_INC_OBJ_SPEC_VAR_TMPVAR_LABEL,
(void*)&&ZEND_POST_INC_OBJ_SPEC_VAR_TMPVAR_LABEL,
@@ -53677,156 +52395,11 @@ ZEND_API void execute_ex(zend_execute_data *ex)
(void*)&&ZEND_POST_INC_OBJ_SPEC_CV_TMPVAR_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_POST_INC_OBJ_SPEC_CV_CV_LABEL,
+ (void*)&&ZEND_ECHO_SPEC_CONST_LABEL,
+ (void*)&&ZEND_ECHO_SPEC_TMPVAR_LABEL,
+ (void*)&&ZEND_ECHO_SPEC_TMPVAR_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_POST_DEC_OBJ_SPEC_VAR_CONST_LABEL,
- (void*)&&ZEND_POST_DEC_OBJ_SPEC_VAR_TMPVAR_LABEL,
- (void*)&&ZEND_POST_DEC_OBJ_SPEC_VAR_TMPVAR_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_POST_DEC_OBJ_SPEC_VAR_CV_LABEL,
- (void*)&&ZEND_POST_DEC_OBJ_SPEC_UNUSED_CONST_LABEL,
- (void*)&&ZEND_POST_DEC_OBJ_SPEC_UNUSED_TMPVAR_LABEL,
- (void*)&&ZEND_POST_DEC_OBJ_SPEC_UNUSED_TMPVAR_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_POST_DEC_OBJ_SPEC_UNUSED_CV_LABEL,
- (void*)&&ZEND_POST_DEC_OBJ_SPEC_CV_CONST_LABEL,
- (void*)&&ZEND_POST_DEC_OBJ_SPEC_CV_TMPVAR_LABEL,
- (void*)&&ZEND_POST_DEC_OBJ_SPEC_CV_TMPVAR_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_POST_DEC_OBJ_SPEC_CV_CV_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_DATA_CONST_LABEL,
- (void*)&&ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_DATA_TMP_LABEL,
- (void*)&&ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_DATA_VAR_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_DATA_CV_LABEL,
- (void*)&&ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_DATA_CONST_LABEL,
- (void*)&&ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_DATA_TMP_LABEL,
- (void*)&&ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_DATA_VAR_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_DATA_CV_LABEL,
- (void*)&&ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_DATA_CONST_LABEL,
- (void*)&&ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_DATA_TMP_LABEL,
- (void*)&&ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_DATA_VAR_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_DATA_CV_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA_CONST_LABEL,
- (void*)&&ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA_TMP_LABEL,
- (void*)&&ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA_VAR_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA_CV_LABEL,
- (void*)&&ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_OP_DATA_CONST_LABEL,
- (void*)&&ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_OP_DATA_TMP_LABEL,
- (void*)&&ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_OP_DATA_VAR_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_OP_DATA_CV_LABEL,
- (void*)&&ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_OP_DATA_CONST_LABEL,
- (void*)&&ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_OP_DATA_TMP_LABEL,
- (void*)&&ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_OP_DATA_VAR_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_OP_DATA_CV_LABEL,
- (void*)&&ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_OP_DATA_CONST_LABEL,
- (void*)&&ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_OP_DATA_TMP_LABEL,
- (void*)&&ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_OP_DATA_VAR_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_OP_DATA_CV_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_DATA_CONST_LABEL,
- (void*)&&ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_DATA_TMP_LABEL,
- (void*)&&ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_DATA_VAR_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_DATA_CV_LABEL,
- (void*)&&ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DATA_CONST_LABEL,
- (void*)&&ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DATA_TMP_LABEL,
- (void*)&&ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DATA_VAR_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DATA_CV_LABEL,
- (void*)&&ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_DATA_CONST_LABEL,
- (void*)&&ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_DATA_TMP_LABEL,
- (void*)&&ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_DATA_VAR_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_DATA_CV_LABEL,
- (void*)&&ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_DATA_CONST_LABEL,
- (void*)&&ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_DATA_TMP_LABEL,
- (void*)&&ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_DATA_VAR_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_DATA_CV_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_CONST_LABEL,
- (void*)&&ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_TMP_LABEL,
- (void*)&&ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_VAR_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_CV_LABEL,
+ (void*)&&ZEND_ECHO_SPEC_CV_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
@@ -53853,143 +52426,19 @@ 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_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,
- (void*)&&ZEND_YIELD_FROM_SPEC_VAR_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_YIELD_FROM_SPEC_CV_LABEL,
- (void*)&&ZEND_DECLARE_CONST_SPEC_CONST_CONST_LABEL,
- (void*)&&ZEND_ADD_INTERFACE_SPEC_CONST_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,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_DATA_CONST_LABEL,
- (void*)&&ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_DATA_TMP_LABEL,
- (void*)&&ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_DATA_VAR_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_DATA_CV_LABEL,
- (void*)&&ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_DATA_CONST_LABEL,
- (void*)&&ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_DATA_TMP_LABEL,
- (void*)&&ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_DATA_VAR_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_DATA_CV_LABEL,
- (void*)&&ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_DATA_CONST_LABEL,
- (void*)&&ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_DATA_TMP_LABEL,
- (void*)&&ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_DATA_VAR_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_DATA_CV_LABEL,
- (void*)&&ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_DATA_CONST_LABEL,
- (void*)&&ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_DATA_TMP_LABEL,
- (void*)&&ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_DATA_VAR_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_DATA_CV_LABEL,
- (void*)&&ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA_CONST_LABEL,
- (void*)&&ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA_TMP_LABEL,
- (void*)&&ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA_VAR_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA_CV_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DATA_CONST_LABEL,
- (void*)&&ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DATA_TMP_LABEL,
- (void*)&&ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DATA_VAR_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DATA_CV_LABEL,
- (void*)&&ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_DATA_CONST_LABEL,
- (void*)&&ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_DATA_TMP_LABEL,
- (void*)&&ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_DATA_VAR_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_DATA_CV_LABEL,
- (void*)&&ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_DATA_CONST_LABEL,
- (void*)&&ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_DATA_TMP_LABEL,
- (void*)&&ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_DATA_VAR_LABEL,
+ (void*)&&ZEND_GENERATOR_CREATE_SPEC_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_DATA_CV_LABEL,
- (void*)&&ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_DATA_CONST_LABEL,
- (void*)&&ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_DATA_TMP_LABEL,
- (void*)&&ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_DATA_VAR_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_DATA_CV_LABEL,
- (void*)&&ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_CONST_LABEL,
- (void*)&&ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_TMP_LABEL,
- (void*)&&ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_VAR_LABEL,
+ (void*)&&ZEND_MAKE_REF_SPEC_VAR_UNUSED_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_CV_LABEL,
+ (void*)&&ZEND_MAKE_REF_SPEC_CV_UNUSED_LABEL,
+ (void*)&&ZEND_DECLARE_FUNCTION_SPEC_LABEL,
+ (void*)&&ZEND_DECLARE_LAMBDA_FUNCTION_SPEC_CONST_UNUSED_LABEL,
+ (void*)&&ZEND_DECLARE_CONST_SPEC_CONST_CONST_LABEL,
+ (void*)&&ZEND_DECLARE_CLASS_SPEC_CONST_LABEL,
+ (void*)&&ZEND_DECLARE_CLASS_DELAYED_SPEC_CONST_CONST_LABEL,
+ (void*)&&ZEND_DECLARE_ANON_CLASS_SPEC_LABEL,
+ (void*)&&ZEND_ADD_ARRAY_UNPACK_SPEC_LABEL,
(void*)&&ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CONST_CONST_LABEL,
(void*)&&ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CONST_TMPVAR_LABEL,
(void*)&&ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CONST_TMPVAR_LABEL,
@@ -54023,9 +52472,14 @@ 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_DECLARE_LAMBDA_FUNCTION_SPEC_CONST_UNUSED_LABEL,
- (void*)&&ZEND_ADD_TRAIT_SPEC_LABEL,
- (void*)&&ZEND_BIND_TRAITS_SPEC_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_SEPARATE_SPEC_VAR_UNUSED_LABEL,
(void*)&&ZEND_FETCH_CLASS_NAME_SPEC_UNUSED_LABEL,
(void*)&&ZEND_CALL_TRAMPOLINE_SPEC_LABEL,
@@ -54064,110 +52518,16 @@ ZEND_API void execute_ex(zend_execute_data *ex)
(void*)&&ZEND_FAST_RET_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,
- (void*)&&ZEND_POW_SPEC_CONST_TMPVAR_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_POW_SPEC_CONST_CV_LABEL,
- (void*)&&ZEND_POW_SPEC_TMPVAR_CONST_LABEL,
- (void*)&&ZEND_POW_SPEC_TMPVAR_TMPVAR_LABEL,
- (void*)&&ZEND_POW_SPEC_TMPVAR_TMPVAR_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_POW_SPEC_TMPVAR_CV_LABEL,
- (void*)&&ZEND_POW_SPEC_TMPVAR_CONST_LABEL,
- (void*)&&ZEND_POW_SPEC_TMPVAR_TMPVAR_LABEL,
- (void*)&&ZEND_POW_SPEC_TMPVAR_TMPVAR_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_POW_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_POW_SPEC_CV_CONST_LABEL,
- (void*)&&ZEND_POW_SPEC_CV_TMPVAR_LABEL,
- (void*)&&ZEND_POW_SPEC_CV_TMPVAR_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_POW_SPEC_CV_CV_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_POW_SPEC_VAR_CONST_LABEL,
- (void*)&&ZEND_ASSIGN_POW_SPEC_VAR_CONST_DIM_LABEL,
- (void*)&&ZEND_ASSIGN_POW_SPEC_VAR_CONST_OBJ_LABEL,
- (void*)&&ZEND_ASSIGN_POW_SPEC_VAR_TMPVAR_LABEL,
- (void*)&&ZEND_ASSIGN_POW_SPEC_VAR_TMPVAR_DIM_LABEL,
- (void*)&&ZEND_ASSIGN_POW_SPEC_VAR_TMPVAR_OBJ_LABEL,
- (void*)&&ZEND_ASSIGN_POW_SPEC_VAR_TMPVAR_LABEL,
- (void*)&&ZEND_ASSIGN_POW_SPEC_VAR_TMPVAR_DIM_LABEL,
- (void*)&&ZEND_ASSIGN_POW_SPEC_VAR_TMPVAR_OBJ_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_POW_SPEC_VAR_UNUSED_DIM_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_POW_SPEC_VAR_CV_LABEL,
- (void*)&&ZEND_ASSIGN_POW_SPEC_VAR_CV_DIM_LABEL,
- (void*)&&ZEND_ASSIGN_POW_SPEC_VAR_CV_OBJ_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_POW_SPEC_UNUSED_CONST_OBJ_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_POW_SPEC_UNUSED_TMPVAR_OBJ_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_POW_SPEC_UNUSED_TMPVAR_OBJ_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_POW_SPEC_UNUSED_CV_OBJ_LABEL,
- (void*)&&ZEND_ASSIGN_POW_SPEC_CV_CONST_LABEL,
- (void*)&&ZEND_ASSIGN_POW_SPEC_CV_CONST_DIM_LABEL,
- (void*)&&ZEND_ASSIGN_POW_SPEC_CV_CONST_OBJ_LABEL,
- (void*)&&ZEND_ASSIGN_POW_SPEC_CV_TMPVAR_LABEL,
- (void*)&&ZEND_ASSIGN_POW_SPEC_CV_TMPVAR_DIM_LABEL,
- (void*)&&ZEND_ASSIGN_POW_SPEC_CV_TMPVAR_OBJ_LABEL,
- (void*)&&ZEND_ASSIGN_POW_SPEC_CV_TMPVAR_LABEL,
- (void*)&&ZEND_ASSIGN_POW_SPEC_CV_TMPVAR_DIM_LABEL,
- (void*)&&ZEND_ASSIGN_POW_SPEC_CV_TMPVAR_OBJ_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_POW_SPEC_CV_UNUSED_DIM_LABEL,
+ (void*)&&ZEND_YIELD_FROM_SPEC_CONST_LABEL,
+ (void*)&&ZEND_YIELD_FROM_SPEC_TMP_LABEL,
+ (void*)&&ZEND_YIELD_FROM_SPEC_VAR_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ASSIGN_POW_SPEC_CV_CV_LABEL,
- (void*)&&ZEND_ASSIGN_POW_SPEC_CV_CV_DIM_LABEL,
- (void*)&&ZEND_ASSIGN_POW_SPEC_CV_CV_OBJ_LABEL,
+ (void*)&&ZEND_YIELD_FROM_SPEC_CV_LABEL,
+ (void*)&&ZEND_COPY_TMP_SPEC_TMPVAR_UNUSED_LABEL,
(void*)&&ZEND_BIND_GLOBAL_SPEC_CV_CONST_LABEL,
(void*)&&ZEND_COALESCE_SPEC_CONST_LABEL,
- (void*)&&ZEND_COALESCE_SPEC_TMPVAR_LABEL,
- (void*)&&ZEND_COALESCE_SPEC_TMPVAR_LABEL,
+ (void*)&&ZEND_COALESCE_SPEC_TMP_LABEL,
+ (void*)&&ZEND_COALESCE_SPEC_VAR_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_COALESCE_SPEC_CV_LABEL,
(void*)&&ZEND_SPACESHIP_SPEC_CONST_CONST_LABEL,
@@ -54195,215 +52555,27 @@ ZEND_API void execute_ex(zend_execute_data *ex)
(void*)&&ZEND_SPACESHIP_SPEC_CV_TMPVAR_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_SPACESHIP_SPEC_CV_CV_LABEL,
- (void*)&&ZEND_DECLARE_ANON_CLASS_SPEC_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,
- (void*)&&ZEND_FETCH_STATIC_PROP_R_SPEC_CONST_UNUSED_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_FETCH_STATIC_PROP_R_SPEC_TMPVAR_CONST_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_FETCH_STATIC_PROP_R_SPEC_TMPVAR_VAR_LABEL,
- (void*)&&ZEND_FETCH_STATIC_PROP_R_SPEC_TMPVAR_UNUSED_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_FETCH_STATIC_PROP_R_SPEC_TMPVAR_CONST_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_FETCH_STATIC_PROP_R_SPEC_TMPVAR_VAR_LABEL,
- (void*)&&ZEND_FETCH_STATIC_PROP_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_FETCH_STATIC_PROP_R_SPEC_CV_CONST_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_FETCH_STATIC_PROP_R_SPEC_CV_VAR_LABEL,
- (void*)&&ZEND_FETCH_STATIC_PROP_R_SPEC_CV_UNUSED_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_FETCH_STATIC_PROP_W_SPEC_CONST_CONST_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_FETCH_STATIC_PROP_W_SPEC_CONST_VAR_LABEL,
- (void*)&&ZEND_FETCH_STATIC_PROP_W_SPEC_CONST_UNUSED_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_FETCH_STATIC_PROP_W_SPEC_TMPVAR_CONST_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_FETCH_STATIC_PROP_W_SPEC_TMPVAR_VAR_LABEL,
- (void*)&&ZEND_FETCH_STATIC_PROP_W_SPEC_TMPVAR_UNUSED_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_FETCH_STATIC_PROP_W_SPEC_TMPVAR_CONST_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_FETCH_STATIC_PROP_W_SPEC_TMPVAR_VAR_LABEL,
- (void*)&&ZEND_FETCH_STATIC_PROP_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_FETCH_STATIC_PROP_W_SPEC_CV_CONST_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_FETCH_STATIC_PROP_W_SPEC_CV_VAR_LABEL,
- (void*)&&ZEND_FETCH_STATIC_PROP_W_SPEC_CV_UNUSED_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_FETCH_STATIC_PROP_RW_SPEC_CONST_CONST_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_FETCH_STATIC_PROP_RW_SPEC_CONST_VAR_LABEL,
- (void*)&&ZEND_FETCH_STATIC_PROP_RW_SPEC_CONST_UNUSED_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_FETCH_STATIC_PROP_RW_SPEC_TMPVAR_CONST_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_FETCH_STATIC_PROP_RW_SPEC_TMPVAR_VAR_LABEL,
- (void*)&&ZEND_FETCH_STATIC_PROP_RW_SPEC_TMPVAR_UNUSED_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_FETCH_STATIC_PROP_RW_SPEC_TMPVAR_CONST_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_FETCH_STATIC_PROP_RW_SPEC_TMPVAR_VAR_LABEL,
- (void*)&&ZEND_FETCH_STATIC_PROP_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_FETCH_STATIC_PROP_RW_SPEC_CV_CONST_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_FETCH_STATIC_PROP_RW_SPEC_CV_VAR_LABEL,
- (void*)&&ZEND_FETCH_STATIC_PROP_RW_SPEC_CV_UNUSED_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_FETCH_STATIC_PROP_IS_SPEC_CONST_CONST_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_FETCH_STATIC_PROP_IS_SPEC_CONST_VAR_LABEL,
- (void*)&&ZEND_FETCH_STATIC_PROP_IS_SPEC_CONST_UNUSED_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_FETCH_STATIC_PROP_IS_SPEC_TMPVAR_CONST_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_FETCH_STATIC_PROP_IS_SPEC_TMPVAR_VAR_LABEL,
- (void*)&&ZEND_FETCH_STATIC_PROP_IS_SPEC_TMPVAR_UNUSED_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_FETCH_STATIC_PROP_IS_SPEC_TMPVAR_CONST_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_FETCH_STATIC_PROP_IS_SPEC_TMPVAR_VAR_LABEL,
- (void*)&&ZEND_FETCH_STATIC_PROP_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_FETCH_STATIC_PROP_IS_SPEC_CV_CONST_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_FETCH_STATIC_PROP_IS_SPEC_CV_VAR_LABEL,
- (void*)&&ZEND_FETCH_STATIC_PROP_IS_SPEC_CV_UNUSED_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_FETCH_STATIC_PROP_FUNC_ARG_SPEC_CONST_CONST_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_FETCH_STATIC_PROP_FUNC_ARG_SPEC_CONST_VAR_LABEL,
- (void*)&&ZEND_FETCH_STATIC_PROP_FUNC_ARG_SPEC_CONST_UNUSED_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_FETCH_STATIC_PROP_FUNC_ARG_SPEC_TMPVAR_CONST_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_FETCH_STATIC_PROP_FUNC_ARG_SPEC_TMPVAR_VAR_LABEL,
- (void*)&&ZEND_FETCH_STATIC_PROP_FUNC_ARG_SPEC_TMPVAR_UNUSED_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_FETCH_STATIC_PROP_FUNC_ARG_SPEC_TMPVAR_CONST_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_FETCH_STATIC_PROP_FUNC_ARG_SPEC_TMPVAR_VAR_LABEL,
- (void*)&&ZEND_FETCH_STATIC_PROP_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_FETCH_STATIC_PROP_FUNC_ARG_SPEC_CV_CONST_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_FETCH_STATIC_PROP_FUNC_ARG_SPEC_CV_VAR_LABEL,
- (void*)&&ZEND_FETCH_STATIC_PROP_FUNC_ARG_SPEC_CV_UNUSED_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_FETCH_STATIC_PROP_UNSET_SPEC_CONST_CONST_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_FETCH_STATIC_PROP_UNSET_SPEC_CONST_VAR_LABEL,
- (void*)&&ZEND_FETCH_STATIC_PROP_UNSET_SPEC_CONST_UNUSED_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_FETCH_STATIC_PROP_UNSET_SPEC_TMPVAR_CONST_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_FETCH_STATIC_PROP_UNSET_SPEC_TMPVAR_VAR_LABEL,
- (void*)&&ZEND_FETCH_STATIC_PROP_UNSET_SPEC_TMPVAR_UNUSED_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_FETCH_STATIC_PROP_UNSET_SPEC_TMPVAR_CONST_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_FETCH_STATIC_PROP_UNSET_SPEC_TMPVAR_VAR_LABEL,
- (void*)&&ZEND_FETCH_STATIC_PROP_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_FETCH_STATIC_PROP_UNSET_SPEC_CV_CONST_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_FETCH_STATIC_PROP_UNSET_SPEC_CV_VAR_LABEL,
- (void*)&&ZEND_FETCH_STATIC_PROP_UNSET_SPEC_CV_UNUSED_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_UNSET_STATIC_PROP_SPEC_CONST_CONST_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_UNSET_STATIC_PROP_SPEC_CONST_VAR_LABEL,
- (void*)&&ZEND_UNSET_STATIC_PROP_SPEC_CONST_UNUSED_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_UNSET_STATIC_PROP_SPEC_TMPVAR_CONST_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_UNSET_STATIC_PROP_SPEC_TMPVAR_VAR_LABEL,
- (void*)&&ZEND_UNSET_STATIC_PROP_SPEC_TMPVAR_UNUSED_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_UNSET_STATIC_PROP_SPEC_TMPVAR_CONST_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_UNSET_STATIC_PROP_SPEC_TMPVAR_VAR_LABEL,
- (void*)&&ZEND_UNSET_STATIC_PROP_SPEC_TMPVAR_UNUSED_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_UNSET_STATIC_PROP_SPEC_CV_CONST_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_UNSET_STATIC_PROP_SPEC_CV_VAR_LABEL,
- (void*)&&ZEND_UNSET_STATIC_PROP_SPEC_CV_UNUSED_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC_CONST_CONST_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC_CONST_VAR_LABEL,
- (void*)&&ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC_CONST_UNUSED_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC_TMPVAR_CONST_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC_TMPVAR_VAR_LABEL,
- (void*)&&ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC_TMPVAR_UNUSED_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC_TMPVAR_CONST_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC_TMPVAR_VAR_LABEL,
- (void*)&&ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC_TMPVAR_UNUSED_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_FUNC_NUM_ARGS_SPEC_UNUSED_UNUSED_LABEL,
+ (void*)&&ZEND_FUNC_GET_ARGS_SPEC_CONST_UNUSED_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC_CV_CONST_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC_CV_VAR_LABEL,
- (void*)&&ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC_CV_UNUSED_LABEL,
+ (void*)&&ZEND_FUNC_GET_ARGS_SPEC_UNUSED_UNUSED_LABEL,
(void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_FETCH_STATIC_PROP_R_SPEC_LABEL,
+ (void*)&&ZEND_FETCH_STATIC_PROP_W_SPEC_LABEL,
+ (void*)&&ZEND_FETCH_STATIC_PROP_RW_SPEC_LABEL,
+ (void*)&&ZEND_FETCH_STATIC_PROP_IS_SPEC_LABEL,
+ (void*)&&ZEND_FETCH_STATIC_PROP_FUNC_ARG_SPEC_LABEL,
+ (void*)&&ZEND_FETCH_STATIC_PROP_UNSET_SPEC_LABEL,
+ (void*)&&ZEND_UNSET_STATIC_PROP_SPEC_LABEL,
+ (void*)&&ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC_LABEL,
(void*)&&ZEND_FETCH_CLASS_CONSTANT_SPEC_CONST_CONST_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_FETCH_CLASS_CONSTANT_SPEC_VAR_CONST_LABEL,
(void*)&&ZEND_FETCH_CLASS_CONSTANT_SPEC_UNUSED_CONST_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_BIND_LEXICAL_SPEC_TMP_CV_LABEL,
- (void*)&&ZEND_BIND_STATIC_SPEC_CV_CONST_LABEL,
+ (void*)&&ZEND_BIND_STATIC_SPEC_CV_UNUSED_LABEL,
(void*)&&ZEND_FETCH_THIS_SPEC_UNUSED_UNUSED_LABEL,
(void*)&&ZEND_SEND_FUNC_ARG_SPEC_VAR_LABEL,
(void*)&&ZEND_ISSET_ISEMPTY_THIS_SPEC_UNUSED_UNUSED_LABEL,
@@ -54423,13 +52595,13 @@ ZEND_API void execute_ex(zend_execute_data *ex)
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_IN_ARRAY_SPEC_CV_CONST_LABEL,
(void*)&&ZEND_COUNT_SPEC_CONST_UNUSED_LABEL,
- (void*)&&ZEND_COUNT_SPEC_TMP_UNUSED_LABEL,
- (void*)&&ZEND_COUNT_SPEC_VAR_UNUSED_LABEL,
+ (void*)&&ZEND_COUNT_SPEC_TMPVAR_UNUSED_LABEL,
+ (void*)&&ZEND_COUNT_SPEC_TMPVAR_UNUSED_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_COUNT_SPEC_CV_UNUSED_LABEL,
(void*)&&ZEND_GET_CLASS_SPEC_CONST_UNUSED_LABEL,
- (void*)&&ZEND_GET_CLASS_SPEC_TMP_UNUSED_LABEL,
- (void*)&&ZEND_GET_CLASS_SPEC_VAR_UNUSED_LABEL,
+ (void*)&&ZEND_GET_CLASS_SPEC_TMPVAR_UNUSED_LABEL,
+ (void*)&&ZEND_GET_CLASS_SPEC_TMPVAR_UNUSED_LABEL,
(void*)&&ZEND_GET_CLASS_SPEC_UNUSED_UNUSED_LABEL,
(void*)&&ZEND_GET_CLASS_SPEC_CV_UNUSED_LABEL,
(void*)&&ZEND_GET_CALLED_CLASS_SPEC_UNUSED_UNUSED_LABEL,
@@ -54438,20 +52610,31 @@ ZEND_API void execute_ex(zend_execute_data *ex)
(void*)&&ZEND_GET_TYPE_SPEC_VAR_UNUSED_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_GET_TYPE_SPEC_CV_UNUSED_LABEL,
- (void*)&&ZEND_FUNC_NUM_ARGS_SPEC_UNUSED_UNUSED_LABEL,
- (void*)&&ZEND_FUNC_GET_ARGS_SPEC_CONST_UNUSED_LABEL,
+ (void*)&&ZEND_ARRAY_KEY_EXISTS_SPEC_CONST_CONST_LABEL,
+ (void*)&&ZEND_ARRAY_KEY_EXISTS_SPEC_CONST_TMPVAR_LABEL,
+ (void*)&&ZEND_ARRAY_KEY_EXISTS_SPEC_CONST_TMPVAR_LABEL,
(void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_ARRAY_KEY_EXISTS_SPEC_CONST_CV_LABEL,
+ (void*)&&ZEND_ARRAY_KEY_EXISTS_SPEC_TMPVAR_CONST_LABEL,
+ (void*)&&ZEND_ARRAY_KEY_EXISTS_SPEC_TMPVAR_TMPVAR_LABEL,
+ (void*)&&ZEND_ARRAY_KEY_EXISTS_SPEC_TMPVAR_TMPVAR_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_FUNC_GET_ARGS_SPEC_UNUSED_UNUSED_LABEL,
+ (void*)&&ZEND_ARRAY_KEY_EXISTS_SPEC_TMPVAR_CV_LABEL,
+ (void*)&&ZEND_ARRAY_KEY_EXISTS_SPEC_TMPVAR_CONST_LABEL,
+ (void*)&&ZEND_ARRAY_KEY_EXISTS_SPEC_TMPVAR_TMPVAR_LABEL,
+ (void*)&&ZEND_ARRAY_KEY_EXISTS_SPEC_TMPVAR_TMPVAR_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_ARRAY_KEY_EXISTS_SPEC_TMPVAR_CV_LABEL,
(void*)&&ZEND_NULL_LABEL,
- (void*)&&ZEND_FETCH_LIST_W_SPEC_VAR_CV_LABEL,
+ (void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_ARRAY_KEY_EXISTS_SPEC_CV_CONST_LABEL,
+ (void*)&&ZEND_ARRAY_KEY_EXISTS_SPEC_CV_TMPVAR_LABEL,
+ (void*)&&ZEND_ARRAY_KEY_EXISTS_SPEC_CV_TMPVAR_LABEL,
+ (void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_ARRAY_KEY_EXISTS_SPEC_CV_CV_LABEL,
(void*)&&ZEND_JMP_FORWARD_SPEC_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_NULL_LABEL,
@@ -55282,20 +53465,19 @@ ZEND_API void execute_ex(zend_execute_data *ex)
(void*)&&ZEND_PRE_INC_LONG_NO_OVERFLOW_SPEC_CV_RETVAL_USED_LABEL,
(void*)&&ZEND_PRE_INC_LONG_SPEC_CV_RETVAL_UNUSED_LABEL,
(void*)&&ZEND_PRE_INC_LONG_SPEC_CV_RETVAL_USED_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_PRE_DEC_LONG_NO_OVERFLOW_SPEC_CV_RETVAL_UNUSED_LABEL,
(void*)&&ZEND_PRE_DEC_LONG_NO_OVERFLOW_SPEC_CV_RETVAL_USED_LABEL,
(void*)&&ZEND_PRE_DEC_LONG_SPEC_CV_RETVAL_UNUSED_LABEL,
(void*)&&ZEND_PRE_DEC_LONG_SPEC_CV_RETVAL_USED_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_POST_INC_LONG_NO_OVERFLOW_SPEC_CV_LABEL,
(void*)&&ZEND_POST_INC_LONG_SPEC_CV_LABEL,
- (void*)&&ZEND_POST_INC_LONG_OR_DOUBLE_SPEC_CV_LABEL,
(void*)&&ZEND_POST_DEC_LONG_NO_OVERFLOW_SPEC_CV_LABEL,
(void*)&&ZEND_POST_DEC_LONG_SPEC_CV_LABEL,
- (void*)&&ZEND_POST_DEC_LONG_OR_DOUBLE_SPEC_CV_LABEL,
+ (void*)&&ZEND_QM_ASSIGN_LONG_SPEC_CONST_LABEL,
+ (void*)&&ZEND_QM_ASSIGN_LONG_SPEC_TMPVARCV_LABEL,
+ (void*)&&ZEND_QM_ASSIGN_LONG_SPEC_TMPVARCV_LABEL,
+ (void*)&&ZEND_NULL_LABEL,
+ (void*)&&ZEND_QM_ASSIGN_LONG_SPEC_TMPVARCV_LABEL,
(void*)&&ZEND_QM_ASSIGN_DOUBLE_SPEC_CONST_LABEL,
(void*)&&ZEND_QM_ASSIGN_DOUBLE_SPEC_TMPVARCV_LABEL,
(void*)&&ZEND_QM_ASSIGN_DOUBLE_SPEC_TMPVARCV_LABEL,
@@ -55373,26 +53555,77 @@ ZEND_API void execute_ex(zend_execute_data *ex)
#endif
#endif
#if (ZEND_VM_KIND == ZEND_VM_KIND_HYBRID)
+ HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_OP_SPEC):
+ VM_TRACE(ZEND_ASSIGN_STATIC_PROP_OP_SPEC)
+ ZEND_ASSIGN_STATIC_PROP_OP_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_PRE_INC_STATIC_PROP_SPEC):
+ VM_TRACE(ZEND_PRE_INC_STATIC_PROP_SPEC)
+ ZEND_PRE_INC_STATIC_PROP_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_POST_INC_STATIC_PROP_SPEC):
+ VM_TRACE(ZEND_POST_INC_STATIC_PROP_SPEC)
+ ZEND_POST_INC_STATIC_PROP_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_FETCH_STATIC_PROP_R_SPEC):
+ VM_TRACE(ZEND_FETCH_STATIC_PROP_R_SPEC)
+ ZEND_FETCH_STATIC_PROP_R_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_FETCH_STATIC_PROP_W_SPEC):
+ VM_TRACE(ZEND_FETCH_STATIC_PROP_W_SPEC)
+ ZEND_FETCH_STATIC_PROP_W_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_FETCH_STATIC_PROP_RW_SPEC):
+ VM_TRACE(ZEND_FETCH_STATIC_PROP_RW_SPEC)
+ ZEND_FETCH_STATIC_PROP_RW_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_FETCH_STATIC_PROP_FUNC_ARG_SPEC):
+ VM_TRACE(ZEND_FETCH_STATIC_PROP_FUNC_ARG_SPEC)
+ ZEND_FETCH_STATIC_PROP_FUNC_ARG_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_FETCH_STATIC_PROP_UNSET_SPEC):
+ VM_TRACE(ZEND_FETCH_STATIC_PROP_UNSET_SPEC)
+ ZEND_FETCH_STATIC_PROP_UNSET_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_FETCH_STATIC_PROP_IS_SPEC):
+ VM_TRACE(ZEND_FETCH_STATIC_PROP_IS_SPEC)
+ ZEND_FETCH_STATIC_PROP_IS_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_SPEC_OP_DATA_CONST):
+ VM_TRACE(ZEND_ASSIGN_STATIC_PROP_SPEC_OP_DATA_CONST)
+ ZEND_ASSIGN_STATIC_PROP_SPEC_OP_DATA_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_SPEC_OP_DATA_TMP):
+ VM_TRACE(ZEND_ASSIGN_STATIC_PROP_SPEC_OP_DATA_TMP)
+ ZEND_ASSIGN_STATIC_PROP_SPEC_OP_DATA_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_SPEC_OP_DATA_VAR):
+ VM_TRACE(ZEND_ASSIGN_STATIC_PROP_SPEC_OP_DATA_VAR)
+ ZEND_ASSIGN_STATIC_PROP_SPEC_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_SPEC_OP_DATA_CV):
+ VM_TRACE(ZEND_ASSIGN_STATIC_PROP_SPEC_OP_DATA_CV)
+ ZEND_ASSIGN_STATIC_PROP_SPEC_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC):
+ VM_TRACE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC)
+ ZEND_ASSIGN_STATIC_PROP_REF_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
zend_leave_helper_SPEC_LABEL:
{
zend_execute_data *old_execute_data;
uint32_t call_info = EX_CALL_INFO();
+ SAVE_OPLINE();
if (EXPECTED((call_info & (ZEND_CALL_CODE|ZEND_CALL_TOP|ZEND_CALL_HAS_SYMBOL_TABLE|ZEND_CALL_FREE_EXTRA_ARGS|ZEND_CALL_ALLOCATED)) == 0)) {
EG(current_execute_data) = EX(prev_execute_data);
i_free_compiled_variables(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)) {
+#ifdef ZEND_PREFER_RELOAD
+ call_info = EX_CALL_INFO();
#endif
- GC_DELREF(object);
- zend_object_store_ctor_failed(object);
- }
- OBJ_RELEASE(object);
+ if (UNEXPECTED(call_info & ZEND_CALL_RELEASE_THIS)) {
+ OBJ_RELEASE(Z_OBJ(execute_data->This));
} else if (UNEXPECTED(call_info & ZEND_CALL_CLOSURE)) {
OBJ_RELEASE(ZEND_CLOSURE_OBJECT(EX(func)));
}
@@ -55410,6 +53643,9 @@ zend_leave_helper_SPEC_LABEL:
EG(current_execute_data) = EX(prev_execute_data);
i_free_compiled_variables(execute_data);
+#ifdef ZEND_PREFER_RELOAD
+ call_info = EX_CALL_INFO();
+#endif
if (UNEXPECTED(call_info & ZEND_CALL_HAS_SYMBOL_TABLE)) {
zend_clean_and_cache_symbol_table(EX(symbol_table));
}
@@ -55419,16 +53655,7 @@ zend_leave_helper_SPEC_LABEL:
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);
+ OBJ_RELEASE(Z_OBJ(execute_data->This));
} else if (UNEXPECTED(call_info & ZEND_CALL_CLOSURE)) {
OBJ_RELEASE(ZEND_CLOSURE_OBJECT(EX(func)));
}
@@ -55448,6 +53675,9 @@ zend_leave_helper_SPEC_LABEL:
zend_detach_symbol_table(execute_data);
destroy_op_array(&EX(func)->op_array);
efree_size(EX(func), sizeof(zend_op_array));
+#ifdef ZEND_PREFER_RELOAD
+ call_info = EX_CALL_INFO();
+#endif
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);
@@ -55464,6 +53694,9 @@ zend_leave_helper_SPEC_LABEL:
if (EXPECTED((call_info & ZEND_CALL_CODE) == 0)) {
EG(current_execute_data) = EX(prev_execute_data);
i_free_compiled_variables(execute_data);
+#ifdef ZEND_PREFER_RELOAD
+ call_info = EX_CALL_INFO();
+#endif
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));
@@ -55542,6 +53775,22 @@ zend_leave_helper_SPEC_LABEL:
VM_TRACE(ZEND_SEND_ARRAY_SPEC)
ZEND_SEND_ARRAY_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ADD_ARRAY_UNPACK_SPEC):
+ VM_TRACE(ZEND_ADD_ARRAY_UNPACK_SPEC)
+ ZEND_ADD_ARRAY_UNPACK_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_UNSET_STATIC_PROP_SPEC):
+ VM_TRACE(ZEND_UNSET_STATIC_PROP_SPEC)
+ ZEND_UNSET_STATIC_PROP_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC):
+ VM_TRACE(ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC)
+ ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_EXIT_SPEC):
+ VM_TRACE(ZEND_EXIT_SPEC)
+ ZEND_EXIT_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);
@@ -55578,22 +53827,10 @@ zend_leave_helper_SPEC_LABEL:
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);
@@ -55642,10 +53879,6 @@ zend_leave_helper_SPEC_LABEL:
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_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);
@@ -55706,7 +53939,7 @@ zend_leave_helper_SPEC_LABEL:
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);
+ retval_ptr = ZVAL_UNDEFINED_OP1();
if (return_value) {
ZVAL_NULL(return_value);
}
@@ -55726,25 +53959,29 @@ zend_leave_helper_SPEC_LABEL:
}
}
} 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))) {
- zend_refcounted *ref = Z_COUNTED_P(retval_ptr);
- if (GC_MAY_LEAK(ref)) {
- gc_possible_root(ref);
+ do {
+ if (Z_OPT_REFCOUNTED_P(retval_ptr)) {
+ if (EXPECTED(!Z_OPT_ISREF_P(retval_ptr))) {
+ if (EXPECTED(!(EX_CALL_INFO() & ZEND_CALL_CODE))) {
+ zend_refcounted *ref = Z_COUNTED_P(retval_ptr);
+ ZVAL_COPY_VALUE(return_value, retval_ptr);
+ if (GC_MAY_LEAK(ref)) {
+ gc_possible_root(ref);
+ }
+ ZVAL_NULL(retval_ptr);
+ break;
+ } else {
+ Z_ADDREF_P(retval_ptr);
}
- ZVAL_NULL(retval_ptr);
} else {
- Z_ADDREF_P(return_value);
+ retval_ptr = Z_REFVAL_P(retval_ptr);
+ if (Z_OPT_REFCOUNTED_P(retval_ptr)) {
+ Z_ADDREF_P(retval_ptr);
+ }
}
- } else {
- retval_ptr = Z_REFVAL_P(retval_ptr);
- ZVAL_COPY(return_value, retval_ptr);
}
- } else {
ZVAL_COPY_VALUE(return_value, retval_ptr);
- }
+ } while (0);
} else /* if (IS_CONST == IS_VAR) */ {
if (UNEXPECTED(Z_ISREF_P(retval_ptr))) {
zend_refcounted *ref = Z_COUNTED_P(retval_ptr);
@@ -55820,10 +54057,6 @@ zend_leave_helper_SPEC_LABEL:
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);
@@ -55856,6 +54089,10 @@ zend_leave_helper_SPEC_LABEL:
VM_TRACE(ZEND_DEFINED_SPEC_CONST)
ZEND_DEFINED_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
+ HYBRID_CASE(ZEND_QM_ASSIGN_LONG_SPEC_CONST):
+ VM_TRACE(ZEND_QM_ASSIGN_LONG_SPEC_CONST)
+ ZEND_QM_ASSIGN_LONG_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);
@@ -55948,30 +54185,6 @@ zend_leave_helper_SPEC_LABEL:
VM_TRACE(ZEND_BOOL_XOR_SPEC_CONST_CONST)
ZEND_BOOL_XOR_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_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);
@@ -56028,14 +54241,6 @@ zend_leave_helper_SPEC_LABEL:
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);
@@ -56044,17 +54249,13 @@ zend_leave_helper_SPEC_LABEL:
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_CASE(ZEND_ARRAY_KEY_EXISTS_SPEC_CONST_CONST):
+ VM_TRACE(ZEND_ARRAY_KEY_EXISTS_SPEC_CONST_CONST)
+ ZEND_ARRAY_KEY_EXISTS_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_CASE(ZEND_DECLARE_CLASS_DELAYED_SPEC_CONST_CONST):
+ VM_TRACE(ZEND_DECLARE_CLASS_DELAYED_SPEC_CONST_CONST)
+ ZEND_DECLARE_CLASS_DELAYED_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)
@@ -56076,6 +54277,50 @@ zend_leave_helper_SPEC_LABEL:
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_ADD_SPEC_CONST_TMPVARCV):
+ VM_TRACE(ZEND_ADD_SPEC_CONST_TMPVARCV)
+ ZEND_ADD_SPEC_CONST_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_SUB_SPEC_CONST_TMPVARCV):
+ VM_TRACE(ZEND_SUB_SPEC_CONST_TMPVARCV)
+ ZEND_SUB_SPEC_CONST_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_MOD_SPEC_CONST_TMPVARCV):
+ VM_TRACE(ZEND_MOD_SPEC_CONST_TMPVARCV)
+ ZEND_MOD_SPEC_CONST_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_SL_SPEC_CONST_TMPVARCV):
+ VM_TRACE(ZEND_SL_SPEC_CONST_TMPVARCV)
+ ZEND_SL_SPEC_CONST_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_SR_SPEC_CONST_TMPVARCV):
+ VM_TRACE(ZEND_SR_SPEC_CONST_TMPVARCV)
+ ZEND_SR_SPEC_CONST_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_IS_SMALLER_SPEC_CONST_TMPVARCV):
+ VM_TRACE(ZEND_IS_SMALLER_SPEC_CONST_TMPVARCV)
+ ZEND_IS_SMALLER_SPEC_CONST_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_IS_SMALLER_SPEC_CONST_TMPVARCV_JMPZ):
+ VM_TRACE(ZEND_IS_SMALLER_SPEC_CONST_TMPVARCV_JMPZ)
+ ZEND_IS_SMALLER_SPEC_CONST_TMPVARCV_JMPZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_IS_SMALLER_SPEC_CONST_TMPVARCV_JMPNZ):
+ VM_TRACE(ZEND_IS_SMALLER_SPEC_CONST_TMPVARCV_JMPNZ)
+ ZEND_IS_SMALLER_SPEC_CONST_TMPVARCV_JMPNZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_IS_SMALLER_OR_EQUAL_SPEC_CONST_TMPVARCV):
+ VM_TRACE(ZEND_IS_SMALLER_OR_EQUAL_SPEC_CONST_TMPVARCV)
+ ZEND_IS_SMALLER_OR_EQUAL_SPEC_CONST_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_IS_SMALLER_OR_EQUAL_SPEC_CONST_TMPVARCV_JMPZ):
+ VM_TRACE(ZEND_IS_SMALLER_OR_EQUAL_SPEC_CONST_TMPVARCV_JMPZ)
+ ZEND_IS_SMALLER_OR_EQUAL_SPEC_CONST_TMPVARCV_JMPZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_IS_SMALLER_OR_EQUAL_SPEC_CONST_TMPVARCV_JMPNZ):
+ VM_TRACE(ZEND_IS_SMALLER_OR_EQUAL_SPEC_CONST_TMPVARCV_JMPNZ)
+ ZEND_IS_SMALLER_OR_EQUAL_SPEC_CONST_TMPVARCV_JMPNZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
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);
@@ -56140,30 +54385,10 @@ zend_leave_helper_SPEC_LABEL:
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);
@@ -56172,14 +54397,6 @@ zend_leave_helper_SPEC_LABEL:
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);
@@ -56244,42 +54461,14 @@ zend_leave_helper_SPEC_LABEL:
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_ARRAY_KEY_EXISTS_SPEC_CONST_TMPVAR):
+ VM_TRACE(ZEND_ARRAY_KEY_EXISTS_SPEC_CONST_TMPVAR)
+ ZEND_ARRAY_KEY_EXISTS_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);
@@ -56308,30 +54497,6 @@ zend_leave_helper_SPEC_LABEL:
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);
@@ -56360,18 +54525,10 @@ zend_leave_helper_SPEC_LABEL:
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);
@@ -56396,30 +54553,10 @@ zend_leave_helper_SPEC_LABEL:
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_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);
@@ -56428,14 +54565,6 @@ zend_leave_helper_SPEC_LABEL:
VM_TRACE(ZEND_CONCAT_SPEC_CONST_CV)
ZEND_CONCAT_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);
@@ -56500,10 +54629,18 @@ zend_leave_helper_SPEC_LABEL:
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_ARRAY_KEY_EXISTS_SPEC_CONST_CV):
+ VM_TRACE(ZEND_ARRAY_KEY_EXISTS_SPEC_CONST_CV)
+ ZEND_ARRAY_KEY_EXISTS_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_QM_ASSIGN_LONG_SPEC_TMPVARCV):
+ VM_TRACE(ZEND_QM_ASSIGN_LONG_SPEC_TMPVARCV)
+ ZEND_QM_ASSIGN_LONG_SPEC_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
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);
@@ -56512,6 +54649,66 @@ zend_leave_helper_SPEC_LABEL:
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_ADD_SPEC_TMPVARCV_CONST):
+ VM_TRACE(ZEND_ADD_SPEC_TMPVARCV_CONST)
+ ZEND_ADD_SPEC_TMPVARCV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_SUB_SPEC_TMPVARCV_CONST):
+ VM_TRACE(ZEND_SUB_SPEC_TMPVARCV_CONST)
+ ZEND_SUB_SPEC_TMPVARCV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_MUL_SPEC_TMPVARCV_CONST):
+ VM_TRACE(ZEND_MUL_SPEC_TMPVARCV_CONST)
+ ZEND_MUL_SPEC_TMPVARCV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_MOD_SPEC_TMPVARCV_CONST):
+ VM_TRACE(ZEND_MOD_SPEC_TMPVARCV_CONST)
+ ZEND_MOD_SPEC_TMPVARCV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_SL_SPEC_TMPVARCV_CONST):
+ VM_TRACE(ZEND_SL_SPEC_TMPVARCV_CONST)
+ ZEND_SL_SPEC_TMPVARCV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_SR_SPEC_TMPVARCV_CONST):
+ VM_TRACE(ZEND_SR_SPEC_TMPVARCV_CONST)
+ ZEND_SR_SPEC_TMPVARCV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_IS_SMALLER_SPEC_TMPVARCV_CONST):
+ VM_TRACE(ZEND_IS_SMALLER_SPEC_TMPVARCV_CONST)
+ ZEND_IS_SMALLER_SPEC_TMPVARCV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_IS_SMALLER_SPEC_TMPVARCV_CONST_JMPZ):
+ VM_TRACE(ZEND_IS_SMALLER_SPEC_TMPVARCV_CONST_JMPZ)
+ ZEND_IS_SMALLER_SPEC_TMPVARCV_CONST_JMPZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_IS_SMALLER_SPEC_TMPVARCV_CONST_JMPNZ):
+ VM_TRACE(ZEND_IS_SMALLER_SPEC_TMPVARCV_CONST_JMPNZ)
+ ZEND_IS_SMALLER_SPEC_TMPVARCV_CONST_JMPNZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_CONST):
+ VM_TRACE(ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_CONST)
+ ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_CONST_JMPZ):
+ VM_TRACE(ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_CONST_JMPZ)
+ ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_CONST_JMPZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_CONST_JMPNZ):
+ VM_TRACE(ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_CONST_JMPNZ)
+ ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_CONST_JMPNZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_BW_OR_SPEC_TMPVARCV_CONST):
+ VM_TRACE(ZEND_BW_OR_SPEC_TMPVARCV_CONST)
+ ZEND_BW_OR_SPEC_TMPVARCV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_BW_AND_SPEC_TMPVARCV_CONST):
+ VM_TRACE(ZEND_BW_AND_SPEC_TMPVARCV_CONST)
+ ZEND_BW_AND_SPEC_TMPVARCV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_BW_XOR_SPEC_TMPVARCV_CONST):
+ VM_TRACE(ZEND_BW_XOR_SPEC_TMPVARCV_CONST)
+ ZEND_BW_XOR_SPEC_TMPVARCV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
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);
@@ -56656,6 +54853,66 @@ zend_leave_helper_SPEC_LABEL:
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_SPEC_TMPVARCV_TMPVARCV):
+ VM_TRACE(ZEND_ADD_SPEC_TMPVARCV_TMPVARCV)
+ ZEND_ADD_SPEC_TMPVARCV_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_SUB_SPEC_TMPVARCV_TMPVARCV):
+ VM_TRACE(ZEND_SUB_SPEC_TMPVARCV_TMPVARCV)
+ ZEND_SUB_SPEC_TMPVARCV_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_MUL_SPEC_TMPVARCV_TMPVARCV):
+ VM_TRACE(ZEND_MUL_SPEC_TMPVARCV_TMPVARCV)
+ ZEND_MUL_SPEC_TMPVARCV_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_MOD_SPEC_TMPVARCV_TMPVARCV):
+ VM_TRACE(ZEND_MOD_SPEC_TMPVARCV_TMPVARCV)
+ ZEND_MOD_SPEC_TMPVARCV_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_SL_SPEC_TMPVARCV_TMPVARCV):
+ VM_TRACE(ZEND_SL_SPEC_TMPVARCV_TMPVARCV)
+ ZEND_SL_SPEC_TMPVARCV_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_SR_SPEC_TMPVARCV_TMPVARCV):
+ VM_TRACE(ZEND_SR_SPEC_TMPVARCV_TMPVARCV)
+ ZEND_SR_SPEC_TMPVARCV_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_IS_SMALLER_SPEC_TMPVARCV_TMPVARCV):
+ VM_TRACE(ZEND_IS_SMALLER_SPEC_TMPVARCV_TMPVARCV)
+ ZEND_IS_SMALLER_SPEC_TMPVARCV_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_IS_SMALLER_SPEC_TMPVARCV_TMPVARCV_JMPZ):
+ VM_TRACE(ZEND_IS_SMALLER_SPEC_TMPVARCV_TMPVARCV_JMPZ)
+ ZEND_IS_SMALLER_SPEC_TMPVARCV_TMPVARCV_JMPZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_IS_SMALLER_SPEC_TMPVARCV_TMPVARCV_JMPNZ):
+ VM_TRACE(ZEND_IS_SMALLER_SPEC_TMPVARCV_TMPVARCV_JMPNZ)
+ ZEND_IS_SMALLER_SPEC_TMPVARCV_TMPVARCV_JMPNZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_TMPVARCV):
+ VM_TRACE(ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_TMPVARCV)
+ ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_TMPVARCV_JMPZ):
+ VM_TRACE(ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_TMPVARCV_JMPZ)
+ ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_TMPVARCV_JMPZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_TMPVARCV_JMPNZ):
+ VM_TRACE(ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_TMPVARCV_JMPNZ)
+ ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_TMPVARCV_JMPNZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_BW_OR_SPEC_TMPVARCV_TMPVARCV):
+ VM_TRACE(ZEND_BW_OR_SPEC_TMPVARCV_TMPVARCV)
+ ZEND_BW_OR_SPEC_TMPVARCV_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_BW_AND_SPEC_TMPVARCV_TMPVARCV):
+ VM_TRACE(ZEND_BW_AND_SPEC_TMPVARCV_TMPVARCV)
+ ZEND_BW_AND_SPEC_TMPVARCV_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_BW_XOR_SPEC_TMPVARCV_TMPVARCV):
+ VM_TRACE(ZEND_BW_XOR_SPEC_TMPVARCV_TMPVARCV)
+ ZEND_BW_XOR_SPEC_TMPVARCV_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
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);
@@ -56852,14 +55109,6 @@ zend_leave_helper_SPEC_LABEL:
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);
@@ -56868,34 +55117,10 @@ zend_leave_helper_SPEC_LABEL:
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);
@@ -56908,62 +55133,34 @@ zend_leave_helper_SPEC_LABEL:
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_EQUAL_SPEC_TMPVAR_CONST_JMPZ):
+ VM_TRACE(ZEND_IS_EQUAL_SPEC_TMPVAR_CONST_JMPZ)
+ ZEND_IS_EQUAL_SPEC_TMPVAR_CONST_JMPZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_IS_EQUAL_SPEC_TMPVAR_CONST_JMPNZ):
+ VM_TRACE(ZEND_IS_EQUAL_SPEC_TMPVAR_CONST_JMPNZ)
+ ZEND_IS_EQUAL_SPEC_TMPVAR_CONST_JMPNZ_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_CASE(ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_CONST_JMPZ):
+ VM_TRACE(ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_CONST_JMPZ)
+ ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_CONST_JMPZ_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_CASE(ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_CONST_JMPNZ):
+ VM_TRACE(ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_CONST_JMPNZ)
+ ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_CONST_JMPNZ_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);
@@ -56992,14 +55189,6 @@ zend_leave_helper_SPEC_LABEL:
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);
@@ -57008,6 +55197,10 @@ zend_leave_helper_SPEC_LABEL:
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_ARRAY_KEY_EXISTS_SPEC_TMPVAR_CONST):
+ VM_TRACE(ZEND_ARRAY_KEY_EXISTS_SPEC_TMPVAR_CONST)
+ ZEND_ARRAY_KEY_EXISTS_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);
@@ -57020,34 +55213,10 @@ zend_leave_helper_SPEC_LABEL:
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);
@@ -57060,34 +55229,30 @@ zend_leave_helper_SPEC_LABEL:
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_EQUAL_SPEC_TMPVAR_TMPVAR_JMPZ):
+ VM_TRACE(ZEND_IS_EQUAL_SPEC_TMPVAR_TMPVAR_JMPZ)
+ ZEND_IS_EQUAL_SPEC_TMPVAR_TMPVAR_JMPZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_IS_EQUAL_SPEC_TMPVAR_TMPVAR_JMPNZ):
+ VM_TRACE(ZEND_IS_EQUAL_SPEC_TMPVAR_TMPVAR_JMPNZ)
+ ZEND_IS_EQUAL_SPEC_TMPVAR_TMPVAR_JMPNZ_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_CASE(ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_TMPVAR_JMPZ):
+ VM_TRACE(ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_TMPVAR_JMPZ)
+ ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_TMPVAR_JMPZ_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_CASE(ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_TMPVAR_JMPNZ):
+ VM_TRACE(ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_TMPVAR_JMPNZ)
+ ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_TMPVAR_JMPNZ_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);
@@ -57128,37 +55293,9 @@ zend_leave_helper_SPEC_LABEL:
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_CASE(ZEND_ARRAY_KEY_EXISTS_SPEC_TMPVAR_TMPVAR):
+ VM_TRACE(ZEND_ARRAY_KEY_EXISTS_SPEC_TMPVAR_TMPVAR)
+ ZEND_ARRAY_KEY_EXISTS_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_INSTANCEOF_SPEC_TMPVAR_VAR):
VM_TRACE(ZEND_INSTANCEOF_SPEC_TMPVAR_VAR)
@@ -57188,74 +55325,34 @@ zend_leave_helper_SPEC_LABEL:
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_CASE(ZEND_COUNT_SPEC_TMPVAR_UNUSED):
+ VM_TRACE(ZEND_COUNT_SPEC_TMPVAR_UNUSED)
+ ZEND_COUNT_SPEC_TMPVAR_UNUSED_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_CASE(ZEND_GET_CLASS_SPEC_TMPVAR_UNUSED):
+ VM_TRACE(ZEND_GET_CLASS_SPEC_TMPVAR_UNUSED)
+ ZEND_GET_CLASS_SPEC_TMPVAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_COPY_TMP_SPEC_TMPVAR_UNUSED):
+ VM_TRACE(ZEND_COPY_TMP_SPEC_TMPVAR_UNUSED)
+ ZEND_COPY_TMP_SPEC_TMPVAR_UNUSED_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);
@@ -57264,14 +55361,6 @@ zend_leave_helper_SPEC_LABEL:
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);
@@ -57312,6 +55401,10 @@ zend_leave_helper_SPEC_LABEL:
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_ARRAY_KEY_EXISTS_SPEC_TMPVAR_CV):
+ VM_TRACE(ZEND_ARRAY_KEY_EXISTS_SPEC_TMPVAR_CV)
+ ZEND_ARRAY_KEY_EXISTS_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
HYBRID_CASE(ZEND_RETURN_SPEC_TMP):
VM_TRACE(ZEND_RETURN_SPEC_TMP)
{
@@ -57324,7 +55417,7 @@ zend_leave_helper_SPEC_LABEL:
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);
+ retval_ptr = ZVAL_UNDEFINED_OP1();
if (return_value) {
ZVAL_NULL(return_value);
}
@@ -57344,25 +55437,29 @@ zend_leave_helper_SPEC_LABEL:
}
}
} 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))) {
- zend_refcounted *ref = Z_COUNTED_P(retval_ptr);
- if (GC_MAY_LEAK(ref)) {
- gc_possible_root(ref);
+ do {
+ if (Z_OPT_REFCOUNTED_P(retval_ptr)) {
+ if (EXPECTED(!Z_OPT_ISREF_P(retval_ptr))) {
+ if (EXPECTED(!(EX_CALL_INFO() & ZEND_CALL_CODE))) {
+ zend_refcounted *ref = Z_COUNTED_P(retval_ptr);
+ ZVAL_COPY_VALUE(return_value, retval_ptr);
+ if (GC_MAY_LEAK(ref)) {
+ gc_possible_root(ref);
+ }
+ ZVAL_NULL(retval_ptr);
+ break;
+ } else {
+ Z_ADDREF_P(retval_ptr);
}
- ZVAL_NULL(retval_ptr);
} else {
- Z_ADDREF_P(return_value);
+ retval_ptr = Z_REFVAL_P(retval_ptr);
+ if (Z_OPT_REFCOUNTED_P(retval_ptr)) {
+ Z_ADDREF_P(retval_ptr);
+ }
}
- } else {
- retval_ptr = Z_REFVAL_P(retval_ptr);
- ZVAL_COPY(return_value, retval_ptr);
}
- } else {
ZVAL_COPY_VALUE(return_value, retval_ptr);
- }
+ } while (0);
} else /* if (IS_TMP_VAR == IS_VAR) */ {
if (UNEXPECTED(Z_ISREF_P(retval_ptr))) {
zend_refcounted *ref = Z_COUNTED_P(retval_ptr);
@@ -57426,6 +55523,10 @@ zend_leave_helper_SPEC_LABEL:
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):
+ VM_TRACE(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);
@@ -57534,14 +55635,6 @@ zend_leave_helper_SPEC_LABEL:
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);
@@ -57614,7 +55707,7 @@ zend_leave_helper_SPEC_LABEL:
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);
+ retval_ptr = ZVAL_UNDEFINED_OP1();
if (return_value) {
ZVAL_NULL(return_value);
}
@@ -57634,25 +55727,29 @@ zend_leave_helper_SPEC_LABEL:
}
}
} 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))) {
- zend_refcounted *ref = Z_COUNTED_P(retval_ptr);
- if (GC_MAY_LEAK(ref)) {
- gc_possible_root(ref);
+ do {
+ if (Z_OPT_REFCOUNTED_P(retval_ptr)) {
+ if (EXPECTED(!Z_OPT_ISREF_P(retval_ptr))) {
+ if (EXPECTED(!(EX_CALL_INFO() & ZEND_CALL_CODE))) {
+ zend_refcounted *ref = Z_COUNTED_P(retval_ptr);
+ ZVAL_COPY_VALUE(return_value, retval_ptr);
+ if (GC_MAY_LEAK(ref)) {
+ gc_possible_root(ref);
+ }
+ ZVAL_NULL(retval_ptr);
+ break;
+ } else {
+ Z_ADDREF_P(retval_ptr);
}
- ZVAL_NULL(retval_ptr);
} else {
- Z_ADDREF_P(return_value);
+ retval_ptr = Z_REFVAL_P(retval_ptr);
+ if (Z_OPT_REFCOUNTED_P(retval_ptr)) {
+ Z_ADDREF_P(retval_ptr);
+ }
}
- } else {
- retval_ptr = Z_REFVAL_P(retval_ptr);
- ZVAL_COPY(return_value, retval_ptr);
}
- } else {
ZVAL_COPY_VALUE(return_value, retval_ptr);
- }
+ } while (0);
} else /* if (IS_VAR == IS_VAR) */ {
if (UNEXPECTED(Z_ISREF_P(retval_ptr))) {
zend_refcounted *ref = Z_COUNTED_P(retval_ptr);
@@ -57686,7 +55783,7 @@ zend_leave_helper_SPEC_LABEL:
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);
+ ZEND_SEND_VAR_SPEC_VAR_INLINE_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)
@@ -57744,6 +55841,10 @@ zend_leave_helper_SPEC_LABEL:
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):
+ VM_TRACE(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);
@@ -57768,166 +55869,26 @@ zend_leave_helper_SPEC_LABEL:
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_CASE(ZEND_ASSIGN_OBJ_OP_SPEC_VAR_CONST):
+ VM_TRACE(ZEND_ASSIGN_OBJ_OP_SPEC_VAR_CONST)
+ ZEND_ASSIGN_OBJ_OP_SPEC_VAR_CONST_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_CASE(ZEND_ASSIGN_DIM_OP_SPEC_VAR_CONST):
+ VM_TRACE(ZEND_ASSIGN_DIM_OP_SPEC_VAR_CONST)
+ ZEND_ASSIGN_DIM_OP_SPEC_VAR_CONST_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_CASE(ZEND_ASSIGN_OP_SPEC_VAR_CONST):
+ VM_TRACE(ZEND_ASSIGN_OP_SPEC_VAR_CONST)
+ ZEND_ASSIGN_OP_SPEC_VAR_CONST_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);
@@ -58004,6 +55965,14 @@ zend_leave_helper_SPEC_LABEL:
VM_TRACE(ZEND_ASSIGN_SPEC_VAR_CONST_RETVAL_USED)
ZEND_ASSIGN_SPEC_VAR_CONST_RETVAL_USED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_OP_DATA_VAR):
+ VM_TRACE(ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_OP_DATA_VAR)
+ ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_OP_DATA_CV):
+ VM_TRACE(ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_OP_DATA_CV)
+ ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
HYBRID_CASE(ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_CONST):
VM_TRACE(ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_CONST)
ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
@@ -58036,166 +56005,26 @@ zend_leave_helper_SPEC_LABEL:
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_CASE(ZEND_ASSIGN_OBJ_OP_SPEC_VAR_TMPVAR):
+ VM_TRACE(ZEND_ASSIGN_OBJ_OP_SPEC_VAR_TMPVAR)
+ ZEND_ASSIGN_OBJ_OP_SPEC_VAR_TMPVAR_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_CASE(ZEND_ASSIGN_DIM_OP_SPEC_VAR_TMPVAR):
+ VM_TRACE(ZEND_ASSIGN_DIM_OP_SPEC_VAR_TMPVAR)
+ ZEND_ASSIGN_DIM_OP_SPEC_VAR_TMPVAR_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_CASE(ZEND_ASSIGN_OP_SPEC_VAR_TMPVAR):
+ VM_TRACE(ZEND_ASSIGN_OP_SPEC_VAR_TMPVAR)
+ ZEND_ASSIGN_OP_SPEC_VAR_TMPVAR_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);
@@ -58264,6 +56093,14 @@ zend_leave_helper_SPEC_LABEL:
VM_TRACE(ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_DATA_CV)
ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR_OP_DATA_VAR):
+ VM_TRACE(ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR_OP_DATA_VAR)
+ ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR_OP_DATA_CV):
+ VM_TRACE(ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR_OP_DATA_CV)
+ ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
HYBRID_CASE(ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_TMPVAR):
VM_TRACE(ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_TMPVAR)
ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
@@ -58328,53 +56165,9 @@ zend_leave_helper_SPEC_LABEL:
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_CASE(ZEND_ASSIGN_DIM_OP_SPEC_VAR_UNUSED):
+ VM_TRACE(ZEND_ASSIGN_DIM_OP_SPEC_VAR_UNUSED)
+ ZEND_ASSIGN_DIM_OP_SPEC_VAR_UNUSED_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)
@@ -58436,178 +56229,30 @@ zend_leave_helper_SPEC_LABEL:
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_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_CASE(ZEND_ASSIGN_OBJ_OP_SPEC_VAR_CV):
+ VM_TRACE(ZEND_ASSIGN_OBJ_OP_SPEC_VAR_CV)
+ ZEND_ASSIGN_OBJ_OP_SPEC_VAR_CV_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_CASE(ZEND_ASSIGN_DIM_OP_SPEC_VAR_CV):
+ VM_TRACE(ZEND_ASSIGN_DIM_OP_SPEC_VAR_CV)
+ ZEND_ASSIGN_DIM_OP_SPEC_VAR_CV_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_CASE(ZEND_ASSIGN_OP_SPEC_VAR_CV):
+ VM_TRACE(ZEND_ASSIGN_OP_SPEC_VAR_CV)
+ ZEND_ASSIGN_OP_SPEC_VAR_CV_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);
@@ -58688,6 +56333,14 @@ zend_leave_helper_SPEC_LABEL:
VM_TRACE(ZEND_ASSIGN_REF_SPEC_VAR_CV)
ZEND_ASSIGN_REF_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_DATA_VAR):
+ VM_TRACE(ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_DATA_VAR)
+ ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_DATA_CV):
+ VM_TRACE(ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_DATA_CV)
+ ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
HYBRID_CASE(ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_CV):
VM_TRACE(ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_CV)
ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
@@ -58732,81 +56385,25 @@ zend_leave_helper_SPEC_LABEL:
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_CASE(ZEND_ASSIGN_OBJ_OP_SPEC_UNUSED_CONST):
+ VM_TRACE(ZEND_ASSIGN_OBJ_OP_SPEC_UNUSED_CONST)
+ ZEND_ASSIGN_OBJ_OP_SPEC_UNUSED_CONST_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);
+ ZEND_FETCH_OBJ_R_SPEC_UNUSED_CONST_INLINE_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)
@@ -58844,6 +56441,14 @@ zend_leave_helper_SPEC_LABEL:
VM_TRACE(ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_OP_DATA_CV)
ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CONST_OP_DATA_VAR):
+ VM_TRACE(ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CONST_OP_DATA_VAR)
+ ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CONST_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CONST_OP_DATA_CV):
+ VM_TRACE(ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CONST_OP_DATA_CV)
+ ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CONST_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
HYBRID_CASE(ZEND_ROPE_INIT_SPEC_UNUSED_CONST):
VM_TRACE(ZEND_ROPE_INIT_SPEC_UNUSED_CONST)
ZEND_ROPE_INIT_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
@@ -58868,6 +56473,10 @@ zend_leave_helper_SPEC_LABEL:
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_INIT_ARRAY_SPEC_UNUSED_CONST):
+ VM_TRACE(ZEND_INIT_ARRAY_SPEC_UNUSED_CONST)
+ ZEND_INIT_ARRAY_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);
@@ -58880,70 +56489,18 @@ zend_leave_helper_SPEC_LABEL:
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_CASE(ZEND_ASSIGN_OBJ_OP_SPEC_UNUSED_TMPVAR):
+ VM_TRACE(ZEND_ASSIGN_OBJ_OP_SPEC_UNUSED_TMPVAR)
+ ZEND_ASSIGN_OBJ_OP_SPEC_UNUSED_TMPVAR_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);
@@ -58984,6 +56541,14 @@ zend_leave_helper_SPEC_LABEL:
VM_TRACE(ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_OP_DATA_CV)
ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMPVAR_OP_DATA_VAR):
+ VM_TRACE(ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMPVAR_OP_DATA_VAR)
+ ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMPVAR_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMPVAR_OP_DATA_CV):
+ VM_TRACE(ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMPVAR_OP_DATA_CV)
+ ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMPVAR_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
HYBRID_CASE(ZEND_ROPE_INIT_SPEC_UNUSED_TMPVAR):
VM_TRACE(ZEND_ROPE_INIT_SPEC_UNUSED_TMPVAR)
ZEND_ROPE_INIT_SPEC_UNUSED_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
@@ -59000,6 +56565,10 @@ zend_leave_helper_SPEC_LABEL:
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_INIT_ARRAY_SPEC_UNUSED_TMPVAR):
+ VM_TRACE(ZEND_INIT_ARRAY_SPEC_UNUSED_TMPVAR)
+ ZEND_INIT_ARRAY_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);
@@ -59032,6 +56601,10 @@ zend_leave_helper_SPEC_LABEL:
VM_TRACE(ZEND_NEW_SPEC_UNUSED_UNUSED)
ZEND_NEW_SPEC_UNUSED_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
+ HYBRID_CASE(ZEND_INIT_ARRAY_SPEC_UNUSED_UNUSED):
+ VM_TRACE(ZEND_INIT_ARRAY_SPEC_UNUSED_UNUSED)
+ ZEND_INIT_ARRAY_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);
@@ -59060,70 +56633,18 @@ zend_leave_helper_SPEC_LABEL:
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_CASE(ZEND_ASSIGN_OBJ_OP_SPEC_UNUSED_CV):
+ VM_TRACE(ZEND_ASSIGN_OBJ_OP_SPEC_UNUSED_CV)
+ ZEND_ASSIGN_OBJ_OP_SPEC_UNUSED_CV_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);
@@ -59164,6 +56685,14 @@ zend_leave_helper_SPEC_LABEL:
VM_TRACE(ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_DATA_CV)
ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_OP_DATA_VAR):
+ VM_TRACE(ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_OP_DATA_VAR)
+ ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_OP_DATA_CV):
+ VM_TRACE(ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_OP_DATA_CV)
+ ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
HYBRID_CASE(ZEND_ROPE_INIT_SPEC_UNUSED_CV):
VM_TRACE(ZEND_ROPE_INIT_SPEC_UNUSED_CV)
ZEND_ROPE_INIT_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
@@ -59180,6 +56709,10 @@ zend_leave_helper_SPEC_LABEL:
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_INIT_ARRAY_SPEC_UNUSED_CV):
+ VM_TRACE(ZEND_INIT_ARRAY_SPEC_UNUSED_CV)
+ ZEND_INIT_ARRAY_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);
@@ -59260,7 +56793,7 @@ zend_leave_helper_SPEC_LABEL:
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);
+ retval_ptr = ZVAL_UNDEFINED_OP1();
if (return_value) {
ZVAL_NULL(return_value);
}
@@ -59280,25 +56813,29 @@ zend_leave_helper_SPEC_LABEL:
}
}
} 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))) {
- zend_refcounted *ref = Z_COUNTED_P(retval_ptr);
- if (GC_MAY_LEAK(ref)) {
- gc_possible_root(ref);
+ do {
+ if (Z_OPT_REFCOUNTED_P(retval_ptr)) {
+ if (EXPECTED(!Z_OPT_ISREF_P(retval_ptr))) {
+ if (EXPECTED(!(EX_CALL_INFO() & ZEND_CALL_CODE))) {
+ zend_refcounted *ref = Z_COUNTED_P(retval_ptr);
+ ZVAL_COPY_VALUE(return_value, retval_ptr);
+ if (GC_MAY_LEAK(ref)) {
+ gc_possible_root(ref);
+ }
+ ZVAL_NULL(retval_ptr);
+ break;
+ } else {
+ Z_ADDREF_P(retval_ptr);
}
- ZVAL_NULL(retval_ptr);
} else {
- Z_ADDREF_P(return_value);
+ retval_ptr = Z_REFVAL_P(retval_ptr);
+ if (Z_OPT_REFCOUNTED_P(retval_ptr)) {
+ Z_ADDREF_P(retval_ptr);
+ }
}
- } else {
- retval_ptr = Z_REFVAL_P(retval_ptr);
- ZVAL_COPY(return_value, retval_ptr);
}
- } else {
ZVAL_COPY_VALUE(return_value, retval_ptr);
- }
+ } while (0);
} else /* if (IS_CV == IS_VAR) */ {
if (UNEXPECTED(Z_ISREF_P(retval_ptr))) {
zend_refcounted *ref = Z_COUNTED_P(retval_ptr);
@@ -59332,7 +56869,7 @@ zend_leave_helper_SPEC_LABEL:
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);
+ ZEND_SEND_VAR_SPEC_CV_INLINE_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_SEND_REF_SPEC_CV):
VM_TRACE(ZEND_SEND_REF_SPEC_CV)
@@ -59374,10 +56911,6 @@ zend_leave_helper_SPEC_LABEL:
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);
@@ -59418,14 +56951,6 @@ zend_leave_helper_SPEC_LABEL:
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);
@@ -59442,14 +56967,6 @@ zend_leave_helper_SPEC_LABEL:
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);
@@ -59458,10 +56975,6 @@ zend_leave_helper_SPEC_LABEL:
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);
@@ -59470,10 +56983,6 @@ zend_leave_helper_SPEC_LABEL:
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);
@@ -59482,34 +56991,10 @@ zend_leave_helper_SPEC_LABEL:
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_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);
@@ -59530,222 +57015,54 @@ zend_leave_helper_SPEC_LABEL:
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_EQUAL_SPEC_CV_CONST_JMPZ):
+ VM_TRACE(ZEND_IS_EQUAL_SPEC_CV_CONST_JMPZ)
+ ZEND_IS_EQUAL_SPEC_CV_CONST_JMPZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_IS_EQUAL_SPEC_CV_CONST_JMPNZ):
+ VM_TRACE(ZEND_IS_EQUAL_SPEC_CV_CONST_JMPNZ)
+ ZEND_IS_EQUAL_SPEC_CV_CONST_JMPNZ_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_CASE(ZEND_IS_NOT_EQUAL_SPEC_CV_CONST_JMPZ):
+ VM_TRACE(ZEND_IS_NOT_EQUAL_SPEC_CV_CONST_JMPZ)
+ ZEND_IS_NOT_EQUAL_SPEC_CV_CONST_JMPZ_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_CASE(ZEND_IS_NOT_EQUAL_SPEC_CV_CONST_JMPNZ):
+ VM_TRACE(ZEND_IS_NOT_EQUAL_SPEC_CV_CONST_JMPNZ)
+ ZEND_IS_NOT_EQUAL_SPEC_CV_CONST_JMPNZ_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_CASE(ZEND_ASSIGN_OBJ_OP_SPEC_CV_CONST):
+ VM_TRACE(ZEND_ASSIGN_OBJ_OP_SPEC_CV_CONST)
+ ZEND_ASSIGN_OBJ_OP_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_CASE(ZEND_ASSIGN_DIM_OP_SPEC_CV_CONST):
+ VM_TRACE(ZEND_ASSIGN_DIM_OP_SPEC_CV_CONST)
+ ZEND_ASSIGN_DIM_OP_SPEC_CV_CONST_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_CASE(ZEND_ASSIGN_OP_SPEC_CV_CONST):
+ VM_TRACE(ZEND_ASSIGN_OP_SPEC_CV_CONST)
+ ZEND_ASSIGN_OP_SPEC_CV_CONST_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);
@@ -59772,7 +57089,7 @@ zend_leave_helper_SPEC_LABEL:
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);
+ ZEND_FETCH_OBJ_R_SPEC_CV_CONST_INLINE_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)
@@ -59834,6 +57151,14 @@ zend_leave_helper_SPEC_LABEL:
VM_TRACE(ZEND_ASSIGN_SPEC_CV_CONST_RETVAL_USED)
ZEND_ASSIGN_SPEC_CV_CONST_RETVAL_USED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_OP_DATA_VAR):
+ VM_TRACE(ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_OP_DATA_VAR)
+ ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_OP_DATA_CV):
+ VM_TRACE(ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_OP_DATA_CV)
+ ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
HYBRID_CASE(ZEND_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);
@@ -59850,10 +57175,6 @@ zend_leave_helper_SPEC_LABEL:
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);
@@ -59862,10 +57183,6 @@ zend_leave_helper_SPEC_LABEL:
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);
@@ -59874,6 +57191,10 @@ zend_leave_helper_SPEC_LABEL:
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_ARRAY_KEY_EXISTS_SPEC_CV_CONST):
+ VM_TRACE(ZEND_ARRAY_KEY_EXISTS_SPEC_CV_CONST)
+ ZEND_ARRAY_KEY_EXISTS_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);
@@ -59886,10 +57207,6 @@ zend_leave_helper_SPEC_LABEL:
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_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);
@@ -59902,34 +57219,10 @@ zend_leave_helper_SPEC_LABEL:
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);
@@ -59942,198 +57235,54 @@ zend_leave_helper_SPEC_LABEL:
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_EQUAL_SPEC_CV_TMPVAR_JMPZ):
+ VM_TRACE(ZEND_IS_EQUAL_SPEC_CV_TMPVAR_JMPZ)
+ ZEND_IS_EQUAL_SPEC_CV_TMPVAR_JMPZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_IS_EQUAL_SPEC_CV_TMPVAR_JMPNZ):
+ VM_TRACE(ZEND_IS_EQUAL_SPEC_CV_TMPVAR_JMPNZ)
+ ZEND_IS_EQUAL_SPEC_CV_TMPVAR_JMPNZ_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_CASE(ZEND_IS_NOT_EQUAL_SPEC_CV_TMPVAR_JMPZ):
+ VM_TRACE(ZEND_IS_NOT_EQUAL_SPEC_CV_TMPVAR_JMPZ)
+ ZEND_IS_NOT_EQUAL_SPEC_CV_TMPVAR_JMPZ_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_CASE(ZEND_IS_NOT_EQUAL_SPEC_CV_TMPVAR_JMPNZ):
+ VM_TRACE(ZEND_IS_NOT_EQUAL_SPEC_CV_TMPVAR_JMPNZ)
+ ZEND_IS_NOT_EQUAL_SPEC_CV_TMPVAR_JMPNZ_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_CASE(ZEND_ASSIGN_OBJ_OP_SPEC_CV_TMPVAR):
+ VM_TRACE(ZEND_ASSIGN_OBJ_OP_SPEC_CV_TMPVAR)
+ ZEND_ASSIGN_OBJ_OP_SPEC_CV_TMPVAR_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_CASE(ZEND_ASSIGN_DIM_OP_SPEC_CV_TMPVAR):
+ VM_TRACE(ZEND_ASSIGN_DIM_OP_SPEC_CV_TMPVAR)
+ ZEND_ASSIGN_DIM_OP_SPEC_CV_TMPVAR_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_CASE(ZEND_ASSIGN_OP_SPEC_CV_TMPVAR):
+ VM_TRACE(ZEND_ASSIGN_OP_SPEC_CV_TMPVAR)
+ ZEND_ASSIGN_OP_SPEC_CV_TMPVAR_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);
@@ -60214,6 +57363,14 @@ zend_leave_helper_SPEC_LABEL:
VM_TRACE(ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_DATA_CV)
ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_OP_DATA_VAR):
+ VM_TRACE(ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_OP_DATA_VAR)
+ ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_OP_DATA_CV):
+ VM_TRACE(ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_OP_DATA_CV)
+ ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
HYBRID_CASE(ZEND_FAST_CONCAT_SPEC_CV_TMPVAR):
VM_TRACE(ZEND_FAST_CONCAT_SPEC_CV_TMPVAR)
ZEND_FAST_CONCAT_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
@@ -60246,6 +57403,10 @@ zend_leave_helper_SPEC_LABEL:
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_ARRAY_KEY_EXISTS_SPEC_CV_TMPVAR):
+ VM_TRACE(ZEND_ARRAY_KEY_EXISTS_SPEC_CV_TMPVAR)
+ ZEND_ARRAY_KEY_EXISTS_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);
@@ -60274,30 +57435,6 @@ zend_leave_helper_SPEC_LABEL:
VM_TRACE(ZEND_IS_NOT_IDENTICAL_SPEC_CV_VAR)
ZEND_IS_NOT_IDENTICAL_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_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);
@@ -60310,14 +57447,6 @@ zend_leave_helper_SPEC_LABEL:
VM_TRACE(ZEND_ASSIGN_REF_SPEC_CV_VAR)
ZEND_ASSIGN_REF_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_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);
@@ -60326,53 +57455,9 @@ zend_leave_helper_SPEC_LABEL:
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_CASE(ZEND_ASSIGN_DIM_OP_SPEC_CV_UNUSED):
+ VM_TRACE(ZEND_ASSIGN_DIM_OP_SPEC_CV_UNUSED)
+ ZEND_ASSIGN_DIM_OP_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_FETCH_R_SPEC_CV_UNUSED):
VM_TRACE(ZEND_FETCH_R_SPEC_CV_UNUSED)
@@ -60398,30 +57483,6 @@ zend_leave_helper_SPEC_LABEL:
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);
@@ -60470,10 +57531,6 @@ zend_leave_helper_SPEC_LABEL:
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_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);
@@ -60486,10 +57543,6 @@ zend_leave_helper_SPEC_LABEL:
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);
@@ -60498,6 +57551,10 @@ zend_leave_helper_SPEC_LABEL:
VM_TRACE(ZEND_YIELD_SPEC_CV_UNUSED)
ZEND_YIELD_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
+ HYBRID_CASE(ZEND_BIND_STATIC_SPEC_CV_UNUSED):
+ VM_TRACE(ZEND_BIND_STATIC_SPEC_CV_UNUSED)
+ ZEND_BIND_STATIC_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);
@@ -60518,34 +57575,10 @@ zend_leave_helper_SPEC_LABEL:
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);
@@ -60566,198 +57599,54 @@ zend_leave_helper_SPEC_LABEL:
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_EQUAL_SPEC_CV_CV_JMPZ):
+ VM_TRACE(ZEND_IS_EQUAL_SPEC_CV_CV_JMPZ)
+ ZEND_IS_EQUAL_SPEC_CV_CV_JMPZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_IS_EQUAL_SPEC_CV_CV_JMPNZ):
+ VM_TRACE(ZEND_IS_EQUAL_SPEC_CV_CV_JMPNZ)
+ ZEND_IS_EQUAL_SPEC_CV_CV_JMPNZ_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_CASE(ZEND_IS_NOT_EQUAL_SPEC_CV_CV_JMPZ):
+ VM_TRACE(ZEND_IS_NOT_EQUAL_SPEC_CV_CV_JMPZ)
+ ZEND_IS_NOT_EQUAL_SPEC_CV_CV_JMPZ_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_CASE(ZEND_IS_NOT_EQUAL_SPEC_CV_CV_JMPNZ):
+ VM_TRACE(ZEND_IS_NOT_EQUAL_SPEC_CV_CV_JMPNZ)
+ ZEND_IS_NOT_EQUAL_SPEC_CV_CV_JMPNZ_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_CASE(ZEND_ASSIGN_OBJ_OP_SPEC_CV_CV):
+ VM_TRACE(ZEND_ASSIGN_OBJ_OP_SPEC_CV_CV)
+ ZEND_ASSIGN_OBJ_OP_SPEC_CV_CV_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_CASE(ZEND_ASSIGN_DIM_OP_SPEC_CV_CV):
+ VM_TRACE(ZEND_ASSIGN_DIM_OP_SPEC_CV_CV)
+ ZEND_ASSIGN_DIM_OP_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_CASE(ZEND_ASSIGN_OP_SPEC_CV_CV):
+ VM_TRACE(ZEND_ASSIGN_OP_SPEC_CV_CV)
+ ZEND_ASSIGN_OP_SPEC_CV_CV_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);
@@ -60850,6 +57739,14 @@ zend_leave_helper_SPEC_LABEL:
VM_TRACE(ZEND_ASSIGN_REF_SPEC_CV_CV)
ZEND_ASSIGN_REF_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_DATA_VAR):
+ VM_TRACE(ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_DATA_VAR)
+ ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
+ HYBRID_CASE(ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_DATA_CV):
+ VM_TRACE(ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_DATA_CV)
+ ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
HYBRID_CASE(ZEND_FAST_CONCAT_SPEC_CV_CV):
VM_TRACE(ZEND_FAST_CONCAT_SPEC_CV_CV)
ZEND_FAST_CONCAT_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
@@ -60882,13 +57779,21 @@ zend_leave_helper_SPEC_LABEL:
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_ARRAY_KEY_EXISTS_SPEC_CV_CV):
+ VM_TRACE(ZEND_ARRAY_KEY_EXISTS_SPEC_CV_CV)
+ ZEND_ARRAY_KEY_EXISTS_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(HYBRID_HALT):
+#ifdef ZEND_VM_FP_GLOBAL_REG
execute_data = orig_execute_data;
+#endif
+#ifdef ZEND_VM_IP_GLOBAL_REG
opline = orig_opline;
+#endif
return;
HYBRID_DEFAULT:
VM_TRACE(ZEND_NULL)
@@ -60918,17 +57823,29 @@ zend_leave_helper_SPEC_LABEL:
}
zend_error_noreturn(E_CORE_ERROR, "Arrived at end of main loop which shouldn't happen");
}
+#if (ZEND_VM_KIND != ZEND_VM_KIND_CALL) && (ZEND_GCC_VERSION >= 4000) && !defined(__clang__)
+# pragma GCC pop_options
+#endif
ZEND_API void zend_execute(zend_op_array *op_array, zval *return_value)
{
zend_execute_data *execute_data;
+ void *object_or_called_scope;
+ uint32_t call_info;
if (EG(exception) != NULL) {
return;
}
- execute_data = zend_vm_stack_push_call_frame(ZEND_CALL_TOP_CODE | ZEND_CALL_HAS_SYMBOL_TABLE,
- (zend_function*)op_array, 0, zend_get_called_scope(EG(current_execute_data)), zend_get_this_object(EG(current_execute_data)));
+ object_or_called_scope = zend_get_this_object(EG(current_execute_data));
+ if (EXPECTED(!object_or_called_scope)) {
+ object_or_called_scope = zend_get_called_scope(EG(current_execute_data));
+ call_info = ZEND_CALL_TOP_CODE | ZEND_CALL_HAS_SYMBOL_TABLE;
+ } else {
+ call_info = ZEND_CALL_TOP_CODE | ZEND_CALL_HAS_SYMBOL_TABLE | ZEND_CALL_HAS_THIS;
+ }
+ execute_data = zend_vm_stack_push_call_frame(call_info,
+ (zend_function*)op_array, 0, object_or_called_scope);
if (EG(current_execute_data)) {
execute_data->symbol_table = zend_rebuild_symbol_table();
} else {
@@ -60946,80 +57863,80 @@ void zend_vm_init(void)
static const void * const labels[] = {
ZEND_NOP_SPEC_HANDLER,
ZEND_ADD_SPEC_CONST_CONST_HANDLER,
- ZEND_ADD_SPEC_CONST_TMPVAR_HANDLER,
- ZEND_ADD_SPEC_CONST_TMPVAR_HANDLER,
+ ZEND_ADD_SPEC_CONST_TMPVARCV_HANDLER,
+ ZEND_ADD_SPEC_CONST_TMPVARCV_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_ADD_SPEC_CONST_CV_HANDLER,
- ZEND_ADD_SPEC_TMPVAR_CONST_HANDLER,
- ZEND_ADD_SPEC_TMPVAR_TMPVAR_HANDLER,
- ZEND_ADD_SPEC_TMPVAR_TMPVAR_HANDLER,
+ ZEND_ADD_SPEC_CONST_TMPVARCV_HANDLER,
+ ZEND_ADD_SPEC_TMPVARCV_CONST_HANDLER,
+ ZEND_ADD_SPEC_TMPVARCV_TMPVARCV_HANDLER,
+ ZEND_ADD_SPEC_TMPVARCV_TMPVARCV_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_ADD_SPEC_TMPVAR_CV_HANDLER,
- ZEND_ADD_SPEC_TMPVAR_CONST_HANDLER,
- ZEND_ADD_SPEC_TMPVAR_TMPVAR_HANDLER,
- ZEND_ADD_SPEC_TMPVAR_TMPVAR_HANDLER,
+ ZEND_ADD_SPEC_TMPVARCV_TMPVARCV_HANDLER,
+ ZEND_ADD_SPEC_TMPVARCV_CONST_HANDLER,
+ ZEND_ADD_SPEC_TMPVARCV_TMPVARCV_HANDLER,
+ ZEND_ADD_SPEC_TMPVARCV_TMPVARCV_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_ADD_SPEC_TMPVAR_CV_HANDLER,
+ ZEND_ADD_SPEC_TMPVARCV_TMPVARCV_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_ADD_SPEC_CV_CONST_HANDLER,
- ZEND_ADD_SPEC_CV_TMPVAR_HANDLER,
- ZEND_ADD_SPEC_CV_TMPVAR_HANDLER,
+ ZEND_ADD_SPEC_TMPVARCV_CONST_HANDLER,
+ ZEND_ADD_SPEC_TMPVARCV_TMPVARCV_HANDLER,
+ ZEND_ADD_SPEC_TMPVARCV_TMPVARCV_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_ADD_SPEC_CV_CV_HANDLER,
+ ZEND_ADD_SPEC_TMPVARCV_TMPVARCV_HANDLER,
ZEND_SUB_SPEC_CONST_CONST_HANDLER,
- ZEND_SUB_SPEC_CONST_TMPVAR_HANDLER,
- ZEND_SUB_SPEC_CONST_TMPVAR_HANDLER,
+ ZEND_SUB_SPEC_CONST_TMPVARCV_HANDLER,
+ ZEND_SUB_SPEC_CONST_TMPVARCV_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_SUB_SPEC_CONST_CV_HANDLER,
- ZEND_SUB_SPEC_TMPVAR_CONST_HANDLER,
- ZEND_SUB_SPEC_TMPVAR_TMPVAR_HANDLER,
- ZEND_SUB_SPEC_TMPVAR_TMPVAR_HANDLER,
+ ZEND_SUB_SPEC_CONST_TMPVARCV_HANDLER,
+ ZEND_SUB_SPEC_TMPVARCV_CONST_HANDLER,
+ ZEND_SUB_SPEC_TMPVARCV_TMPVARCV_HANDLER,
+ ZEND_SUB_SPEC_TMPVARCV_TMPVARCV_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_SUB_SPEC_TMPVAR_CV_HANDLER,
- ZEND_SUB_SPEC_TMPVAR_CONST_HANDLER,
- ZEND_SUB_SPEC_TMPVAR_TMPVAR_HANDLER,
- ZEND_SUB_SPEC_TMPVAR_TMPVAR_HANDLER,
+ ZEND_SUB_SPEC_TMPVARCV_TMPVARCV_HANDLER,
+ ZEND_SUB_SPEC_TMPVARCV_CONST_HANDLER,
+ ZEND_SUB_SPEC_TMPVARCV_TMPVARCV_HANDLER,
+ ZEND_SUB_SPEC_TMPVARCV_TMPVARCV_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_SUB_SPEC_TMPVAR_CV_HANDLER,
+ ZEND_SUB_SPEC_TMPVARCV_TMPVARCV_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_SUB_SPEC_CV_CONST_HANDLER,
- ZEND_SUB_SPEC_CV_TMPVAR_HANDLER,
- ZEND_SUB_SPEC_CV_TMPVAR_HANDLER,
+ ZEND_SUB_SPEC_TMPVARCV_CONST_HANDLER,
+ ZEND_SUB_SPEC_TMPVARCV_TMPVARCV_HANDLER,
+ ZEND_SUB_SPEC_TMPVARCV_TMPVARCV_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_SUB_SPEC_CV_CV_HANDLER,
+ ZEND_SUB_SPEC_TMPVARCV_TMPVARCV_HANDLER,
ZEND_MUL_SPEC_CONST_CONST_HANDLER,
ZEND_NULL_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_TMPVARCV_CONST_HANDLER,
+ ZEND_MUL_SPEC_TMPVARCV_TMPVARCV_HANDLER,
+ ZEND_MUL_SPEC_TMPVARCV_TMPVARCV_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_MUL_SPEC_TMPVAR_CONST_HANDLER,
- ZEND_MUL_SPEC_TMPVAR_TMPVAR_HANDLER,
- ZEND_MUL_SPEC_TMPVAR_TMPVAR_HANDLER,
+ ZEND_MUL_SPEC_TMPVARCV_TMPVARCV_HANDLER,
+ ZEND_MUL_SPEC_TMPVARCV_CONST_HANDLER,
+ ZEND_MUL_SPEC_TMPVARCV_TMPVARCV_HANDLER,
+ ZEND_MUL_SPEC_TMPVARCV_TMPVARCV_HANDLER,
ZEND_NULL_HANDLER,
+ ZEND_MUL_SPEC_TMPVARCV_TMPVARCV_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
+ ZEND_MUL_SPEC_TMPVARCV_CONST_HANDLER,
+ ZEND_MUL_SPEC_TMPVARCV_TMPVARCV_HANDLER,
+ ZEND_MUL_SPEC_TMPVARCV_TMPVARCV_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_MUL_SPEC_CV_CONST_HANDLER,
- ZEND_MUL_SPEC_CV_TMPVAR_HANDLER,
- ZEND_MUL_SPEC_CV_TMPVAR_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_MUL_SPEC_CV_CV_HANDLER,
+ ZEND_MUL_SPEC_TMPVARCV_TMPVARCV_HANDLER,
ZEND_DIV_SPEC_CONST_CONST_HANDLER,
ZEND_DIV_SPEC_CONST_TMPVAR_HANDLER,
ZEND_DIV_SPEC_CONST_TMPVAR_HANDLER,
@@ -61046,80 +57963,80 @@ void zend_vm_init(void)
ZEND_NULL_HANDLER,
ZEND_DIV_SPEC_CV_CV_HANDLER,
ZEND_MOD_SPEC_CONST_CONST_HANDLER,
- ZEND_MOD_SPEC_CONST_TMPVAR_HANDLER,
- ZEND_MOD_SPEC_CONST_TMPVAR_HANDLER,
+ ZEND_MOD_SPEC_CONST_TMPVARCV_HANDLER,
+ ZEND_MOD_SPEC_CONST_TMPVARCV_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_MOD_SPEC_CONST_CV_HANDLER,
- ZEND_MOD_SPEC_TMPVAR_CONST_HANDLER,
- ZEND_MOD_SPEC_TMPVAR_TMPVAR_HANDLER,
- ZEND_MOD_SPEC_TMPVAR_TMPVAR_HANDLER,
+ ZEND_MOD_SPEC_CONST_TMPVARCV_HANDLER,
+ ZEND_MOD_SPEC_TMPVARCV_CONST_HANDLER,
+ ZEND_MOD_SPEC_TMPVARCV_TMPVARCV_HANDLER,
+ ZEND_MOD_SPEC_TMPVARCV_TMPVARCV_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_MOD_SPEC_TMPVAR_CV_HANDLER,
- ZEND_MOD_SPEC_TMPVAR_CONST_HANDLER,
- ZEND_MOD_SPEC_TMPVAR_TMPVAR_HANDLER,
- ZEND_MOD_SPEC_TMPVAR_TMPVAR_HANDLER,
+ ZEND_MOD_SPEC_TMPVARCV_TMPVARCV_HANDLER,
+ ZEND_MOD_SPEC_TMPVARCV_CONST_HANDLER,
+ ZEND_MOD_SPEC_TMPVARCV_TMPVARCV_HANDLER,
+ ZEND_MOD_SPEC_TMPVARCV_TMPVARCV_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_MOD_SPEC_TMPVAR_CV_HANDLER,
+ ZEND_MOD_SPEC_TMPVARCV_TMPVARCV_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_MOD_SPEC_CV_CONST_HANDLER,
- ZEND_MOD_SPEC_CV_TMPVAR_HANDLER,
- ZEND_MOD_SPEC_CV_TMPVAR_HANDLER,
+ ZEND_MOD_SPEC_TMPVARCV_CONST_HANDLER,
+ ZEND_MOD_SPEC_TMPVARCV_TMPVARCV_HANDLER,
+ ZEND_MOD_SPEC_TMPVARCV_TMPVARCV_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_MOD_SPEC_CV_CV_HANDLER,
+ ZEND_MOD_SPEC_TMPVARCV_TMPVARCV_HANDLER,
ZEND_SL_SPEC_CONST_CONST_HANDLER,
- ZEND_SL_SPEC_CONST_TMPVAR_HANDLER,
- ZEND_SL_SPEC_CONST_TMPVAR_HANDLER,
+ ZEND_SL_SPEC_CONST_TMPVARCV_HANDLER,
+ ZEND_SL_SPEC_CONST_TMPVARCV_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_SL_SPEC_CONST_CV_HANDLER,
- ZEND_SL_SPEC_TMPVAR_CONST_HANDLER,
- ZEND_SL_SPEC_TMPVAR_TMPVAR_HANDLER,
- ZEND_SL_SPEC_TMPVAR_TMPVAR_HANDLER,
+ ZEND_SL_SPEC_CONST_TMPVARCV_HANDLER,
+ ZEND_SL_SPEC_TMPVARCV_CONST_HANDLER,
+ ZEND_SL_SPEC_TMPVARCV_TMPVARCV_HANDLER,
+ ZEND_SL_SPEC_TMPVARCV_TMPVARCV_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_SL_SPEC_TMPVAR_CV_HANDLER,
- ZEND_SL_SPEC_TMPVAR_CONST_HANDLER,
- ZEND_SL_SPEC_TMPVAR_TMPVAR_HANDLER,
- ZEND_SL_SPEC_TMPVAR_TMPVAR_HANDLER,
+ ZEND_SL_SPEC_TMPVARCV_TMPVARCV_HANDLER,
+ ZEND_SL_SPEC_TMPVARCV_CONST_HANDLER,
+ ZEND_SL_SPEC_TMPVARCV_TMPVARCV_HANDLER,
+ ZEND_SL_SPEC_TMPVARCV_TMPVARCV_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_SL_SPEC_TMPVAR_CV_HANDLER,
+ ZEND_SL_SPEC_TMPVARCV_TMPVARCV_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_SL_SPEC_CV_CONST_HANDLER,
- ZEND_SL_SPEC_CV_TMPVAR_HANDLER,
- ZEND_SL_SPEC_CV_TMPVAR_HANDLER,
+ ZEND_SL_SPEC_TMPVARCV_CONST_HANDLER,
+ ZEND_SL_SPEC_TMPVARCV_TMPVARCV_HANDLER,
+ ZEND_SL_SPEC_TMPVARCV_TMPVARCV_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_SL_SPEC_CV_CV_HANDLER,
+ ZEND_SL_SPEC_TMPVARCV_TMPVARCV_HANDLER,
ZEND_SR_SPEC_CONST_CONST_HANDLER,
- ZEND_SR_SPEC_CONST_TMPVAR_HANDLER,
- ZEND_SR_SPEC_CONST_TMPVAR_HANDLER,
+ ZEND_SR_SPEC_CONST_TMPVARCV_HANDLER,
+ ZEND_SR_SPEC_CONST_TMPVARCV_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_SR_SPEC_CONST_CV_HANDLER,
- ZEND_SR_SPEC_TMPVAR_CONST_HANDLER,
- ZEND_SR_SPEC_TMPVAR_TMPVAR_HANDLER,
- ZEND_SR_SPEC_TMPVAR_TMPVAR_HANDLER,
+ ZEND_SR_SPEC_CONST_TMPVARCV_HANDLER,
+ ZEND_SR_SPEC_TMPVARCV_CONST_HANDLER,
+ ZEND_SR_SPEC_TMPVARCV_TMPVARCV_HANDLER,
+ ZEND_SR_SPEC_TMPVARCV_TMPVARCV_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_SR_SPEC_TMPVAR_CV_HANDLER,
- ZEND_SR_SPEC_TMPVAR_CONST_HANDLER,
- ZEND_SR_SPEC_TMPVAR_TMPVAR_HANDLER,
- ZEND_SR_SPEC_TMPVAR_TMPVAR_HANDLER,
+ ZEND_SR_SPEC_TMPVARCV_TMPVARCV_HANDLER,
+ ZEND_SR_SPEC_TMPVARCV_CONST_HANDLER,
+ ZEND_SR_SPEC_TMPVARCV_TMPVARCV_HANDLER,
+ ZEND_SR_SPEC_TMPVARCV_TMPVARCV_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_SR_SPEC_TMPVAR_CV_HANDLER,
+ ZEND_SR_SPEC_TMPVARCV_TMPVARCV_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_SR_SPEC_CV_CONST_HANDLER,
- ZEND_SR_SPEC_CV_TMPVAR_HANDLER,
- ZEND_SR_SPEC_CV_TMPVAR_HANDLER,
+ ZEND_SR_SPEC_TMPVARCV_CONST_HANDLER,
+ ZEND_SR_SPEC_TMPVARCV_TMPVARCV_HANDLER,
+ ZEND_SR_SPEC_TMPVARCV_TMPVARCV_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_SR_SPEC_CV_CV_HANDLER,
+ ZEND_SR_SPEC_TMPVARCV_TMPVARCV_HANDLER,
ZEND_NULL_HANDLER,
ZEND_CONCAT_SPEC_CONST_TMPVAR_HANDLER,
ZEND_CONCAT_SPEC_CONST_TMPVAR_HANDLER,
@@ -61150,76 +58067,101 @@ void zend_vm_init(void)
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_BW_OR_SPEC_TMPVARCV_CONST_HANDLER,
+ ZEND_BW_OR_SPEC_TMPVARCV_TMPVARCV_HANDLER,
+ ZEND_BW_OR_SPEC_TMPVARCV_TMPVARCV_HANDLER,
ZEND_NULL_HANDLER,
+ ZEND_BW_OR_SPEC_TMPVARCV_TMPVARCV_HANDLER,
+ ZEND_BW_OR_SPEC_TMPVARCV_CONST_HANDLER,
+ ZEND_BW_OR_SPEC_TMPVARCV_TMPVARCV_HANDLER,
+ ZEND_BW_OR_SPEC_TMPVARCV_TMPVARCV_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_BW_OR_SPEC_TMPVARCV_TMPVARCV_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
+ ZEND_BW_OR_SPEC_TMPVARCV_CONST_HANDLER,
+ ZEND_BW_OR_SPEC_TMPVARCV_TMPVARCV_HANDLER,
+ ZEND_BW_OR_SPEC_TMPVARCV_TMPVARCV_HANDLER,
ZEND_NULL_HANDLER,
+ ZEND_BW_OR_SPEC_TMPVARCV_TMPVARCV_HANDLER,
+ ZEND_BW_AND_SPEC_CONST_CONST_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_BW_OR_SPEC_CV_CONST_HANDLER,
- ZEND_BW_OR_SPEC_CV_TMPVAR_HANDLER,
- ZEND_BW_OR_SPEC_CV_TMPVAR_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_BW_OR_SPEC_CV_CV_HANDLER,
- ZEND_BW_AND_SPEC_CONST_CONST_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
+ ZEND_BW_AND_SPEC_TMPVARCV_CONST_HANDLER,
+ ZEND_BW_AND_SPEC_TMPVARCV_TMPVARCV_HANDLER,
+ ZEND_BW_AND_SPEC_TMPVARCV_TMPVARCV_HANDLER,
ZEND_NULL_HANDLER,
+ ZEND_BW_AND_SPEC_TMPVARCV_TMPVARCV_HANDLER,
+ ZEND_BW_AND_SPEC_TMPVARCV_CONST_HANDLER,
+ ZEND_BW_AND_SPEC_TMPVARCV_TMPVARCV_HANDLER,
+ ZEND_BW_AND_SPEC_TMPVARCV_TMPVARCV_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_BW_AND_SPEC_TMPVARCV_TMPVARCV_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_NULL_HANDLER,
ZEND_NULL_HANDLER,
+ ZEND_BW_AND_SPEC_TMPVARCV_CONST_HANDLER,
+ ZEND_BW_AND_SPEC_TMPVARCV_TMPVARCV_HANDLER,
+ ZEND_BW_AND_SPEC_TMPVARCV_TMPVARCV_HANDLER,
ZEND_NULL_HANDLER,
+ ZEND_BW_AND_SPEC_TMPVARCV_TMPVARCV_HANDLER,
+ ZEND_BW_XOR_SPEC_CONST_CONST_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_BW_AND_SPEC_CV_CONST_HANDLER,
- ZEND_BW_AND_SPEC_CV_TMPVAR_HANDLER,
- ZEND_BW_AND_SPEC_CV_TMPVAR_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_BW_AND_SPEC_CV_CV_HANDLER,
- ZEND_BW_XOR_SPEC_CONST_CONST_HANDLER,
+ ZEND_BW_XOR_SPEC_TMPVARCV_CONST_HANDLER,
+ ZEND_BW_XOR_SPEC_TMPVARCV_TMPVARCV_HANDLER,
+ ZEND_BW_XOR_SPEC_TMPVARCV_TMPVARCV_HANDLER,
+ ZEND_NULL_HANDLER,
+ ZEND_BW_XOR_SPEC_TMPVARCV_TMPVARCV_HANDLER,
+ ZEND_BW_XOR_SPEC_TMPVARCV_CONST_HANDLER,
+ ZEND_BW_XOR_SPEC_TMPVARCV_TMPVARCV_HANDLER,
+ ZEND_BW_XOR_SPEC_TMPVARCV_TMPVARCV_HANDLER,
+ ZEND_NULL_HANDLER,
+ ZEND_BW_XOR_SPEC_TMPVARCV_TMPVARCV_HANDLER,
ZEND_NULL_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_TMPVARCV_CONST_HANDLER,
+ ZEND_BW_XOR_SPEC_TMPVARCV_TMPVARCV_HANDLER,
+ ZEND_BW_XOR_SPEC_TMPVARCV_TMPVARCV_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_BW_XOR_SPEC_TMPVARCV_TMPVARCV_HANDLER,
+ ZEND_POW_SPEC_CONST_CONST_HANDLER,
+ ZEND_POW_SPEC_CONST_TMPVAR_HANDLER,
+ ZEND_POW_SPEC_CONST_TMPVAR_HANDLER,
+ ZEND_NULL_HANDLER,
+ ZEND_POW_SPEC_CONST_CV_HANDLER,
+ ZEND_POW_SPEC_TMPVAR_CONST_HANDLER,
+ ZEND_POW_SPEC_TMPVAR_TMPVAR_HANDLER,
+ ZEND_POW_SPEC_TMPVAR_TMPVAR_HANDLER,
ZEND_NULL_HANDLER,
+ ZEND_POW_SPEC_TMPVAR_CV_HANDLER,
+ ZEND_POW_SPEC_TMPVAR_CONST_HANDLER,
+ ZEND_POW_SPEC_TMPVAR_TMPVAR_HANDLER,
+ ZEND_POW_SPEC_TMPVAR_TMPVAR_HANDLER,
ZEND_NULL_HANDLER,
+ ZEND_POW_SPEC_TMPVAR_CV_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_BW_XOR_SPEC_CV_CONST_HANDLER,
- ZEND_BW_XOR_SPEC_CV_TMPVAR_HANDLER,
- ZEND_BW_XOR_SPEC_CV_TMPVAR_HANDLER,
+ ZEND_POW_SPEC_CV_CONST_HANDLER,
+ ZEND_POW_SPEC_CV_TMPVAR_HANDLER,
+ ZEND_POW_SPEC_CV_TMPVAR_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_BW_XOR_SPEC_CV_CV_HANDLER,
+ ZEND_POW_SPEC_CV_CV_HANDLER,
ZEND_BW_NOT_SPEC_CONST_HANDLER,
ZEND_BW_NOT_SPEC_TMPVAR_HANDLER,
ZEND_BW_NOT_SPEC_TMPVAR_HANDLER,
@@ -61306,125 +58248,44 @@ void zend_vm_init(void)
ZEND_NULL_HANDLER,
ZEND_IS_NOT_IDENTICAL_SPEC_CV_CV_HANDLER,
ZEND_IS_EQUAL_SPEC_CONST_CONST_HANDLER,
- ZEND_NULL_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_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_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_IS_EQUAL_SPEC_CV_CONST_HANDLER,
- ZEND_IS_EQUAL_SPEC_CV_TMPVAR_HANDLER,
- ZEND_IS_EQUAL_SPEC_CV_TMPVAR_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_IS_EQUAL_SPEC_CV_CV_HANDLER,
- ZEND_IS_NOT_EQUAL_SPEC_CONST_CONST_HANDLER,
- ZEND_NULL_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_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_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_IS_NOT_EQUAL_SPEC_CV_CONST_HANDLER,
- ZEND_IS_NOT_EQUAL_SPEC_CV_TMPVAR_HANDLER,
- ZEND_IS_NOT_EQUAL_SPEC_CV_TMPVAR_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_IS_NOT_EQUAL_SPEC_CV_CV_HANDLER,
- ZEND_IS_SMALLER_SPEC_CONST_CONST_HANDLER,
- ZEND_IS_SMALLER_SPEC_CONST_TMPVAR_HANDLER,
- ZEND_IS_SMALLER_SPEC_CONST_TMPVAR_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_IS_SMALLER_SPEC_CONST_CV_HANDLER,
- ZEND_IS_SMALLER_SPEC_TMPVAR_CONST_HANDLER,
- ZEND_IS_SMALLER_SPEC_TMPVAR_TMPVAR_HANDLER,
- ZEND_IS_SMALLER_SPEC_TMPVAR_TMPVAR_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_IS_SMALLER_SPEC_TMPVAR_CV_HANDLER,
- ZEND_IS_SMALLER_SPEC_TMPVAR_CONST_HANDLER,
- ZEND_IS_SMALLER_SPEC_TMPVAR_TMPVAR_HANDLER,
- ZEND_IS_SMALLER_SPEC_TMPVAR_TMPVAR_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_IS_SMALLER_SPEC_TMPVAR_CV_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_IS_SMALLER_SPEC_CV_CONST_HANDLER,
- ZEND_IS_SMALLER_SPEC_CV_TMPVAR_HANDLER,
- ZEND_IS_SMALLER_SPEC_CV_TMPVAR_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_IS_SMALLER_SPEC_CV_CV_HANDLER,
- ZEND_IS_SMALLER_OR_EQUAL_SPEC_CONST_CONST_HANDLER,
- ZEND_IS_SMALLER_OR_EQUAL_SPEC_CONST_TMPVAR_HANDLER,
- ZEND_IS_SMALLER_OR_EQUAL_SPEC_CONST_TMPVAR_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_IS_SMALLER_OR_EQUAL_SPEC_CONST_CV_HANDLER,
- ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVAR_CONST_HANDLER,
- ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVAR_TMPVAR_HANDLER,
- ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVAR_TMPVAR_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVAR_CV_HANDLER,
- ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVAR_CONST_HANDLER,
- ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVAR_TMPVAR_HANDLER,
- ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVAR_TMPVAR_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVAR_CV_HANDLER,
+ ZEND_IS_EQUAL_SPEC_CONST_CONST_HANDLER,
+ ZEND_IS_EQUAL_SPEC_CONST_CONST_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_IS_SMALLER_OR_EQUAL_SPEC_CV_CONST_HANDLER,
- ZEND_IS_SMALLER_OR_EQUAL_SPEC_CV_TMPVAR_HANDLER,
- ZEND_IS_SMALLER_OR_EQUAL_SPEC_CV_TMPVAR_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_IS_SMALLER_OR_EQUAL_SPEC_CV_CV_HANDLER,
- ZEND_CAST_SPEC_CONST_HANDLER,
- ZEND_CAST_SPEC_TMP_HANDLER,
- ZEND_CAST_SPEC_VAR_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_CAST_SPEC_CV_HANDLER,
- ZEND_QM_ASSIGN_SPEC_CONST_HANDLER,
- ZEND_QM_ASSIGN_SPEC_TMP_HANDLER,
- ZEND_QM_ASSIGN_SPEC_VAR_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_QM_ASSIGN_SPEC_CV_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
+ ZEND_IS_EQUAL_SPEC_TMPVAR_CONST_HANDLER,
+ ZEND_IS_EQUAL_SPEC_TMPVAR_CONST_JMPZ_HANDLER,
+ ZEND_IS_EQUAL_SPEC_TMPVAR_CONST_JMPNZ_HANDLER,
+ ZEND_IS_EQUAL_SPEC_TMPVAR_TMPVAR_HANDLER,
+ ZEND_IS_EQUAL_SPEC_TMPVAR_TMPVAR_JMPZ_HANDLER,
+ ZEND_IS_EQUAL_SPEC_TMPVAR_TMPVAR_JMPNZ_HANDLER,
+ ZEND_IS_EQUAL_SPEC_TMPVAR_TMPVAR_HANDLER,
+ ZEND_IS_EQUAL_SPEC_TMPVAR_TMPVAR_JMPZ_HANDLER,
+ ZEND_IS_EQUAL_SPEC_TMPVAR_TMPVAR_JMPNZ_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
+ ZEND_IS_EQUAL_SPEC_TMPVAR_CONST_HANDLER,
+ ZEND_IS_EQUAL_SPEC_TMPVAR_CONST_JMPZ_HANDLER,
+ ZEND_IS_EQUAL_SPEC_TMPVAR_CONST_JMPNZ_HANDLER,
+ ZEND_IS_EQUAL_SPEC_TMPVAR_TMPVAR_HANDLER,
+ ZEND_IS_EQUAL_SPEC_TMPVAR_TMPVAR_JMPZ_HANDLER,
+ ZEND_IS_EQUAL_SPEC_TMPVAR_TMPVAR_JMPNZ_HANDLER,
+ ZEND_IS_EQUAL_SPEC_TMPVAR_TMPVAR_HANDLER,
+ ZEND_IS_EQUAL_SPEC_TMPVAR_TMPVAR_JMPZ_HANDLER,
+ ZEND_IS_EQUAL_SPEC_TMPVAR_TMPVAR_JMPNZ_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
@@ -61445,58 +58306,61 @@ void zend_vm_init(void)
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_ASSIGN_ADD_SPEC_VAR_CONST_HANDLER,
- ZEND_ASSIGN_ADD_SPEC_VAR_CONST_DIM_HANDLER,
- ZEND_ASSIGN_ADD_SPEC_VAR_CONST_OBJ_HANDLER,
- ZEND_ASSIGN_ADD_SPEC_VAR_TMPVAR_HANDLER,
- ZEND_ASSIGN_ADD_SPEC_VAR_TMPVAR_DIM_HANDLER,
- ZEND_ASSIGN_ADD_SPEC_VAR_TMPVAR_OBJ_HANDLER,
- ZEND_ASSIGN_ADD_SPEC_VAR_TMPVAR_HANDLER,
- ZEND_ASSIGN_ADD_SPEC_VAR_TMPVAR_DIM_HANDLER,
- ZEND_ASSIGN_ADD_SPEC_VAR_TMPVAR_OBJ_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_ASSIGN_ADD_SPEC_VAR_UNUSED_DIM_HANDLER,
+ ZEND_IS_EQUAL_SPEC_CV_CONST_HANDLER,
+ ZEND_IS_EQUAL_SPEC_CV_CONST_JMPZ_HANDLER,
+ ZEND_IS_EQUAL_SPEC_CV_CONST_JMPNZ_HANDLER,
+ ZEND_IS_EQUAL_SPEC_CV_TMPVAR_HANDLER,
+ ZEND_IS_EQUAL_SPEC_CV_TMPVAR_JMPZ_HANDLER,
+ ZEND_IS_EQUAL_SPEC_CV_TMPVAR_JMPNZ_HANDLER,
+ ZEND_IS_EQUAL_SPEC_CV_TMPVAR_HANDLER,
+ ZEND_IS_EQUAL_SPEC_CV_TMPVAR_JMPZ_HANDLER,
+ ZEND_IS_EQUAL_SPEC_CV_TMPVAR_JMPNZ_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_ASSIGN_ADD_SPEC_VAR_CV_HANDLER,
- ZEND_ASSIGN_ADD_SPEC_VAR_CV_DIM_HANDLER,
- ZEND_ASSIGN_ADD_SPEC_VAR_CV_OBJ_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_ASSIGN_ADD_SPEC_UNUSED_CONST_OBJ_HANDLER,
+ ZEND_IS_EQUAL_SPEC_CV_CV_HANDLER,
+ ZEND_IS_EQUAL_SPEC_CV_CV_JMPZ_HANDLER,
+ ZEND_IS_EQUAL_SPEC_CV_CV_JMPNZ_HANDLER,
+ ZEND_IS_NOT_EQUAL_SPEC_CONST_CONST_HANDLER,
+ ZEND_IS_NOT_EQUAL_SPEC_CONST_CONST_HANDLER,
+ ZEND_IS_NOT_EQUAL_SPEC_CONST_CONST_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_ASSIGN_ADD_SPEC_UNUSED_TMPVAR_OBJ_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_ASSIGN_ADD_SPEC_UNUSED_TMPVAR_OBJ_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_ASSIGN_ADD_SPEC_UNUSED_CV_OBJ_HANDLER,
- ZEND_ASSIGN_ADD_SPEC_CV_CONST_HANDLER,
- ZEND_ASSIGN_ADD_SPEC_CV_CONST_DIM_HANDLER,
- ZEND_ASSIGN_ADD_SPEC_CV_CONST_OBJ_HANDLER,
- ZEND_ASSIGN_ADD_SPEC_CV_TMPVAR_HANDLER,
- ZEND_ASSIGN_ADD_SPEC_CV_TMPVAR_DIM_HANDLER,
- ZEND_ASSIGN_ADD_SPEC_CV_TMPVAR_OBJ_HANDLER,
- ZEND_ASSIGN_ADD_SPEC_CV_TMPVAR_HANDLER,
- ZEND_ASSIGN_ADD_SPEC_CV_TMPVAR_DIM_HANDLER,
- ZEND_ASSIGN_ADD_SPEC_CV_TMPVAR_OBJ_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_ASSIGN_ADD_SPEC_CV_UNUSED_DIM_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_ASSIGN_ADD_SPEC_CV_CV_HANDLER,
- ZEND_ASSIGN_ADD_SPEC_CV_CV_DIM_HANDLER,
- ZEND_ASSIGN_ADD_SPEC_CV_CV_OBJ_HANDLER,
ZEND_NULL_HANDLER,
+ ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_CONST_HANDLER,
+ ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_CONST_JMPZ_HANDLER,
+ ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_CONST_JMPNZ_HANDLER,
+ ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_TMPVAR_HANDLER,
+ ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_TMPVAR_JMPZ_HANDLER,
+ ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_TMPVAR_JMPNZ_HANDLER,
+ ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_TMPVAR_HANDLER,
+ ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_TMPVAR_JMPZ_HANDLER,
+ ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_TMPVAR_JMPNZ_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
+ ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_CONST_HANDLER,
+ ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_CONST_JMPZ_HANDLER,
+ ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_CONST_JMPNZ_HANDLER,
+ ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_TMPVAR_HANDLER,
+ ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_TMPVAR_JMPZ_HANDLER,
+ ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_TMPVAR_JMPNZ_HANDLER,
+ ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_TMPVAR_HANDLER,
+ ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_TMPVAR_JMPZ_HANDLER,
+ ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_TMPVAR_JMPNZ_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
@@ -61518,53 +58382,71 @@ void zend_vm_init(void)
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
+ ZEND_IS_NOT_EQUAL_SPEC_CV_CONST_HANDLER,
+ ZEND_IS_NOT_EQUAL_SPEC_CV_CONST_JMPZ_HANDLER,
+ ZEND_IS_NOT_EQUAL_SPEC_CV_CONST_JMPNZ_HANDLER,
+ ZEND_IS_NOT_EQUAL_SPEC_CV_TMPVAR_HANDLER,
+ ZEND_IS_NOT_EQUAL_SPEC_CV_TMPVAR_JMPZ_HANDLER,
+ ZEND_IS_NOT_EQUAL_SPEC_CV_TMPVAR_JMPNZ_HANDLER,
+ ZEND_IS_NOT_EQUAL_SPEC_CV_TMPVAR_HANDLER,
+ ZEND_IS_NOT_EQUAL_SPEC_CV_TMPVAR_JMPZ_HANDLER,
+ ZEND_IS_NOT_EQUAL_SPEC_CV_TMPVAR_JMPNZ_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_ASSIGN_SUB_SPEC_VAR_CONST_HANDLER,
- ZEND_ASSIGN_SUB_SPEC_VAR_CONST_DIM_HANDLER,
- ZEND_ASSIGN_SUB_SPEC_VAR_CONST_OBJ_HANDLER,
- ZEND_ASSIGN_SUB_SPEC_VAR_TMPVAR_HANDLER,
- ZEND_ASSIGN_SUB_SPEC_VAR_TMPVAR_DIM_HANDLER,
- ZEND_ASSIGN_SUB_SPEC_VAR_TMPVAR_OBJ_HANDLER,
- ZEND_ASSIGN_SUB_SPEC_VAR_TMPVAR_HANDLER,
- ZEND_ASSIGN_SUB_SPEC_VAR_TMPVAR_DIM_HANDLER,
- ZEND_ASSIGN_SUB_SPEC_VAR_TMPVAR_OBJ_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_ASSIGN_SUB_SPEC_VAR_UNUSED_DIM_HANDLER,
+ ZEND_IS_NOT_EQUAL_SPEC_CV_CV_HANDLER,
+ ZEND_IS_NOT_EQUAL_SPEC_CV_CV_JMPZ_HANDLER,
+ ZEND_IS_NOT_EQUAL_SPEC_CV_CV_JMPNZ_HANDLER,
+ ZEND_IS_SMALLER_SPEC_CONST_CONST_HANDLER,
+ ZEND_IS_SMALLER_SPEC_CONST_CONST_HANDLER,
+ ZEND_IS_SMALLER_SPEC_CONST_CONST_HANDLER,
+ ZEND_IS_SMALLER_SPEC_CONST_TMPVARCV_HANDLER,
+ ZEND_IS_SMALLER_SPEC_CONST_TMPVARCV_JMPZ_HANDLER,
+ ZEND_IS_SMALLER_SPEC_CONST_TMPVARCV_JMPNZ_HANDLER,
+ ZEND_IS_SMALLER_SPEC_CONST_TMPVARCV_HANDLER,
+ ZEND_IS_SMALLER_SPEC_CONST_TMPVARCV_JMPZ_HANDLER,
+ ZEND_IS_SMALLER_SPEC_CONST_TMPVARCV_JMPNZ_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_ASSIGN_SUB_SPEC_VAR_CV_HANDLER,
- ZEND_ASSIGN_SUB_SPEC_VAR_CV_DIM_HANDLER,
- ZEND_ASSIGN_SUB_SPEC_VAR_CV_OBJ_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_ASSIGN_SUB_SPEC_UNUSED_CONST_OBJ_HANDLER,
+ ZEND_IS_SMALLER_SPEC_CONST_TMPVARCV_HANDLER,
+ ZEND_IS_SMALLER_SPEC_CONST_TMPVARCV_JMPZ_HANDLER,
+ ZEND_IS_SMALLER_SPEC_CONST_TMPVARCV_JMPNZ_HANDLER,
+ ZEND_IS_SMALLER_SPEC_TMPVARCV_CONST_HANDLER,
+ ZEND_IS_SMALLER_SPEC_TMPVARCV_CONST_JMPZ_HANDLER,
+ ZEND_IS_SMALLER_SPEC_TMPVARCV_CONST_JMPNZ_HANDLER,
+ ZEND_IS_SMALLER_SPEC_TMPVARCV_TMPVARCV_HANDLER,
+ ZEND_IS_SMALLER_SPEC_TMPVARCV_TMPVARCV_JMPZ_HANDLER,
+ ZEND_IS_SMALLER_SPEC_TMPVARCV_TMPVARCV_JMPNZ_HANDLER,
+ ZEND_IS_SMALLER_SPEC_TMPVARCV_TMPVARCV_HANDLER,
+ ZEND_IS_SMALLER_SPEC_TMPVARCV_TMPVARCV_JMPZ_HANDLER,
+ ZEND_IS_SMALLER_SPEC_TMPVARCV_TMPVARCV_JMPNZ_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_ASSIGN_SUB_SPEC_UNUSED_TMPVAR_OBJ_HANDLER,
ZEND_NULL_HANDLER,
+ ZEND_IS_SMALLER_SPEC_TMPVARCV_TMPVARCV_HANDLER,
+ ZEND_IS_SMALLER_SPEC_TMPVARCV_TMPVARCV_JMPZ_HANDLER,
+ ZEND_IS_SMALLER_SPEC_TMPVARCV_TMPVARCV_JMPNZ_HANDLER,
+ ZEND_IS_SMALLER_SPEC_TMPVARCV_CONST_HANDLER,
+ ZEND_IS_SMALLER_SPEC_TMPVARCV_CONST_JMPZ_HANDLER,
+ ZEND_IS_SMALLER_SPEC_TMPVARCV_CONST_JMPNZ_HANDLER,
+ ZEND_IS_SMALLER_SPEC_TMPVARCV_TMPVARCV_HANDLER,
+ ZEND_IS_SMALLER_SPEC_TMPVARCV_TMPVARCV_JMPZ_HANDLER,
+ ZEND_IS_SMALLER_SPEC_TMPVARCV_TMPVARCV_JMPNZ_HANDLER,
+ ZEND_IS_SMALLER_SPEC_TMPVARCV_TMPVARCV_HANDLER,
+ ZEND_IS_SMALLER_SPEC_TMPVARCV_TMPVARCV_JMPZ_HANDLER,
+ ZEND_IS_SMALLER_SPEC_TMPVARCV_TMPVARCV_JMPNZ_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_ASSIGN_SUB_SPEC_UNUSED_TMPVAR_OBJ_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
+ ZEND_IS_SMALLER_SPEC_TMPVARCV_TMPVARCV_HANDLER,
+ ZEND_IS_SMALLER_SPEC_TMPVARCV_TMPVARCV_JMPZ_HANDLER,
+ ZEND_IS_SMALLER_SPEC_TMPVARCV_TMPVARCV_JMPNZ_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_ASSIGN_SUB_SPEC_UNUSED_CV_OBJ_HANDLER,
- ZEND_ASSIGN_SUB_SPEC_CV_CONST_HANDLER,
- ZEND_ASSIGN_SUB_SPEC_CV_CONST_DIM_HANDLER,
- ZEND_ASSIGN_SUB_SPEC_CV_CONST_OBJ_HANDLER,
- ZEND_ASSIGN_SUB_SPEC_CV_TMPVAR_HANDLER,
- ZEND_ASSIGN_SUB_SPEC_CV_TMPVAR_DIM_HANDLER,
- ZEND_ASSIGN_SUB_SPEC_CV_TMPVAR_OBJ_HANDLER,
- ZEND_ASSIGN_SUB_SPEC_CV_TMPVAR_HANDLER,
- ZEND_ASSIGN_SUB_SPEC_CV_TMPVAR_DIM_HANDLER,
- ZEND_ASSIGN_SUB_SPEC_CV_TMPVAR_OBJ_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_ASSIGN_SUB_SPEC_CV_UNUSED_DIM_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_ASSIGN_SUB_SPEC_CV_CV_HANDLER,
- ZEND_ASSIGN_SUB_SPEC_CV_CV_DIM_HANDLER,
- ZEND_ASSIGN_SUB_SPEC_CV_CV_OBJ_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
@@ -61575,18 +58457,66 @@ void zend_vm_init(void)
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
+ ZEND_IS_SMALLER_SPEC_TMPVARCV_CONST_HANDLER,
+ ZEND_IS_SMALLER_SPEC_TMPVARCV_CONST_JMPZ_HANDLER,
+ ZEND_IS_SMALLER_SPEC_TMPVARCV_CONST_JMPNZ_HANDLER,
+ ZEND_IS_SMALLER_SPEC_TMPVARCV_TMPVARCV_HANDLER,
+ ZEND_IS_SMALLER_SPEC_TMPVARCV_TMPVARCV_JMPZ_HANDLER,
+ ZEND_IS_SMALLER_SPEC_TMPVARCV_TMPVARCV_JMPNZ_HANDLER,
+ ZEND_IS_SMALLER_SPEC_TMPVARCV_TMPVARCV_HANDLER,
+ ZEND_IS_SMALLER_SPEC_TMPVARCV_TMPVARCV_JMPZ_HANDLER,
+ ZEND_IS_SMALLER_SPEC_TMPVARCV_TMPVARCV_JMPNZ_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
+ ZEND_IS_SMALLER_SPEC_TMPVARCV_TMPVARCV_HANDLER,
+ ZEND_IS_SMALLER_SPEC_TMPVARCV_TMPVARCV_JMPZ_HANDLER,
+ ZEND_IS_SMALLER_SPEC_TMPVARCV_TMPVARCV_JMPNZ_HANDLER,
+ ZEND_IS_SMALLER_OR_EQUAL_SPEC_CONST_CONST_HANDLER,
+ ZEND_IS_SMALLER_OR_EQUAL_SPEC_CONST_CONST_HANDLER,
+ ZEND_IS_SMALLER_OR_EQUAL_SPEC_CONST_CONST_HANDLER,
+ ZEND_IS_SMALLER_OR_EQUAL_SPEC_CONST_TMPVARCV_HANDLER,
+ ZEND_IS_SMALLER_OR_EQUAL_SPEC_CONST_TMPVARCV_JMPZ_HANDLER,
+ ZEND_IS_SMALLER_OR_EQUAL_SPEC_CONST_TMPVARCV_JMPNZ_HANDLER,
+ ZEND_IS_SMALLER_OR_EQUAL_SPEC_CONST_TMPVARCV_HANDLER,
+ ZEND_IS_SMALLER_OR_EQUAL_SPEC_CONST_TMPVARCV_JMPZ_HANDLER,
+ ZEND_IS_SMALLER_OR_EQUAL_SPEC_CONST_TMPVARCV_JMPNZ_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
+ ZEND_IS_SMALLER_OR_EQUAL_SPEC_CONST_TMPVARCV_HANDLER,
+ ZEND_IS_SMALLER_OR_EQUAL_SPEC_CONST_TMPVARCV_JMPZ_HANDLER,
+ ZEND_IS_SMALLER_OR_EQUAL_SPEC_CONST_TMPVARCV_JMPNZ_HANDLER,
+ ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_CONST_HANDLER,
+ ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_CONST_JMPZ_HANDLER,
+ ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_CONST_JMPNZ_HANDLER,
+ ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_TMPVARCV_HANDLER,
+ ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_TMPVARCV_JMPZ_HANDLER,
+ ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_TMPVARCV_JMPNZ_HANDLER,
+ ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_TMPVARCV_HANDLER,
+ ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_TMPVARCV_JMPZ_HANDLER,
+ ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_TMPVARCV_JMPNZ_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
+ ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_TMPVARCV_HANDLER,
+ ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_TMPVARCV_JMPZ_HANDLER,
+ ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_TMPVARCV_JMPNZ_HANDLER,
+ ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_CONST_HANDLER,
+ ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_CONST_JMPZ_HANDLER,
+ ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_CONST_JMPNZ_HANDLER,
+ ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_TMPVARCV_HANDLER,
+ ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_TMPVARCV_JMPZ_HANDLER,
+ ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_TMPVARCV_JMPNZ_HANDLER,
+ ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_TMPVARCV_HANDLER,
+ ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_TMPVARCV_JMPZ_HANDLER,
+ ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_TMPVARCV_JMPNZ_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
+ ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_TMPVARCV_HANDLER,
+ ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_TMPVARCV_JMPZ_HANDLER,
+ ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_TMPVARCV_JMPNZ_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
@@ -61595,51 +58525,33 @@ void zend_vm_init(void)
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_ASSIGN_MUL_SPEC_VAR_CONST_HANDLER,
- ZEND_ASSIGN_MUL_SPEC_VAR_CONST_DIM_HANDLER,
- ZEND_ASSIGN_MUL_SPEC_VAR_CONST_OBJ_HANDLER,
- ZEND_ASSIGN_MUL_SPEC_VAR_TMPVAR_HANDLER,
- ZEND_ASSIGN_MUL_SPEC_VAR_TMPVAR_DIM_HANDLER,
- ZEND_ASSIGN_MUL_SPEC_VAR_TMPVAR_OBJ_HANDLER,
- ZEND_ASSIGN_MUL_SPEC_VAR_TMPVAR_HANDLER,
- ZEND_ASSIGN_MUL_SPEC_VAR_TMPVAR_DIM_HANDLER,
- ZEND_ASSIGN_MUL_SPEC_VAR_TMPVAR_OBJ_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_ASSIGN_MUL_SPEC_VAR_UNUSED_DIM_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_ASSIGN_MUL_SPEC_VAR_CV_HANDLER,
- ZEND_ASSIGN_MUL_SPEC_VAR_CV_DIM_HANDLER,
- ZEND_ASSIGN_MUL_SPEC_VAR_CV_OBJ_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_ASSIGN_MUL_SPEC_UNUSED_CONST_OBJ_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_ASSIGN_MUL_SPEC_UNUSED_TMPVAR_OBJ_HANDLER,
ZEND_NULL_HANDLER,
+ ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_CONST_HANDLER,
+ ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_CONST_JMPZ_HANDLER,
+ ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_CONST_JMPNZ_HANDLER,
+ ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_TMPVARCV_HANDLER,
+ ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_TMPVARCV_JMPZ_HANDLER,
+ ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_TMPVARCV_JMPNZ_HANDLER,
+ ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_TMPVARCV_HANDLER,
+ ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_TMPVARCV_JMPZ_HANDLER,
+ ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_TMPVARCV_JMPNZ_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_ASSIGN_MUL_SPEC_UNUSED_TMPVAR_OBJ_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
+ ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_TMPVARCV_HANDLER,
+ ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_TMPVARCV_JMPZ_HANDLER,
+ ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_TMPVARCV_JMPNZ_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_ASSIGN_MUL_SPEC_UNUSED_CV_OBJ_HANDLER,
- ZEND_ASSIGN_MUL_SPEC_CV_CONST_HANDLER,
- ZEND_ASSIGN_MUL_SPEC_CV_CONST_DIM_HANDLER,
- ZEND_ASSIGN_MUL_SPEC_CV_CONST_OBJ_HANDLER,
- ZEND_ASSIGN_MUL_SPEC_CV_TMPVAR_HANDLER,
- ZEND_ASSIGN_MUL_SPEC_CV_TMPVAR_DIM_HANDLER,
- ZEND_ASSIGN_MUL_SPEC_CV_TMPVAR_OBJ_HANDLER,
- ZEND_ASSIGN_MUL_SPEC_CV_TMPVAR_HANDLER,
- ZEND_ASSIGN_MUL_SPEC_CV_TMPVAR_DIM_HANDLER,
- ZEND_ASSIGN_MUL_SPEC_CV_TMPVAR_OBJ_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_ASSIGN_MUL_SPEC_CV_UNUSED_DIM_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_ASSIGN_MUL_SPEC_CV_CV_HANDLER,
- ZEND_ASSIGN_MUL_SPEC_CV_CV_DIM_HANDLER,
- ZEND_ASSIGN_MUL_SPEC_CV_CV_OBJ_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
@@ -61655,8 +58567,16 @@ void zend_vm_init(void)
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
+ ZEND_ASSIGN_SPEC_VAR_CONST_RETVAL_UNUSED_HANDLER,
+ ZEND_ASSIGN_SPEC_VAR_CONST_RETVAL_USED_HANDLER,
+ ZEND_ASSIGN_SPEC_VAR_TMP_RETVAL_UNUSED_HANDLER,
+ ZEND_ASSIGN_SPEC_VAR_TMP_RETVAL_USED_HANDLER,
+ ZEND_ASSIGN_SPEC_VAR_VAR_RETVAL_UNUSED_HANDLER,
+ ZEND_ASSIGN_SPEC_VAR_VAR_RETVAL_USED_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
+ ZEND_ASSIGN_SPEC_VAR_CV_RETVAL_UNUSED_HANDLER,
+ ZEND_ASSIGN_SPEC_VAR_CV_RETVAL_USED_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
@@ -61667,54 +58587,32 @@ void zend_vm_init(void)
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
+ ZEND_ASSIGN_SPEC_CV_CONST_RETVAL_UNUSED_HANDLER,
+ ZEND_ASSIGN_SPEC_CV_CONST_RETVAL_USED_HANDLER,
+ ZEND_ASSIGN_SPEC_CV_TMP_RETVAL_UNUSED_HANDLER,
+ ZEND_ASSIGN_SPEC_CV_TMP_RETVAL_USED_HANDLER,
+ ZEND_ASSIGN_SPEC_CV_VAR_RETVAL_UNUSED_HANDLER,
+ ZEND_ASSIGN_SPEC_CV_VAR_RETVAL_USED_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
+ ZEND_ASSIGN_SPEC_CV_CV_RETVAL_UNUSED_HANDLER,
+ ZEND_ASSIGN_SPEC_CV_CV_RETVAL_USED_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_ASSIGN_DIV_SPEC_VAR_CONST_HANDLER,
- ZEND_ASSIGN_DIV_SPEC_VAR_CONST_DIM_HANDLER,
- ZEND_ASSIGN_DIV_SPEC_VAR_CONST_OBJ_HANDLER,
- ZEND_ASSIGN_DIV_SPEC_VAR_TMPVAR_HANDLER,
- ZEND_ASSIGN_DIV_SPEC_VAR_TMPVAR_DIM_HANDLER,
- ZEND_ASSIGN_DIV_SPEC_VAR_TMPVAR_OBJ_HANDLER,
- ZEND_ASSIGN_DIV_SPEC_VAR_TMPVAR_HANDLER,
- ZEND_ASSIGN_DIV_SPEC_VAR_TMPVAR_DIM_HANDLER,
- ZEND_ASSIGN_DIV_SPEC_VAR_TMPVAR_OBJ_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_ASSIGN_DIV_SPEC_VAR_UNUSED_DIM_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_ASSIGN_DIV_SPEC_VAR_CV_HANDLER,
- ZEND_ASSIGN_DIV_SPEC_VAR_CV_DIM_HANDLER,
- ZEND_ASSIGN_DIV_SPEC_VAR_CV_OBJ_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_ASSIGN_DIV_SPEC_UNUSED_CONST_OBJ_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_ASSIGN_DIV_SPEC_UNUSED_TMPVAR_OBJ_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_ASSIGN_DIV_SPEC_UNUSED_TMPVAR_OBJ_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_ASSIGN_DIV_SPEC_UNUSED_CV_OBJ_HANDLER,
- ZEND_ASSIGN_DIV_SPEC_CV_CONST_HANDLER,
- ZEND_ASSIGN_DIV_SPEC_CV_CONST_DIM_HANDLER,
- ZEND_ASSIGN_DIV_SPEC_CV_CONST_OBJ_HANDLER,
- ZEND_ASSIGN_DIV_SPEC_CV_TMPVAR_HANDLER,
- ZEND_ASSIGN_DIV_SPEC_CV_TMPVAR_DIM_HANDLER,
- ZEND_ASSIGN_DIV_SPEC_CV_TMPVAR_OBJ_HANDLER,
- ZEND_ASSIGN_DIV_SPEC_CV_TMPVAR_HANDLER,
- ZEND_ASSIGN_DIV_SPEC_CV_TMPVAR_DIM_HANDLER,
- ZEND_ASSIGN_DIV_SPEC_CV_TMPVAR_OBJ_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_ASSIGN_DIV_SPEC_CV_UNUSED_DIM_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_ASSIGN_DIV_SPEC_CV_CV_HANDLER,
- ZEND_ASSIGN_DIV_SPEC_CV_CV_DIM_HANDLER,
- ZEND_ASSIGN_DIV_SPEC_CV_CV_OBJ_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
@@ -61745,51 +58643,41 @@ void zend_vm_init(void)
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_ASSIGN_MOD_SPEC_VAR_CONST_HANDLER,
- ZEND_ASSIGN_MOD_SPEC_VAR_CONST_DIM_HANDLER,
- ZEND_ASSIGN_MOD_SPEC_VAR_CONST_OBJ_HANDLER,
- ZEND_ASSIGN_MOD_SPEC_VAR_TMPVAR_HANDLER,
- ZEND_ASSIGN_MOD_SPEC_VAR_TMPVAR_DIM_HANDLER,
- ZEND_ASSIGN_MOD_SPEC_VAR_TMPVAR_OBJ_HANDLER,
- ZEND_ASSIGN_MOD_SPEC_VAR_TMPVAR_HANDLER,
- ZEND_ASSIGN_MOD_SPEC_VAR_TMPVAR_DIM_HANDLER,
- ZEND_ASSIGN_MOD_SPEC_VAR_TMPVAR_OBJ_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_ASSIGN_MOD_SPEC_VAR_UNUSED_DIM_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_ASSIGN_MOD_SPEC_VAR_CV_HANDLER,
- ZEND_ASSIGN_MOD_SPEC_VAR_CV_DIM_HANDLER,
- ZEND_ASSIGN_MOD_SPEC_VAR_CV_OBJ_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_ASSIGN_MOD_SPEC_UNUSED_CONST_OBJ_HANDLER,
+ ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_DATA_CONST_HANDLER,
+ ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_DATA_TMP_HANDLER,
+ ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_DATA_VAR_HANDLER,
ZEND_NULL_HANDLER,
+ ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_DATA_CV_HANDLER,
+ ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_DATA_CONST_HANDLER,
+ ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_DATA_TMP_HANDLER,
+ ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_DATA_VAR_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_ASSIGN_MOD_SPEC_UNUSED_TMPVAR_OBJ_HANDLER,
+ ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_DATA_CV_HANDLER,
+ ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_DATA_CONST_HANDLER,
+ ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_DATA_TMP_HANDLER,
+ ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_DATA_VAR_HANDLER,
ZEND_NULL_HANDLER,
+ ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_DATA_CV_HANDLER,
+ ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_DATA_CONST_HANDLER,
+ ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_DATA_TMP_HANDLER,
+ ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_DATA_VAR_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_ASSIGN_MOD_SPEC_UNUSED_TMPVAR_OBJ_HANDLER,
+ ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_DATA_CV_HANDLER,
+ ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA_CONST_HANDLER,
+ ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA_TMP_HANDLER,
+ ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA_VAR_HANDLER,
ZEND_NULL_HANDLER,
+ ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA_CV_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_ASSIGN_MOD_SPEC_UNUSED_CV_OBJ_HANDLER,
- ZEND_ASSIGN_MOD_SPEC_CV_CONST_HANDLER,
- ZEND_ASSIGN_MOD_SPEC_CV_CONST_DIM_HANDLER,
- ZEND_ASSIGN_MOD_SPEC_CV_CONST_OBJ_HANDLER,
- ZEND_ASSIGN_MOD_SPEC_CV_TMPVAR_HANDLER,
- ZEND_ASSIGN_MOD_SPEC_CV_TMPVAR_DIM_HANDLER,
- ZEND_ASSIGN_MOD_SPEC_CV_TMPVAR_OBJ_HANDLER,
- ZEND_ASSIGN_MOD_SPEC_CV_TMPVAR_HANDLER,
- ZEND_ASSIGN_MOD_SPEC_CV_TMPVAR_DIM_HANDLER,
- ZEND_ASSIGN_MOD_SPEC_CV_TMPVAR_OBJ_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_ASSIGN_MOD_SPEC_CV_UNUSED_DIM_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_ASSIGN_MOD_SPEC_CV_CV_HANDLER,
- ZEND_ASSIGN_MOD_SPEC_CV_CV_DIM_HANDLER,
- ZEND_ASSIGN_MOD_SPEC_CV_CV_OBJ_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
@@ -61809,62 +58697,52 @@ void zend_vm_init(void)
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
+ ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DATA_CONST_HANDLER,
+ ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DATA_TMP_HANDLER,
+ ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DATA_VAR_HANDLER,
ZEND_NULL_HANDLER,
+ ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DATA_CV_HANDLER,
+ ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_DATA_CONST_HANDLER,
+ ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_DATA_TMP_HANDLER,
+ ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_DATA_VAR_HANDLER,
ZEND_NULL_HANDLER,
+ ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_DATA_CV_HANDLER,
+ ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_DATA_CONST_HANDLER,
+ ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_DATA_TMP_HANDLER,
+ ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_DATA_VAR_HANDLER,
ZEND_NULL_HANDLER,
+ ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_DATA_CV_HANDLER,
+ ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_DATA_CONST_HANDLER,
+ ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_DATA_TMP_HANDLER,
+ ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_DATA_VAR_HANDLER,
ZEND_NULL_HANDLER,
+ ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_DATA_CV_HANDLER,
+ ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_CONST_HANDLER,
+ ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_TMP_HANDLER,
+ ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_VAR_HANDLER,
ZEND_NULL_HANDLER,
+ ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_CV_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_ASSIGN_SL_SPEC_VAR_CONST_HANDLER,
- ZEND_ASSIGN_SL_SPEC_VAR_CONST_DIM_HANDLER,
- ZEND_ASSIGN_SL_SPEC_VAR_CONST_OBJ_HANDLER,
- ZEND_ASSIGN_SL_SPEC_VAR_TMPVAR_HANDLER,
- ZEND_ASSIGN_SL_SPEC_VAR_TMPVAR_DIM_HANDLER,
- ZEND_ASSIGN_SL_SPEC_VAR_TMPVAR_OBJ_HANDLER,
- ZEND_ASSIGN_SL_SPEC_VAR_TMPVAR_HANDLER,
- ZEND_ASSIGN_SL_SPEC_VAR_TMPVAR_DIM_HANDLER,
- ZEND_ASSIGN_SL_SPEC_VAR_TMPVAR_OBJ_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_ASSIGN_SL_SPEC_VAR_UNUSED_DIM_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_ASSIGN_SL_SPEC_VAR_CV_HANDLER,
- ZEND_ASSIGN_SL_SPEC_VAR_CV_DIM_HANDLER,
- ZEND_ASSIGN_SL_SPEC_VAR_CV_OBJ_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_ASSIGN_SL_SPEC_UNUSED_CONST_OBJ_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_ASSIGN_SL_SPEC_UNUSED_TMPVAR_OBJ_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_ASSIGN_SL_SPEC_UNUSED_TMPVAR_OBJ_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_ASSIGN_SL_SPEC_UNUSED_CV_OBJ_HANDLER,
- ZEND_ASSIGN_SL_SPEC_CV_CONST_HANDLER,
- ZEND_ASSIGN_SL_SPEC_CV_CONST_DIM_HANDLER,
- ZEND_ASSIGN_SL_SPEC_CV_CONST_OBJ_HANDLER,
- ZEND_ASSIGN_SL_SPEC_CV_TMPVAR_HANDLER,
- ZEND_ASSIGN_SL_SPEC_CV_TMPVAR_DIM_HANDLER,
- ZEND_ASSIGN_SL_SPEC_CV_TMPVAR_OBJ_HANDLER,
- ZEND_ASSIGN_SL_SPEC_CV_TMPVAR_HANDLER,
- ZEND_ASSIGN_SL_SPEC_CV_TMPVAR_DIM_HANDLER,
- ZEND_ASSIGN_SL_SPEC_CV_TMPVAR_OBJ_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_ASSIGN_SL_SPEC_CV_UNUSED_DIM_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_ASSIGN_SL_SPEC_CV_CV_HANDLER,
- ZEND_ASSIGN_SL_SPEC_CV_CV_DIM_HANDLER,
- ZEND_ASSIGN_SL_SPEC_CV_CV_OBJ_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
@@ -61894,64 +58772,86 @@ void zend_vm_init(void)
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
+ ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_DATA_CONST_HANDLER,
+ ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_DATA_TMP_HANDLER,
+ ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_DATA_VAR_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_ASSIGN_SR_SPEC_VAR_CONST_HANDLER,
- ZEND_ASSIGN_SR_SPEC_VAR_CONST_DIM_HANDLER,
- ZEND_ASSIGN_SR_SPEC_VAR_CONST_OBJ_HANDLER,
- ZEND_ASSIGN_SR_SPEC_VAR_TMPVAR_HANDLER,
- ZEND_ASSIGN_SR_SPEC_VAR_TMPVAR_DIM_HANDLER,
- ZEND_ASSIGN_SR_SPEC_VAR_TMPVAR_OBJ_HANDLER,
- ZEND_ASSIGN_SR_SPEC_VAR_TMPVAR_HANDLER,
- ZEND_ASSIGN_SR_SPEC_VAR_TMPVAR_DIM_HANDLER,
- ZEND_ASSIGN_SR_SPEC_VAR_TMPVAR_OBJ_HANDLER,
+ ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_DATA_CV_HANDLER,
+ ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_DATA_CONST_HANDLER,
+ ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_DATA_TMP_HANDLER,
+ ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_DATA_VAR_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_ASSIGN_SR_SPEC_VAR_UNUSED_DIM_HANDLER,
+ ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_DATA_CV_HANDLER,
+ ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_DATA_CONST_HANDLER,
+ ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_DATA_TMP_HANDLER,
+ ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_DATA_VAR_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_ASSIGN_SR_SPEC_VAR_CV_HANDLER,
- ZEND_ASSIGN_SR_SPEC_VAR_CV_DIM_HANDLER,
- ZEND_ASSIGN_SR_SPEC_VAR_CV_OBJ_HANDLER,
+ ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_DATA_CV_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_ASSIGN_SR_SPEC_UNUSED_CONST_OBJ_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_ASSIGN_SR_SPEC_UNUSED_TMPVAR_OBJ_HANDLER,
ZEND_NULL_HANDLER,
+ ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA_CONST_HANDLER,
+ ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA_TMP_HANDLER,
+ ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA_VAR_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_ASSIGN_SR_SPEC_UNUSED_TMPVAR_OBJ_HANDLER,
+ ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA_CV_HANDLER,
+ ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_OP_DATA_CONST_HANDLER,
+ ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_OP_DATA_TMP_HANDLER,
+ ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_OP_DATA_VAR_HANDLER,
ZEND_NULL_HANDLER,
+ ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_OP_DATA_CV_HANDLER,
+ ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_OP_DATA_CONST_HANDLER,
+ ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_OP_DATA_TMP_HANDLER,
+ ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_OP_DATA_VAR_HANDLER,
ZEND_NULL_HANDLER,
+ ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_OP_DATA_CV_HANDLER,
+ ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_OP_DATA_CONST_HANDLER,
+ ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_OP_DATA_TMP_HANDLER,
+ ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_OP_DATA_VAR_HANDLER,
ZEND_NULL_HANDLER,
+ ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_OP_DATA_CV_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_ASSIGN_SR_SPEC_UNUSED_CV_OBJ_HANDLER,
- ZEND_ASSIGN_SR_SPEC_CV_CONST_HANDLER,
- ZEND_ASSIGN_SR_SPEC_CV_CONST_DIM_HANDLER,
- ZEND_ASSIGN_SR_SPEC_CV_CONST_OBJ_HANDLER,
- ZEND_ASSIGN_SR_SPEC_CV_TMPVAR_HANDLER,
- ZEND_ASSIGN_SR_SPEC_CV_TMPVAR_DIM_HANDLER,
- ZEND_ASSIGN_SR_SPEC_CV_TMPVAR_OBJ_HANDLER,
- ZEND_ASSIGN_SR_SPEC_CV_TMPVAR_HANDLER,
- ZEND_ASSIGN_SR_SPEC_CV_TMPVAR_DIM_HANDLER,
- ZEND_ASSIGN_SR_SPEC_CV_TMPVAR_OBJ_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_ASSIGN_SR_SPEC_CV_UNUSED_DIM_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_ASSIGN_SR_SPEC_CV_CV_HANDLER,
- ZEND_ASSIGN_SR_SPEC_CV_CV_DIM_HANDLER,
- ZEND_ASSIGN_SR_SPEC_CV_CV_OBJ_HANDLER,
ZEND_NULL_HANDLER,
+ ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_DATA_CONST_HANDLER,
+ ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_DATA_TMP_HANDLER,
+ ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_DATA_VAR_HANDLER,
ZEND_NULL_HANDLER,
+ ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_DATA_CV_HANDLER,
+ ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DATA_CONST_HANDLER,
+ ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DATA_TMP_HANDLER,
+ ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DATA_VAR_HANDLER,
ZEND_NULL_HANDLER,
+ ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DATA_CV_HANDLER,
+ ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_DATA_CONST_HANDLER,
+ ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_DATA_TMP_HANDLER,
+ ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_DATA_VAR_HANDLER,
ZEND_NULL_HANDLER,
+ ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_DATA_CV_HANDLER,
+ ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_DATA_CONST_HANDLER,
+ ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_DATA_TMP_HANDLER,
+ ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_DATA_VAR_HANDLER,
ZEND_NULL_HANDLER,
+ ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_DATA_CV_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
+ ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_CONST_HANDLER,
+ ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_TMP_HANDLER,
+ ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_VAR_HANDLER,
ZEND_NULL_HANDLER,
+ ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_CV_HANDLER,
+ ZEND_ASSIGN_STATIC_PROP_SPEC_OP_DATA_CONST_HANDLER,
+ ZEND_ASSIGN_STATIC_PROP_SPEC_OP_DATA_TMP_HANDLER,
+ ZEND_ASSIGN_STATIC_PROP_SPEC_OP_DATA_VAR_HANDLER,
ZEND_NULL_HANDLER,
+ ZEND_ASSIGN_STATIC_PROP_SPEC_OP_DATA_CV_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
@@ -61962,59 +58862,47 @@ void zend_vm_init(void)
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
+ ZEND_ASSIGN_OP_SPEC_VAR_CONST_HANDLER,
+ ZEND_ASSIGN_OP_SPEC_VAR_TMPVAR_HANDLER,
+ ZEND_ASSIGN_OP_SPEC_VAR_TMPVAR_HANDLER,
ZEND_NULL_HANDLER,
+ ZEND_ASSIGN_OP_SPEC_VAR_CV_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
+ ZEND_ASSIGN_OP_SPEC_CV_CONST_HANDLER,
+ ZEND_ASSIGN_OP_SPEC_CV_TMPVAR_HANDLER,
+ ZEND_ASSIGN_OP_SPEC_CV_TMPVAR_HANDLER,
ZEND_NULL_HANDLER,
+ ZEND_ASSIGN_OP_SPEC_CV_CV_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_ASSIGN_CONCAT_SPEC_VAR_CONST_HANDLER,
- ZEND_ASSIGN_CONCAT_SPEC_VAR_CONST_DIM_HANDLER,
- ZEND_ASSIGN_CONCAT_SPEC_VAR_CONST_OBJ_HANDLER,
- ZEND_ASSIGN_CONCAT_SPEC_VAR_TMPVAR_HANDLER,
- ZEND_ASSIGN_CONCAT_SPEC_VAR_TMPVAR_DIM_HANDLER,
- ZEND_ASSIGN_CONCAT_SPEC_VAR_TMPVAR_OBJ_HANDLER,
- ZEND_ASSIGN_CONCAT_SPEC_VAR_TMPVAR_HANDLER,
- ZEND_ASSIGN_CONCAT_SPEC_VAR_TMPVAR_DIM_HANDLER,
- ZEND_ASSIGN_CONCAT_SPEC_VAR_TMPVAR_OBJ_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_ASSIGN_CONCAT_SPEC_VAR_UNUSED_DIM_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_ASSIGN_CONCAT_SPEC_VAR_CV_HANDLER,
- ZEND_ASSIGN_CONCAT_SPEC_VAR_CV_DIM_HANDLER,
- ZEND_ASSIGN_CONCAT_SPEC_VAR_CV_OBJ_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_ASSIGN_CONCAT_SPEC_UNUSED_CONST_OBJ_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_ASSIGN_CONCAT_SPEC_UNUSED_TMPVAR_OBJ_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_ASSIGN_CONCAT_SPEC_UNUSED_TMPVAR_OBJ_HANDLER,
ZEND_NULL_HANDLER,
+ ZEND_ASSIGN_DIM_OP_SPEC_VAR_CONST_HANDLER,
+ ZEND_ASSIGN_DIM_OP_SPEC_VAR_TMPVAR_HANDLER,
+ ZEND_ASSIGN_DIM_OP_SPEC_VAR_TMPVAR_HANDLER,
+ ZEND_ASSIGN_DIM_OP_SPEC_VAR_UNUSED_HANDLER,
+ ZEND_ASSIGN_DIM_OP_SPEC_VAR_CV_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_ASSIGN_CONCAT_SPEC_UNUSED_CV_OBJ_HANDLER,
- ZEND_ASSIGN_CONCAT_SPEC_CV_CONST_HANDLER,
- ZEND_ASSIGN_CONCAT_SPEC_CV_CONST_DIM_HANDLER,
- ZEND_ASSIGN_CONCAT_SPEC_CV_CONST_OBJ_HANDLER,
- ZEND_ASSIGN_CONCAT_SPEC_CV_TMPVAR_HANDLER,
- ZEND_ASSIGN_CONCAT_SPEC_CV_TMPVAR_DIM_HANDLER,
- ZEND_ASSIGN_CONCAT_SPEC_CV_TMPVAR_OBJ_HANDLER,
- ZEND_ASSIGN_CONCAT_SPEC_CV_TMPVAR_HANDLER,
- ZEND_ASSIGN_CONCAT_SPEC_CV_TMPVAR_DIM_HANDLER,
- ZEND_ASSIGN_CONCAT_SPEC_CV_TMPVAR_OBJ_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_ASSIGN_CONCAT_SPEC_CV_UNUSED_DIM_HANDLER,
+ ZEND_ASSIGN_DIM_OP_SPEC_CV_CONST_HANDLER,
+ ZEND_ASSIGN_DIM_OP_SPEC_CV_TMPVAR_HANDLER,
+ ZEND_ASSIGN_DIM_OP_SPEC_CV_TMPVAR_HANDLER,
+ ZEND_ASSIGN_DIM_OP_SPEC_CV_UNUSED_HANDLER,
+ ZEND_ASSIGN_DIM_OP_SPEC_CV_CV_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_ASSIGN_CONCAT_SPEC_CV_CV_HANDLER,
- ZEND_ASSIGN_CONCAT_SPEC_CV_CV_DIM_HANDLER,
- ZEND_ASSIGN_CONCAT_SPEC_CV_CV_OBJ_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
@@ -62024,9 +58912,22 @@ void zend_vm_init(void)
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
+ ZEND_ASSIGN_OBJ_OP_SPEC_VAR_CONST_HANDLER,
+ ZEND_ASSIGN_OBJ_OP_SPEC_VAR_TMPVAR_HANDLER,
+ ZEND_ASSIGN_OBJ_OP_SPEC_VAR_TMPVAR_HANDLER,
ZEND_NULL_HANDLER,
+ ZEND_ASSIGN_OBJ_OP_SPEC_VAR_CV_HANDLER,
+ ZEND_ASSIGN_OBJ_OP_SPEC_UNUSED_CONST_HANDLER,
+ ZEND_ASSIGN_OBJ_OP_SPEC_UNUSED_TMPVAR_HANDLER,
+ ZEND_ASSIGN_OBJ_OP_SPEC_UNUSED_TMPVAR_HANDLER,
ZEND_NULL_HANDLER,
+ ZEND_ASSIGN_OBJ_OP_SPEC_UNUSED_CV_HANDLER,
+ ZEND_ASSIGN_OBJ_OP_SPEC_CV_CONST_HANDLER,
+ ZEND_ASSIGN_OBJ_OP_SPEC_CV_TMPVAR_HANDLER,
+ ZEND_ASSIGN_OBJ_OP_SPEC_CV_TMPVAR_HANDLER,
ZEND_NULL_HANDLER,
+ ZEND_ASSIGN_OBJ_OP_SPEC_CV_CV_HANDLER,
+ ZEND_ASSIGN_STATIC_PROP_OP_SPEC_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
@@ -62039,57 +58940,35 @@ void zend_vm_init(void)
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
+ ZEND_ASSIGN_REF_SPEC_VAR_VAR_HANDLER,
ZEND_NULL_HANDLER,
+ ZEND_ASSIGN_REF_SPEC_VAR_CV_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_ASSIGN_BW_OR_SPEC_VAR_CONST_HANDLER,
- ZEND_ASSIGN_BW_OR_SPEC_VAR_CONST_DIM_HANDLER,
- ZEND_ASSIGN_BW_OR_SPEC_VAR_CONST_OBJ_HANDLER,
- ZEND_ASSIGN_BW_OR_SPEC_VAR_TMPVAR_HANDLER,
- ZEND_ASSIGN_BW_OR_SPEC_VAR_TMPVAR_DIM_HANDLER,
- ZEND_ASSIGN_BW_OR_SPEC_VAR_TMPVAR_OBJ_HANDLER,
- ZEND_ASSIGN_BW_OR_SPEC_VAR_TMPVAR_HANDLER,
- ZEND_ASSIGN_BW_OR_SPEC_VAR_TMPVAR_DIM_HANDLER,
- ZEND_ASSIGN_BW_OR_SPEC_VAR_TMPVAR_OBJ_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_ASSIGN_BW_OR_SPEC_VAR_UNUSED_DIM_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_ASSIGN_BW_OR_SPEC_VAR_CV_HANDLER,
- ZEND_ASSIGN_BW_OR_SPEC_VAR_CV_DIM_HANDLER,
- ZEND_ASSIGN_BW_OR_SPEC_VAR_CV_OBJ_HANDLER,
+ ZEND_ASSIGN_REF_SPEC_CV_VAR_HANDLER,
ZEND_NULL_HANDLER,
+ ZEND_ASSIGN_REF_SPEC_CV_CV_HANDLER,
+ ZEND_QM_ASSIGN_SPEC_CONST_HANDLER,
+ ZEND_QM_ASSIGN_SPEC_TMP_HANDLER,
+ ZEND_QM_ASSIGN_SPEC_VAR_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_ASSIGN_BW_OR_SPEC_UNUSED_CONST_OBJ_HANDLER,
+ ZEND_QM_ASSIGN_SPEC_CV_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_ASSIGN_BW_OR_SPEC_UNUSED_TMPVAR_OBJ_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_ASSIGN_BW_OR_SPEC_UNUSED_TMPVAR_OBJ_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_ASSIGN_BW_OR_SPEC_UNUSED_CV_OBJ_HANDLER,
- ZEND_ASSIGN_BW_OR_SPEC_CV_CONST_HANDLER,
- ZEND_ASSIGN_BW_OR_SPEC_CV_CONST_DIM_HANDLER,
- ZEND_ASSIGN_BW_OR_SPEC_CV_CONST_OBJ_HANDLER,
- ZEND_ASSIGN_BW_OR_SPEC_CV_TMPVAR_HANDLER,
- ZEND_ASSIGN_BW_OR_SPEC_CV_TMPVAR_DIM_HANDLER,
- ZEND_ASSIGN_BW_OR_SPEC_CV_TMPVAR_OBJ_HANDLER,
- ZEND_ASSIGN_BW_OR_SPEC_CV_TMPVAR_HANDLER,
- ZEND_ASSIGN_BW_OR_SPEC_CV_TMPVAR_DIM_HANDLER,
- ZEND_ASSIGN_BW_OR_SPEC_CV_TMPVAR_OBJ_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_ASSIGN_BW_OR_SPEC_CV_UNUSED_DIM_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_ASSIGN_BW_OR_SPEC_CV_CV_HANDLER,
- ZEND_ASSIGN_BW_OR_SPEC_CV_CV_DIM_HANDLER,
- ZEND_ASSIGN_BW_OR_SPEC_CV_CV_OBJ_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
@@ -62120,54 +58999,30 @@ void zend_vm_init(void)
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_ASSIGN_BW_AND_SPEC_VAR_CONST_HANDLER,
- ZEND_ASSIGN_BW_AND_SPEC_VAR_CONST_DIM_HANDLER,
- ZEND_ASSIGN_BW_AND_SPEC_VAR_CONST_OBJ_HANDLER,
- ZEND_ASSIGN_BW_AND_SPEC_VAR_TMPVAR_HANDLER,
- ZEND_ASSIGN_BW_AND_SPEC_VAR_TMPVAR_DIM_HANDLER,
- ZEND_ASSIGN_BW_AND_SPEC_VAR_TMPVAR_OBJ_HANDLER,
- ZEND_ASSIGN_BW_AND_SPEC_VAR_TMPVAR_HANDLER,
- ZEND_ASSIGN_BW_AND_SPEC_VAR_TMPVAR_DIM_HANDLER,
- ZEND_ASSIGN_BW_AND_SPEC_VAR_TMPVAR_OBJ_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_ASSIGN_BW_AND_SPEC_VAR_UNUSED_DIM_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_ASSIGN_BW_AND_SPEC_VAR_CV_HANDLER,
- ZEND_ASSIGN_BW_AND_SPEC_VAR_CV_DIM_HANDLER,
- ZEND_ASSIGN_BW_AND_SPEC_VAR_CV_OBJ_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_ASSIGN_BW_AND_SPEC_UNUSED_CONST_OBJ_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_ASSIGN_BW_AND_SPEC_UNUSED_TMPVAR_OBJ_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_ASSIGN_BW_AND_SPEC_UNUSED_TMPVAR_OBJ_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
+ ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_OP_DATA_VAR_HANDLER,
ZEND_NULL_HANDLER,
+ ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_OP_DATA_CV_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_ASSIGN_BW_AND_SPEC_UNUSED_CV_OBJ_HANDLER,
- ZEND_ASSIGN_BW_AND_SPEC_CV_CONST_HANDLER,
- ZEND_ASSIGN_BW_AND_SPEC_CV_CONST_DIM_HANDLER,
- ZEND_ASSIGN_BW_AND_SPEC_CV_CONST_OBJ_HANDLER,
- ZEND_ASSIGN_BW_AND_SPEC_CV_TMPVAR_HANDLER,
- ZEND_ASSIGN_BW_AND_SPEC_CV_TMPVAR_DIM_HANDLER,
- ZEND_ASSIGN_BW_AND_SPEC_CV_TMPVAR_OBJ_HANDLER,
- ZEND_ASSIGN_BW_AND_SPEC_CV_TMPVAR_HANDLER,
- ZEND_ASSIGN_BW_AND_SPEC_CV_TMPVAR_DIM_HANDLER,
- ZEND_ASSIGN_BW_AND_SPEC_CV_TMPVAR_OBJ_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_ASSIGN_BW_AND_SPEC_CV_UNUSED_DIM_HANDLER,
+ ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR_OP_DATA_VAR_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_ASSIGN_BW_AND_SPEC_CV_CV_HANDLER,
- ZEND_ASSIGN_BW_AND_SPEC_CV_CV_DIM_HANDLER,
- ZEND_ASSIGN_BW_AND_SPEC_CV_CV_OBJ_HANDLER,
+ ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR_OP_DATA_CV_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
+ ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR_OP_DATA_VAR_HANDLER,
ZEND_NULL_HANDLER,
+ ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR_OP_DATA_CV_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
@@ -62175,16 +59030,24 @@ void zend_vm_init(void)
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
+ ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_DATA_VAR_HANDLER,
ZEND_NULL_HANDLER,
+ ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_DATA_CV_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
+ ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CONST_OP_DATA_VAR_HANDLER,
ZEND_NULL_HANDLER,
+ ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CONST_OP_DATA_CV_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
+ ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMPVAR_OP_DATA_VAR_HANDLER,
ZEND_NULL_HANDLER,
+ ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMPVAR_OP_DATA_CV_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
+ ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMPVAR_OP_DATA_VAR_HANDLER,
ZEND_NULL_HANDLER,
+ ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMPVAR_OP_DATA_CV_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
@@ -62192,54 +59055,35 @@ void zend_vm_init(void)
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
+ ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_OP_DATA_VAR_HANDLER,
ZEND_NULL_HANDLER,
+ ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_OP_DATA_CV_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_ASSIGN_BW_XOR_SPEC_VAR_CONST_HANDLER,
- ZEND_ASSIGN_BW_XOR_SPEC_VAR_CONST_DIM_HANDLER,
- ZEND_ASSIGN_BW_XOR_SPEC_VAR_CONST_OBJ_HANDLER,
- ZEND_ASSIGN_BW_XOR_SPEC_VAR_TMPVAR_HANDLER,
- ZEND_ASSIGN_BW_XOR_SPEC_VAR_TMPVAR_DIM_HANDLER,
- ZEND_ASSIGN_BW_XOR_SPEC_VAR_TMPVAR_OBJ_HANDLER,
- ZEND_ASSIGN_BW_XOR_SPEC_VAR_TMPVAR_HANDLER,
- ZEND_ASSIGN_BW_XOR_SPEC_VAR_TMPVAR_DIM_HANDLER,
- ZEND_ASSIGN_BW_XOR_SPEC_VAR_TMPVAR_OBJ_HANDLER,
+ ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_OP_DATA_VAR_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_ASSIGN_BW_XOR_SPEC_VAR_UNUSED_DIM_HANDLER,
+ ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_OP_DATA_CV_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_ASSIGN_BW_XOR_SPEC_VAR_CV_HANDLER,
- ZEND_ASSIGN_BW_XOR_SPEC_VAR_CV_DIM_HANDLER,
- ZEND_ASSIGN_BW_XOR_SPEC_VAR_CV_OBJ_HANDLER,
ZEND_NULL_HANDLER,
+ ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_OP_DATA_VAR_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_ASSIGN_BW_XOR_SPEC_UNUSED_CONST_OBJ_HANDLER,
+ ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_OP_DATA_CV_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_ASSIGN_BW_XOR_SPEC_UNUSED_TMPVAR_OBJ_HANDLER,
+ ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_OP_DATA_VAR_HANDLER,
ZEND_NULL_HANDLER,
+ ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_OP_DATA_CV_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_ASSIGN_BW_XOR_SPEC_UNUSED_TMPVAR_OBJ_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_ASSIGN_BW_XOR_SPEC_UNUSED_CV_OBJ_HANDLER,
- ZEND_ASSIGN_BW_XOR_SPEC_CV_CONST_HANDLER,
- ZEND_ASSIGN_BW_XOR_SPEC_CV_CONST_DIM_HANDLER,
- ZEND_ASSIGN_BW_XOR_SPEC_CV_CONST_OBJ_HANDLER,
- ZEND_ASSIGN_BW_XOR_SPEC_CV_TMPVAR_HANDLER,
- ZEND_ASSIGN_BW_XOR_SPEC_CV_TMPVAR_DIM_HANDLER,
- ZEND_ASSIGN_BW_XOR_SPEC_CV_TMPVAR_OBJ_HANDLER,
- ZEND_ASSIGN_BW_XOR_SPEC_CV_TMPVAR_HANDLER,
- ZEND_ASSIGN_BW_XOR_SPEC_CV_TMPVAR_DIM_HANDLER,
- ZEND_ASSIGN_BW_XOR_SPEC_CV_TMPVAR_OBJ_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_ASSIGN_BW_XOR_SPEC_CV_UNUSED_DIM_HANDLER,
+ ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_DATA_VAR_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_ASSIGN_BW_XOR_SPEC_CV_CV_HANDLER,
- ZEND_ASSIGN_BW_XOR_SPEC_CV_CV_DIM_HANDLER,
- ZEND_ASSIGN_BW_XOR_SPEC_CV_CV_OBJ_HANDLER,
+ ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_DATA_CV_HANDLER,
+ ZEND_ASSIGN_STATIC_PROP_REF_SPEC_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
@@ -62270,87 +59114,8 @@ void zend_vm_init(void)
ZEND_POST_DEC_SPEC_VAR_HANDLER,
ZEND_NULL_HANDLER,
ZEND_POST_DEC_SPEC_CV_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_ASSIGN_SPEC_VAR_CONST_RETVAL_UNUSED_HANDLER,
- ZEND_ASSIGN_SPEC_VAR_CONST_RETVAL_USED_HANDLER,
- ZEND_ASSIGN_SPEC_VAR_TMP_RETVAL_UNUSED_HANDLER,
- ZEND_ASSIGN_SPEC_VAR_TMP_RETVAL_USED_HANDLER,
- ZEND_ASSIGN_SPEC_VAR_VAR_RETVAL_UNUSED_HANDLER,
- ZEND_ASSIGN_SPEC_VAR_VAR_RETVAL_USED_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_ASSIGN_SPEC_VAR_CV_RETVAL_UNUSED_HANDLER,
- ZEND_ASSIGN_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_ASSIGN_SPEC_CV_CONST_RETVAL_UNUSED_HANDLER,
- ZEND_ASSIGN_SPEC_CV_CONST_RETVAL_USED_HANDLER,
- ZEND_ASSIGN_SPEC_CV_TMP_RETVAL_UNUSED_HANDLER,
- ZEND_ASSIGN_SPEC_CV_TMP_RETVAL_USED_HANDLER,
- ZEND_ASSIGN_SPEC_CV_VAR_RETVAL_UNUSED_HANDLER,
- ZEND_ASSIGN_SPEC_CV_VAR_RETVAL_USED_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_ASSIGN_SPEC_CV_CV_RETVAL_UNUSED_HANDLER,
- ZEND_ASSIGN_SPEC_CV_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_ASSIGN_REF_SPEC_VAR_VAR_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_ASSIGN_REF_SPEC_VAR_CV_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_ASSIGN_REF_SPEC_CV_VAR_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_ASSIGN_REF_SPEC_CV_CV_HANDLER,
- ZEND_ECHO_SPEC_CONST_HANDLER,
- ZEND_ECHO_SPEC_TMPVAR_HANDLER,
- ZEND_ECHO_SPEC_TMPVAR_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_ECHO_SPEC_CV_HANDLER,
- ZEND_GENERATOR_CREATE_SPEC_HANDLER,
+ ZEND_PRE_INC_STATIC_PROP_SPEC_HANDLER,
+ ZEND_POST_INC_STATIC_PROP_SPEC_HANDLER,
ZEND_JMP_SPEC_HANDLER,
ZEND_JMPZ_SPEC_CONST_HANDLER,
ZEND_JMPZ_SPEC_TMPVAR_HANDLER,
@@ -62385,11 +59150,11 @@ void zend_vm_init(void)
ZEND_CHECK_VAR_SPEC_CV_UNUSED_HANDLER,
ZEND_SEND_VAR_NO_REF_EX_SPEC_VAR_HANDLER,
ZEND_SEND_VAR_NO_REF_EX_SPEC_VAR_QUICK_HANDLER,
+ ZEND_CAST_SPEC_CONST_HANDLER,
+ ZEND_CAST_SPEC_TMP_HANDLER,
+ ZEND_CAST_SPEC_VAR_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_MAKE_REF_SPEC_VAR_UNUSED_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_MAKE_REF_SPEC_CV_UNUSED_HANDLER,
+ ZEND_CAST_SPEC_CV_HANDLER,
ZEND_BOOL_SPEC_CONST_HANDLER,
ZEND_BOOL_SPEC_TMPVAR_HANDLER,
ZEND_BOOL_SPEC_TMPVAR_HANDLER,
@@ -62490,11 +59255,11 @@ void zend_vm_init(void)
ZEND_INIT_ARRAY_SPEC_VAR_TMPVAR_HANDLER,
ZEND_INIT_ARRAY_SPEC_VAR_UNUSED_HANDLER,
ZEND_INIT_ARRAY_SPEC_VAR_CV_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
+ ZEND_INIT_ARRAY_SPEC_UNUSED_CONST_HANDLER,
+ ZEND_INIT_ARRAY_SPEC_UNUSED_TMPVAR_HANDLER,
+ ZEND_INIT_ARRAY_SPEC_UNUSED_TMPVAR_HANDLER,
+ ZEND_INIT_ARRAY_SPEC_UNUSED_UNUSED_HANDLER,
+ ZEND_INIT_ARRAY_SPEC_UNUSED_CV_HANDLER,
ZEND_INIT_ARRAY_SPEC_CV_CONST_HANDLER,
ZEND_INIT_ARRAY_SPEC_CV_TMPVAR_HANDLER,
ZEND_INIT_ARRAY_SPEC_CV_TMPVAR_HANDLER,
@@ -62591,11 +59356,7 @@ void zend_vm_init(void)
ZEND_NULL_HANDLER,
ZEND_FE_RESET_R_SPEC_CV_HANDLER,
ZEND_FE_FETCH_R_SPEC_VAR_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_EXIT_SPEC_HANDLER,
ZEND_FETCH_R_SPEC_CONST_UNUSED_HANDLER,
ZEND_FETCH_R_SPEC_TMPVAR_UNUSED_HANDLER,
ZEND_FETCH_R_SPEC_TMPVAR_UNUSED_HANDLER,
@@ -63156,31 +59917,6 @@ void zend_vm_init(void)
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_PRE_DEC_OBJ_SPEC_VAR_CONST_HANDLER,
- ZEND_PRE_DEC_OBJ_SPEC_VAR_TMPVAR_HANDLER,
- ZEND_PRE_DEC_OBJ_SPEC_VAR_TMPVAR_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_PRE_DEC_OBJ_SPEC_VAR_CV_HANDLER,
- ZEND_PRE_DEC_OBJ_SPEC_UNUSED_CONST_HANDLER,
- ZEND_PRE_DEC_OBJ_SPEC_UNUSED_TMPVAR_HANDLER,
- ZEND_PRE_DEC_OBJ_SPEC_UNUSED_TMPVAR_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_PRE_DEC_OBJ_SPEC_UNUSED_CV_HANDLER,
- ZEND_PRE_DEC_OBJ_SPEC_CV_CONST_HANDLER,
- ZEND_PRE_DEC_OBJ_SPEC_CV_TMPVAR_HANDLER,
- ZEND_PRE_DEC_OBJ_SPEC_CV_TMPVAR_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_PRE_DEC_OBJ_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_POST_INC_OBJ_SPEC_VAR_CONST_HANDLER,
ZEND_POST_INC_OBJ_SPEC_VAR_TMPVAR_HANDLER,
ZEND_POST_INC_OBJ_SPEC_VAR_TMPVAR_HANDLER,
@@ -63196,156 +59932,11 @@ void zend_vm_init(void)
ZEND_POST_INC_OBJ_SPEC_CV_TMPVAR_HANDLER,
ZEND_NULL_HANDLER,
ZEND_POST_INC_OBJ_SPEC_CV_CV_HANDLER,
+ ZEND_ECHO_SPEC_CONST_HANDLER,
+ ZEND_ECHO_SPEC_TMPVAR_HANDLER,
+ ZEND_ECHO_SPEC_TMPVAR_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_POST_DEC_OBJ_SPEC_VAR_CONST_HANDLER,
- ZEND_POST_DEC_OBJ_SPEC_VAR_TMPVAR_HANDLER,
- ZEND_POST_DEC_OBJ_SPEC_VAR_TMPVAR_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_POST_DEC_OBJ_SPEC_VAR_CV_HANDLER,
- ZEND_POST_DEC_OBJ_SPEC_UNUSED_CONST_HANDLER,
- ZEND_POST_DEC_OBJ_SPEC_UNUSED_TMPVAR_HANDLER,
- ZEND_POST_DEC_OBJ_SPEC_UNUSED_TMPVAR_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_POST_DEC_OBJ_SPEC_UNUSED_CV_HANDLER,
- ZEND_POST_DEC_OBJ_SPEC_CV_CONST_HANDLER,
- ZEND_POST_DEC_OBJ_SPEC_CV_TMPVAR_HANDLER,
- ZEND_POST_DEC_OBJ_SPEC_CV_TMPVAR_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_POST_DEC_OBJ_SPEC_CV_CV_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_DATA_CONST_HANDLER,
- ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_DATA_TMP_HANDLER,
- ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_DATA_VAR_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_DATA_CV_HANDLER,
- ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_DATA_CONST_HANDLER,
- ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_DATA_TMP_HANDLER,
- ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_DATA_VAR_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_DATA_CV_HANDLER,
- ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_DATA_CONST_HANDLER,
- ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_DATA_TMP_HANDLER,
- ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_DATA_VAR_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_DATA_CV_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA_CONST_HANDLER,
- ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA_TMP_HANDLER,
- ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA_VAR_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA_CV_HANDLER,
- ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_OP_DATA_CONST_HANDLER,
- ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_OP_DATA_TMP_HANDLER,
- ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_OP_DATA_VAR_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_OP_DATA_CV_HANDLER,
- ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_OP_DATA_CONST_HANDLER,
- ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_OP_DATA_TMP_HANDLER,
- ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_OP_DATA_VAR_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_OP_DATA_CV_HANDLER,
- ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_OP_DATA_CONST_HANDLER,
- ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_OP_DATA_TMP_HANDLER,
- ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_OP_DATA_VAR_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_OP_DATA_CV_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_DATA_CONST_HANDLER,
- ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_DATA_TMP_HANDLER,
- ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_DATA_VAR_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_DATA_CV_HANDLER,
- ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DATA_CONST_HANDLER,
- ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DATA_TMP_HANDLER,
- ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DATA_VAR_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DATA_CV_HANDLER,
- ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_DATA_CONST_HANDLER,
- ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_DATA_TMP_HANDLER,
- ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_DATA_VAR_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_DATA_CV_HANDLER,
- ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_DATA_CONST_HANDLER,
- ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_DATA_TMP_HANDLER,
- ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_DATA_VAR_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_DATA_CV_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_CONST_HANDLER,
- ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_TMP_HANDLER,
- ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_VAR_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_CV_HANDLER,
+ ZEND_ECHO_SPEC_CV_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
@@ -63372,143 +59963,19 @@ void zend_vm_init(void)
ZEND_INSTANCEOF_SPEC_CV_VAR_HANDLER,
ZEND_INSTANCEOF_SPEC_CV_UNUSED_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,
- ZEND_YIELD_FROM_SPEC_VAR_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_YIELD_FROM_SPEC_CV_HANDLER,
- ZEND_DECLARE_CONST_SPEC_CONST_CONST_HANDLER,
- ZEND_ADD_INTERFACE_SPEC_CONST_HANDLER,
- ZEND_DECLARE_INHERITED_CLASS_DELAYED_SPEC_CONST_CONST_HANDLER,
- ZEND_VERIFY_ABSTRACT_CLASS_SPEC_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_DATA_CONST_HANDLER,
- ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_DATA_TMP_HANDLER,
- ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_DATA_VAR_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_DATA_CV_HANDLER,
- ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_DATA_CONST_HANDLER,
- ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_DATA_TMP_HANDLER,
- ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_DATA_VAR_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_DATA_CV_HANDLER,
- ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_DATA_CONST_HANDLER,
- ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_DATA_TMP_HANDLER,
- ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_DATA_VAR_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_DATA_CV_HANDLER,
- ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_DATA_CONST_HANDLER,
- ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_DATA_TMP_HANDLER,
- ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_DATA_VAR_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_DATA_CV_HANDLER,
- ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA_CONST_HANDLER,
- ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA_TMP_HANDLER,
- ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA_VAR_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA_CV_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DATA_CONST_HANDLER,
- ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DATA_TMP_HANDLER,
- ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DATA_VAR_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DATA_CV_HANDLER,
- ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_DATA_CONST_HANDLER,
- ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_DATA_TMP_HANDLER,
- ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_DATA_VAR_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_DATA_CV_HANDLER,
- ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_DATA_CONST_HANDLER,
- ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_DATA_TMP_HANDLER,
- ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_DATA_VAR_HANDLER,
+ ZEND_GENERATOR_CREATE_SPEC_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_DATA_CV_HANDLER,
- ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_DATA_CONST_HANDLER,
- ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_DATA_TMP_HANDLER,
- ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_DATA_VAR_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_DATA_CV_HANDLER,
- ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_CONST_HANDLER,
- ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_TMP_HANDLER,
- ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_VAR_HANDLER,
+ ZEND_MAKE_REF_SPEC_VAR_UNUSED_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_CV_HANDLER,
+ ZEND_MAKE_REF_SPEC_CV_UNUSED_HANDLER,
+ ZEND_DECLARE_FUNCTION_SPEC_HANDLER,
+ ZEND_DECLARE_LAMBDA_FUNCTION_SPEC_CONST_UNUSED_HANDLER,
+ ZEND_DECLARE_CONST_SPEC_CONST_CONST_HANDLER,
+ ZEND_DECLARE_CLASS_SPEC_CONST_HANDLER,
+ ZEND_DECLARE_CLASS_DELAYED_SPEC_CONST_CONST_HANDLER,
+ ZEND_DECLARE_ANON_CLASS_SPEC_HANDLER,
+ ZEND_ADD_ARRAY_UNPACK_SPEC_HANDLER,
ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CONST_CONST_HANDLER,
ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CONST_TMPVAR_HANDLER,
ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CONST_TMPVAR_HANDLER,
@@ -63542,9 +60009,14 @@ void zend_vm_init(void)
ZEND_JMP_SET_SPEC_VAR_HANDLER,
ZEND_NULL_HANDLER,
ZEND_JMP_SET_SPEC_CV_HANDLER,
- ZEND_DECLARE_LAMBDA_FUNCTION_SPEC_CONST_UNUSED_HANDLER,
- ZEND_ADD_TRAIT_SPEC_HANDLER,
- ZEND_BIND_TRAITS_SPEC_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_SEPARATE_SPEC_VAR_UNUSED_HANDLER,
ZEND_FETCH_CLASS_NAME_SPEC_UNUSED_HANDLER,
ZEND_CALL_TRAMPOLINE_SPEC_HANDLER,
@@ -63583,110 +60055,16 @@ void zend_vm_init(void)
ZEND_FAST_RET_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,
- ZEND_POW_SPEC_CONST_TMPVAR_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_POW_SPEC_CONST_CV_HANDLER,
- ZEND_POW_SPEC_TMPVAR_CONST_HANDLER,
- ZEND_POW_SPEC_TMPVAR_TMPVAR_HANDLER,
- ZEND_POW_SPEC_TMPVAR_TMPVAR_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_POW_SPEC_TMPVAR_CV_HANDLER,
- ZEND_POW_SPEC_TMPVAR_CONST_HANDLER,
- ZEND_POW_SPEC_TMPVAR_TMPVAR_HANDLER,
- ZEND_POW_SPEC_TMPVAR_TMPVAR_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_POW_SPEC_TMPVAR_CV_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_POW_SPEC_CV_CONST_HANDLER,
- ZEND_POW_SPEC_CV_TMPVAR_HANDLER,
- ZEND_POW_SPEC_CV_TMPVAR_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_POW_SPEC_CV_CV_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_ASSIGN_POW_SPEC_VAR_CONST_HANDLER,
- ZEND_ASSIGN_POW_SPEC_VAR_CONST_DIM_HANDLER,
- ZEND_ASSIGN_POW_SPEC_VAR_CONST_OBJ_HANDLER,
- ZEND_ASSIGN_POW_SPEC_VAR_TMPVAR_HANDLER,
- ZEND_ASSIGN_POW_SPEC_VAR_TMPVAR_DIM_HANDLER,
- ZEND_ASSIGN_POW_SPEC_VAR_TMPVAR_OBJ_HANDLER,
- ZEND_ASSIGN_POW_SPEC_VAR_TMPVAR_HANDLER,
- ZEND_ASSIGN_POW_SPEC_VAR_TMPVAR_DIM_HANDLER,
- ZEND_ASSIGN_POW_SPEC_VAR_TMPVAR_OBJ_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_ASSIGN_POW_SPEC_VAR_UNUSED_DIM_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_ASSIGN_POW_SPEC_VAR_CV_HANDLER,
- ZEND_ASSIGN_POW_SPEC_VAR_CV_DIM_HANDLER,
- ZEND_ASSIGN_POW_SPEC_VAR_CV_OBJ_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_ASSIGN_POW_SPEC_UNUSED_CONST_OBJ_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_ASSIGN_POW_SPEC_UNUSED_TMPVAR_OBJ_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_ASSIGN_POW_SPEC_UNUSED_TMPVAR_OBJ_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_ASSIGN_POW_SPEC_UNUSED_CV_OBJ_HANDLER,
- ZEND_ASSIGN_POW_SPEC_CV_CONST_HANDLER,
- ZEND_ASSIGN_POW_SPEC_CV_CONST_DIM_HANDLER,
- ZEND_ASSIGN_POW_SPEC_CV_CONST_OBJ_HANDLER,
- ZEND_ASSIGN_POW_SPEC_CV_TMPVAR_HANDLER,
- ZEND_ASSIGN_POW_SPEC_CV_TMPVAR_DIM_HANDLER,
- ZEND_ASSIGN_POW_SPEC_CV_TMPVAR_OBJ_HANDLER,
- ZEND_ASSIGN_POW_SPEC_CV_TMPVAR_HANDLER,
- ZEND_ASSIGN_POW_SPEC_CV_TMPVAR_DIM_HANDLER,
- ZEND_ASSIGN_POW_SPEC_CV_TMPVAR_OBJ_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_ASSIGN_POW_SPEC_CV_UNUSED_DIM_HANDLER,
+ ZEND_YIELD_FROM_SPEC_CONST_HANDLER,
+ ZEND_YIELD_FROM_SPEC_TMP_HANDLER,
+ ZEND_YIELD_FROM_SPEC_VAR_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_ASSIGN_POW_SPEC_CV_CV_HANDLER,
- ZEND_ASSIGN_POW_SPEC_CV_CV_DIM_HANDLER,
- ZEND_ASSIGN_POW_SPEC_CV_CV_OBJ_HANDLER,
+ ZEND_YIELD_FROM_SPEC_CV_HANDLER,
+ ZEND_COPY_TMP_SPEC_TMPVAR_UNUSED_HANDLER,
ZEND_BIND_GLOBAL_SPEC_CV_CONST_HANDLER,
ZEND_COALESCE_SPEC_CONST_HANDLER,
- ZEND_COALESCE_SPEC_TMPVAR_HANDLER,
- ZEND_COALESCE_SPEC_TMPVAR_HANDLER,
+ ZEND_COALESCE_SPEC_TMP_HANDLER,
+ ZEND_COALESCE_SPEC_VAR_HANDLER,
ZEND_NULL_HANDLER,
ZEND_COALESCE_SPEC_CV_HANDLER,
ZEND_SPACESHIP_SPEC_CONST_CONST_HANDLER,
@@ -63714,215 +60092,27 @@ void zend_vm_init(void)
ZEND_SPACESHIP_SPEC_CV_TMPVAR_HANDLER,
ZEND_NULL_HANDLER,
ZEND_SPACESHIP_SPEC_CV_CV_HANDLER,
- ZEND_DECLARE_ANON_CLASS_SPEC_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,
- ZEND_FETCH_STATIC_PROP_R_SPEC_CONST_UNUSED_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_FETCH_STATIC_PROP_R_SPEC_TMPVAR_CONST_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_FETCH_STATIC_PROP_R_SPEC_TMPVAR_VAR_HANDLER,
- ZEND_FETCH_STATIC_PROP_R_SPEC_TMPVAR_UNUSED_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_FETCH_STATIC_PROP_R_SPEC_TMPVAR_CONST_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_FETCH_STATIC_PROP_R_SPEC_TMPVAR_VAR_HANDLER,
- ZEND_FETCH_STATIC_PROP_R_SPEC_TMPVAR_UNUSED_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_FETCH_STATIC_PROP_R_SPEC_CV_CONST_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_FETCH_STATIC_PROP_R_SPEC_CV_VAR_HANDLER,
- ZEND_FETCH_STATIC_PROP_R_SPEC_CV_UNUSED_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_FETCH_STATIC_PROP_W_SPEC_CONST_CONST_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_FETCH_STATIC_PROP_W_SPEC_CONST_VAR_HANDLER,
- ZEND_FETCH_STATIC_PROP_W_SPEC_CONST_UNUSED_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_FETCH_STATIC_PROP_W_SPEC_TMPVAR_CONST_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_FETCH_STATIC_PROP_W_SPEC_TMPVAR_VAR_HANDLER,
- ZEND_FETCH_STATIC_PROP_W_SPEC_TMPVAR_UNUSED_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_FETCH_STATIC_PROP_W_SPEC_TMPVAR_CONST_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_FETCH_STATIC_PROP_W_SPEC_TMPVAR_VAR_HANDLER,
- ZEND_FETCH_STATIC_PROP_W_SPEC_TMPVAR_UNUSED_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_FETCH_STATIC_PROP_W_SPEC_CV_CONST_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_FETCH_STATIC_PROP_W_SPEC_CV_VAR_HANDLER,
- ZEND_FETCH_STATIC_PROP_W_SPEC_CV_UNUSED_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_FETCH_STATIC_PROP_RW_SPEC_CONST_CONST_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_FETCH_STATIC_PROP_RW_SPEC_CONST_VAR_HANDLER,
- ZEND_FETCH_STATIC_PROP_RW_SPEC_CONST_UNUSED_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_FETCH_STATIC_PROP_RW_SPEC_TMPVAR_CONST_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_FETCH_STATIC_PROP_RW_SPEC_TMPVAR_VAR_HANDLER,
- ZEND_FETCH_STATIC_PROP_RW_SPEC_TMPVAR_UNUSED_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_FETCH_STATIC_PROP_RW_SPEC_TMPVAR_CONST_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_FETCH_STATIC_PROP_RW_SPEC_TMPVAR_VAR_HANDLER,
- ZEND_FETCH_STATIC_PROP_RW_SPEC_TMPVAR_UNUSED_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_FETCH_STATIC_PROP_RW_SPEC_CV_CONST_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_FETCH_STATIC_PROP_RW_SPEC_CV_VAR_HANDLER,
- ZEND_FETCH_STATIC_PROP_RW_SPEC_CV_UNUSED_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_FETCH_STATIC_PROP_IS_SPEC_CONST_CONST_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_FETCH_STATIC_PROP_IS_SPEC_CONST_VAR_HANDLER,
- ZEND_FETCH_STATIC_PROP_IS_SPEC_CONST_UNUSED_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_FETCH_STATIC_PROP_IS_SPEC_TMPVAR_CONST_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_FETCH_STATIC_PROP_IS_SPEC_TMPVAR_VAR_HANDLER,
- ZEND_FETCH_STATIC_PROP_IS_SPEC_TMPVAR_UNUSED_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_FETCH_STATIC_PROP_IS_SPEC_TMPVAR_CONST_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_FETCH_STATIC_PROP_IS_SPEC_TMPVAR_VAR_HANDLER,
- ZEND_FETCH_STATIC_PROP_IS_SPEC_TMPVAR_UNUSED_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_FETCH_STATIC_PROP_IS_SPEC_CV_CONST_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_FETCH_STATIC_PROP_IS_SPEC_CV_VAR_HANDLER,
- ZEND_FETCH_STATIC_PROP_IS_SPEC_CV_UNUSED_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_FETCH_STATIC_PROP_FUNC_ARG_SPEC_CONST_CONST_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_FETCH_STATIC_PROP_FUNC_ARG_SPEC_CONST_VAR_HANDLER,
- ZEND_FETCH_STATIC_PROP_FUNC_ARG_SPEC_CONST_UNUSED_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_FETCH_STATIC_PROP_FUNC_ARG_SPEC_TMPVAR_CONST_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_FETCH_STATIC_PROP_FUNC_ARG_SPEC_TMPVAR_VAR_HANDLER,
- ZEND_FETCH_STATIC_PROP_FUNC_ARG_SPEC_TMPVAR_UNUSED_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_FETCH_STATIC_PROP_FUNC_ARG_SPEC_TMPVAR_CONST_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_FETCH_STATIC_PROP_FUNC_ARG_SPEC_TMPVAR_VAR_HANDLER,
- ZEND_FETCH_STATIC_PROP_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_FETCH_STATIC_PROP_FUNC_ARG_SPEC_CV_CONST_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_FETCH_STATIC_PROP_FUNC_ARG_SPEC_CV_VAR_HANDLER,
- ZEND_FETCH_STATIC_PROP_FUNC_ARG_SPEC_CV_UNUSED_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_FETCH_STATIC_PROP_UNSET_SPEC_CONST_CONST_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_FETCH_STATIC_PROP_UNSET_SPEC_CONST_VAR_HANDLER,
- ZEND_FETCH_STATIC_PROP_UNSET_SPEC_CONST_UNUSED_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_FETCH_STATIC_PROP_UNSET_SPEC_TMPVAR_CONST_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_FETCH_STATIC_PROP_UNSET_SPEC_TMPVAR_VAR_HANDLER,
- ZEND_FETCH_STATIC_PROP_UNSET_SPEC_TMPVAR_UNUSED_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_FETCH_STATIC_PROP_UNSET_SPEC_TMPVAR_CONST_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_FETCH_STATIC_PROP_UNSET_SPEC_TMPVAR_VAR_HANDLER,
- ZEND_FETCH_STATIC_PROP_UNSET_SPEC_TMPVAR_UNUSED_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_FETCH_STATIC_PROP_UNSET_SPEC_CV_CONST_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_FETCH_STATIC_PROP_UNSET_SPEC_CV_VAR_HANDLER,
- ZEND_FETCH_STATIC_PROP_UNSET_SPEC_CV_UNUSED_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_UNSET_STATIC_PROP_SPEC_CONST_CONST_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_UNSET_STATIC_PROP_SPEC_CONST_VAR_HANDLER,
- ZEND_UNSET_STATIC_PROP_SPEC_CONST_UNUSED_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_UNSET_STATIC_PROP_SPEC_TMPVAR_CONST_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_UNSET_STATIC_PROP_SPEC_TMPVAR_VAR_HANDLER,
- ZEND_UNSET_STATIC_PROP_SPEC_TMPVAR_UNUSED_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_UNSET_STATIC_PROP_SPEC_TMPVAR_CONST_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_UNSET_STATIC_PROP_SPEC_TMPVAR_VAR_HANDLER,
- ZEND_UNSET_STATIC_PROP_SPEC_TMPVAR_UNUSED_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_UNSET_STATIC_PROP_SPEC_CV_CONST_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_UNSET_STATIC_PROP_SPEC_CV_VAR_HANDLER,
- ZEND_UNSET_STATIC_PROP_SPEC_CV_UNUSED_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC_CONST_CONST_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC_CONST_VAR_HANDLER,
- ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC_CONST_UNUSED_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC_TMPVAR_CONST_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC_TMPVAR_VAR_HANDLER,
- ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC_TMPVAR_UNUSED_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC_TMPVAR_CONST_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC_TMPVAR_VAR_HANDLER,
- ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC_TMPVAR_UNUSED_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_FUNC_GET_ARGS_SPEC_CONST_UNUSED_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC_CV_CONST_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC_CV_VAR_HANDLER,
- ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC_CV_UNUSED_HANDLER,
+ ZEND_FUNC_GET_ARGS_SPEC_UNUSED_UNUSED_HANDLER,
ZEND_NULL_HANDLER,
+ ZEND_FETCH_STATIC_PROP_R_SPEC_HANDLER,
+ ZEND_FETCH_STATIC_PROP_W_SPEC_HANDLER,
+ ZEND_FETCH_STATIC_PROP_RW_SPEC_HANDLER,
+ ZEND_FETCH_STATIC_PROP_IS_SPEC_HANDLER,
+ ZEND_FETCH_STATIC_PROP_FUNC_ARG_SPEC_HANDLER,
+ ZEND_FETCH_STATIC_PROP_UNSET_SPEC_HANDLER,
+ ZEND_UNSET_STATIC_PROP_SPEC_HANDLER,
+ ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC_HANDLER,
ZEND_FETCH_CLASS_CONSTANT_SPEC_CONST_CONST_HANDLER,
ZEND_NULL_HANDLER,
ZEND_FETCH_CLASS_CONSTANT_SPEC_VAR_CONST_HANDLER,
ZEND_FETCH_CLASS_CONSTANT_SPEC_UNUSED_CONST_HANDLER,
ZEND_NULL_HANDLER,
ZEND_BIND_LEXICAL_SPEC_TMP_CV_HANDLER,
- ZEND_BIND_STATIC_SPEC_CV_CONST_HANDLER,
+ ZEND_BIND_STATIC_SPEC_CV_UNUSED_HANDLER,
ZEND_FETCH_THIS_SPEC_UNUSED_UNUSED_HANDLER,
ZEND_SEND_FUNC_ARG_SPEC_VAR_HANDLER,
ZEND_ISSET_ISEMPTY_THIS_SPEC_UNUSED_UNUSED_HANDLER,
@@ -63942,13 +60132,13 @@ void zend_vm_init(void)
ZEND_NULL_HANDLER,
ZEND_IN_ARRAY_SPEC_CV_CONST_HANDLER,
ZEND_COUNT_SPEC_CONST_UNUSED_HANDLER,
- ZEND_COUNT_SPEC_TMP_UNUSED_HANDLER,
- ZEND_COUNT_SPEC_VAR_UNUSED_HANDLER,
+ ZEND_COUNT_SPEC_TMPVAR_UNUSED_HANDLER,
+ ZEND_COUNT_SPEC_TMPVAR_UNUSED_HANDLER,
ZEND_NULL_HANDLER,
ZEND_COUNT_SPEC_CV_UNUSED_HANDLER,
ZEND_GET_CLASS_SPEC_CONST_UNUSED_HANDLER,
- ZEND_GET_CLASS_SPEC_TMP_UNUSED_HANDLER,
- ZEND_GET_CLASS_SPEC_VAR_UNUSED_HANDLER,
+ ZEND_GET_CLASS_SPEC_TMPVAR_UNUSED_HANDLER,
+ ZEND_GET_CLASS_SPEC_TMPVAR_UNUSED_HANDLER,
ZEND_GET_CLASS_SPEC_UNUSED_UNUSED_HANDLER,
ZEND_GET_CLASS_SPEC_CV_UNUSED_HANDLER,
ZEND_GET_CALLED_CLASS_SPEC_UNUSED_UNUSED_HANDLER,
@@ -63957,20 +60147,31 @@ void zend_vm_init(void)
ZEND_GET_TYPE_SPEC_VAR_UNUSED_HANDLER,
ZEND_NULL_HANDLER,
ZEND_GET_TYPE_SPEC_CV_UNUSED_HANDLER,
- ZEND_FUNC_NUM_ARGS_SPEC_UNUSED_UNUSED_HANDLER,
- ZEND_FUNC_GET_ARGS_SPEC_CONST_UNUSED_HANDLER,
+ ZEND_ARRAY_KEY_EXISTS_SPEC_CONST_CONST_HANDLER,
+ ZEND_ARRAY_KEY_EXISTS_SPEC_CONST_TMPVAR_HANDLER,
+ ZEND_ARRAY_KEY_EXISTS_SPEC_CONST_TMPVAR_HANDLER,
ZEND_NULL_HANDLER,
+ ZEND_ARRAY_KEY_EXISTS_SPEC_CONST_CV_HANDLER,
+ ZEND_ARRAY_KEY_EXISTS_SPEC_TMPVAR_CONST_HANDLER,
+ ZEND_ARRAY_KEY_EXISTS_SPEC_TMPVAR_TMPVAR_HANDLER,
+ ZEND_ARRAY_KEY_EXISTS_SPEC_TMPVAR_TMPVAR_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_FUNC_GET_ARGS_SPEC_UNUSED_UNUSED_HANDLER,
+ ZEND_ARRAY_KEY_EXISTS_SPEC_TMPVAR_CV_HANDLER,
+ ZEND_ARRAY_KEY_EXISTS_SPEC_TMPVAR_CONST_HANDLER,
+ ZEND_ARRAY_KEY_EXISTS_SPEC_TMPVAR_TMPVAR_HANDLER,
+ ZEND_ARRAY_KEY_EXISTS_SPEC_TMPVAR_TMPVAR_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_ARRAY_KEY_EXISTS_SPEC_TMPVAR_CV_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_FETCH_LIST_W_SPEC_VAR_CV_HANDLER,
+ ZEND_NULL_HANDLER,
+ ZEND_NULL_HANDLER,
+ ZEND_NULL_HANDLER,
+ ZEND_NULL_HANDLER,
+ ZEND_ARRAY_KEY_EXISTS_SPEC_CV_CONST_HANDLER,
+ ZEND_ARRAY_KEY_EXISTS_SPEC_CV_TMPVAR_HANDLER,
+ ZEND_ARRAY_KEY_EXISTS_SPEC_CV_TMPVAR_HANDLER,
+ ZEND_NULL_HANDLER,
+ ZEND_ARRAY_KEY_EXISTS_SPEC_CV_CV_HANDLER,
ZEND_JMP_FORWARD_SPEC_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
@@ -64801,20 +61002,19 @@ void zend_vm_init(void)
ZEND_PRE_INC_LONG_NO_OVERFLOW_SPEC_CV_RETVAL_USED_HANDLER,
ZEND_PRE_INC_LONG_SPEC_CV_RETVAL_UNUSED_HANDLER,
ZEND_PRE_INC_LONG_SPEC_CV_RETVAL_USED_HANDLER,
- ZEND_PRE_INC_LONG_OR_DOUBLE_SPEC_CV_RETVAL_UNUSED_HANDLER,
- ZEND_PRE_INC_LONG_OR_DOUBLE_SPEC_CV_RETVAL_USED_HANDLER,
ZEND_PRE_DEC_LONG_NO_OVERFLOW_SPEC_CV_RETVAL_UNUSED_HANDLER,
ZEND_PRE_DEC_LONG_NO_OVERFLOW_SPEC_CV_RETVAL_USED_HANDLER,
ZEND_PRE_DEC_LONG_SPEC_CV_RETVAL_UNUSED_HANDLER,
ZEND_PRE_DEC_LONG_SPEC_CV_RETVAL_USED_HANDLER,
- ZEND_PRE_DEC_LONG_OR_DOUBLE_SPEC_CV_RETVAL_UNUSED_HANDLER,
- ZEND_PRE_DEC_LONG_OR_DOUBLE_SPEC_CV_RETVAL_USED_HANDLER,
ZEND_POST_INC_LONG_NO_OVERFLOW_SPEC_CV_HANDLER,
ZEND_POST_INC_LONG_SPEC_CV_HANDLER,
- ZEND_POST_INC_LONG_OR_DOUBLE_SPEC_CV_HANDLER,
ZEND_POST_DEC_LONG_NO_OVERFLOW_SPEC_CV_HANDLER,
ZEND_POST_DEC_LONG_SPEC_CV_HANDLER,
- ZEND_POST_DEC_LONG_OR_DOUBLE_SPEC_CV_HANDLER,
+ ZEND_QM_ASSIGN_LONG_SPEC_CONST_HANDLER,
+ ZEND_QM_ASSIGN_LONG_SPEC_TMPVARCV_HANDLER,
+ ZEND_QM_ASSIGN_LONG_SPEC_TMPVARCV_HANDLER,
+ ZEND_NULL_HANDLER,
+ ZEND_QM_ASSIGN_LONG_SPEC_TMPVARCV_HANDLER,
ZEND_QM_ASSIGN_DOUBLE_SPEC_CONST_HANDLER,
ZEND_QM_ASSIGN_DOUBLE_SPEC_TMPVARCV_HANDLER,
ZEND_QM_ASSIGN_DOUBLE_SPEC_TMPVARCV_HANDLER,
@@ -64879,194 +61079,190 @@ void zend_vm_init(void)
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 | SPEC_RULE_COMMUTATIVE,
+ 276 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
+ 301 | SPEC_RULE_OP1,
+ 306 | SPEC_RULE_OP1,
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,
- 466 | SPEC_RULE_OP1,
- 471 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_DIM_OBJ,
- 546 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_DIM_OBJ,
- 621 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_DIM_OBJ,
- 696 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_DIM_OBJ,
- 771 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_DIM_OBJ,
- 846 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_DIM_OBJ,
- 921 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_DIM_OBJ,
- 996 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_DIM_OBJ,
- 1071 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_DIM_OBJ,
- 1146 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_DIM_OBJ,
- 1221 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_DIM_OBJ,
- 1296 | SPEC_RULE_OP1 | SPEC_RULE_RETVAL,
- 1306 | SPEC_RULE_OP1 | SPEC_RULE_RETVAL,
- 1316 | SPEC_RULE_OP1,
- 1321 | SPEC_RULE_OP1,
- 1326 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_RETVAL,
- 1376 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
- 1401 | SPEC_RULE_OP1,
- 1406,
- 1407,
- 1408 | SPEC_RULE_OP1,
- 1413 | SPEC_RULE_OP1,
- 1418 | SPEC_RULE_OP1,
- 1423 | SPEC_RULE_OP1,
- 1428 | SPEC_RULE_OP1,
- 1433 | SPEC_RULE_OP2,
- 1438,
- 1439 | SPEC_RULE_QUICK_ARG,
- 1441 | SPEC_RULE_OP1,
- 1446 | SPEC_RULE_OP1,
- 1451 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
- 1476 | SPEC_RULE_OP2,
- 1481 | SPEC_RULE_OP2,
- 1486 | SPEC_RULE_OP2,
- 1491,
- 1492,
- 1493,
- 1494 | SPEC_RULE_RETVAL,
- 1496,
- 1497 | SPEC_RULE_OP1,
- 1502,
- 1503,
- 1504 | SPEC_RULE_OP1,
- 1509 | SPEC_RULE_OP1 | SPEC_RULE_QUICK_ARG,
- 1519 | SPEC_RULE_OP1,
- 1524 | SPEC_RULE_OP1,
- 1529,
- 1530,
- 1531 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
+ 386 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE,
+ 461 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE,
+ 536 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH,
+ 611 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH,
+ 686 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_RETVAL,
+ 736 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_OP_DATA,
+ 861 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_OP_DATA,
+ 986 | SPEC_RULE_OP_DATA,
+ 991 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
+ 1016 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
+ 1041 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
+ 1066,
+ 1067 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
+ 1092 | SPEC_RULE_OP1,
+ 1097 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_OP_DATA,
+ 1222,
+ 1223 | SPEC_RULE_OP1 | SPEC_RULE_RETVAL,
+ 1233 | SPEC_RULE_OP1 | SPEC_RULE_RETVAL,
+ 1243 | SPEC_RULE_OP1,
+ 1248 | SPEC_RULE_OP1,
+ 1253,
+ 1253,
+ 1254,
+ 1254,
+ 1255,
+ 1256 | SPEC_RULE_OP1,
+ 1261 | SPEC_RULE_OP1,
+ 1266 | SPEC_RULE_OP1,
+ 1271 | SPEC_RULE_OP1,
+ 1276 | SPEC_RULE_OP1,
+ 1281 | SPEC_RULE_OP2,
+ 1286,
+ 1287 | SPEC_RULE_QUICK_ARG,
+ 1289 | SPEC_RULE_OP1,
+ 1294 | SPEC_RULE_OP1,
+ 1299 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
+ 1324 | SPEC_RULE_OP2,
+ 1329 | SPEC_RULE_OP2,
+ 1334 | SPEC_RULE_OP2,
+ 1339,
+ 1340,
+ 1341,
+ 1342 | SPEC_RULE_RETVAL,
+ 1344,
+ 1345 | SPEC_RULE_OP1,
+ 1350,
+ 1351,
+ 1352 | SPEC_RULE_OP1,
+ 1357 | SPEC_RULE_OP1 | SPEC_RULE_QUICK_ARG,
+ 1367 | SPEC_RULE_OP1,
+ 1372 | SPEC_RULE_OP1,
+ 1377,
+ 1378,
+ 1379 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
+ 1404 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
+ 1429 | SPEC_RULE_OP1,
+ 1434 | SPEC_RULE_OP1,
+ 1439 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
+ 1464 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
+ 1489 | SPEC_RULE_OP1,
+ 1494,
+ 1495,
+ 1496 | SPEC_RULE_OP1,
+ 1501 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
+ 1526 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
+ 1551 | SPEC_RULE_OP1,
1556 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
- 1581 | SPEC_RULE_OP1,
- 1586 | SPEC_RULE_OP1,
- 1591 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
- 1616 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
- 1641 | SPEC_RULE_OP1,
- 1646,
- 1647 | SPEC_RULE_OP1,
- 1652 | SPEC_RULE_OP1,
- 1657 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
- 1682 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
- 1707 | SPEC_RULE_OP1,
- 1712 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
- 1737 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
- 1762 | SPEC_RULE_OP1,
- 1767 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
- 1792 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
- 1817 | SPEC_RULE_OP1,
- 1822 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
- 1847 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
- 1872 | SPEC_RULE_OP1,
- 1877 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
- 1902 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
- 1927 | SPEC_RULE_OP1,
- 1932 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
- 1957 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
- 1982 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
- 2007,
- 2008 | SPEC_RULE_QUICK_ARG,
- 2010,
- 2011,
- 2012,
- 2013,
- 2014,
- 2015,
- 2016,
- 2017 | SPEC_RULE_OP1,
- 2022 | SPEC_RULE_OP2,
- 2027 | SPEC_RULE_OP1,
- 2032 | SPEC_RULE_OP1,
- 2037 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
- 2062 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
- 2087 | SPEC_RULE_OP1,
- 2092 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
- 2117 | SPEC_RULE_OP1 | SPEC_RULE_QUICK_ARG,
- 2127 | SPEC_RULE_OP1,
- 2132 | SPEC_RULE_OP2,
- 2137,
- 2138 | SPEC_RULE_OP1,
+ 1581 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
+ 1606 | SPEC_RULE_OP1,
+ 1611 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
+ 1636 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
+ 1661 | SPEC_RULE_OP1,
+ 1666 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
+ 1691 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
+ 1716 | SPEC_RULE_OP1,
+ 1721 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
+ 1746 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
+ 1771 | SPEC_RULE_OP1,
+ 1776 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
+ 1801 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
+ 1826 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
+ 1851,
+ 1852 | SPEC_RULE_QUICK_ARG,
+ 1854,
+ 1855,
+ 1856,
+ 1857,
+ 1858,
+ 1859,
+ 1860,
+ 1861 | SPEC_RULE_OP1,
+ 1866 | SPEC_RULE_OP2,
+ 1871 | SPEC_RULE_OP1,
+ 1876 | SPEC_RULE_OP1,
+ 1881 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
+ 1906 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
+ 1931 | SPEC_RULE_OP1,
+ 1936 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
+ 1961 | SPEC_RULE_OP1 | SPEC_RULE_QUICK_ARG,
+ 1971 | SPEC_RULE_OP1,
+ 1976 | SPEC_RULE_OP2,
+ 1981,
+ 1982 | SPEC_RULE_OP1,
+ 1987 | SPEC_RULE_OP1,
+ 1992,
+ 1993 | SPEC_RULE_OP1,
+ 1998 | SPEC_RULE_OP1,
+ 2003 | SPEC_RULE_OP1,
+ 2008,
+ 2009,
+ 2010 | SPEC_RULE_OP2,
+ 2015 | SPEC_RULE_RETVAL,
+ 2017 | SPEC_RULE_RETVAL,
+ 2019 | SPEC_RULE_RETVAL,
+ 2021 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
+ 2021 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
+ 2046 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
+ 2046 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
+ 2071 | SPEC_RULE_OP1,
+ 2076,
+ 2077 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
+ 2102,
+ 2103 | SPEC_RULE_OP1,
+ 2108,
+ 2109,
+ 2110,
+ 2111,
+ 2112,
+ 2113,
+ 2114,
+ 2115 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
+ 2140,
+ 2141,
+ 2142,
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
+ 2149 | SPEC_RULE_ISSET,
+ 2151 | SPEC_RULE_OP2,
+ 2156,
+ 2157,
+ 2158,
+ 2159,
+ 2160 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
+ 2185 | SPEC_RULE_OP1,
+ 2190,
+ 2191,
+ 2192,
+ 2193,
+ 2194 | SPEC_RULE_OP1,
+ 2199,
+ 2200,
+ 2201 | SPEC_RULE_OP1,
+ 2206 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
+ 2231,
+ 2232 | SPEC_RULE_OP1,
+ 2237,
+ 2238,
+ 2239,
+ 2240,
+ 2241,
+ 2242,
+ 2243,
+ 2244,
+ 2245 | SPEC_RULE_OP1,
+ 2250,
+ 2251,
+ 2252,
+ 2253,
+ 2254,
+ 2255 | SPEC_RULE_OP1,
+ 2260 | SPEC_RULE_OP1,
+ 2265 | SPEC_RULE_OP1,
+ 2270 | SPEC_RULE_OP1,
+ 2275 | SPEC_RULE_OP1,
+ 2280,
+ 2281 | SPEC_RULE_OP1,
+ 2286 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
+ 3203
};
#if (ZEND_VM_KIND == ZEND_VM_KIND_HYBRID)
zend_opcode_handler_funcs = labels;
@@ -65080,13 +61276,18 @@ void zend_vm_init(void)
VM_TRACE_START();
}
+static HashTable *zend_handlers_table = NULL;
+
void zend_vm_dtor(void)
{
VM_TRACE_END();
+ if (zend_handlers_table) {
+ zend_hash_destroy(zend_handlers_table);
+ free(zend_handlers_table);
+ zend_handlers_table = NULL;
+ }
}
-static HashTable *zend_handlers_table = NULL;
-
static void init_opcode_serialiser(void)
{
int i;
@@ -65168,10 +61369,15 @@ static const void* ZEND_FASTCALL zend_vm_get_opcode_handler_ex(uint32_t spec, co
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_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) {
+ 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_OP_DATA) {
+ offset = offset * 5 + zend_vm_decode[(op + 1)->op1_type];
+ } else if (spec & SPEC_RULE_ISSET) {
+ offset = offset * 2 + (op->extended_value & ZEND_ISEMPTY);
+ } else if (spec & SPEC_RULE_SMART_BRANCH) {
offset = offset * 3;
if ((op+1)->opcode == ZEND_JMPZ) {
offset += 1;
@@ -65179,15 +61385,6 @@ static const void* ZEND_FASTCALL zend_vm_get_opcode_handler_ex(uint32_t spec, co
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];
}
@@ -65229,14 +61426,6 @@ static const void *zend_vm_get_opcode_handler_func(zend_uchar opcode, const zend
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];
@@ -65266,7 +61455,7 @@ ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t
if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
break;
}
- spec = 3028 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE;
+ spec = 2312 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE;
if (op->op1_type < op->op2_type) {
zend_swap_operands(op);
}
@@ -65274,7 +61463,7 @@ ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t
if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
break;
}
- spec = 3053 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE;
+ spec = 2337 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE;
if (op->op1_type < op->op2_type) {
zend_swap_operands(op);
}
@@ -65282,7 +61471,7 @@ ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t
if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
break;
}
- spec = 3078 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE;
+ spec = 2362 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE;
if (op->op1_type < op->op2_type) {
zend_swap_operands(op);
}
@@ -65293,17 +61482,17 @@ ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t
if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
break;
}
- spec = 3103 | SPEC_RULE_OP1 | SPEC_RULE_OP2;
+ spec = 2387 | 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 = 3128 | SPEC_RULE_OP1 | SPEC_RULE_OP2;
+ spec = 2412 | 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 = 3153 | SPEC_RULE_OP1 | SPEC_RULE_OP2;
+ spec = 2437 | SPEC_RULE_OP1 | SPEC_RULE_OP2;
}
break;
case ZEND_MUL:
@@ -65314,17 +61503,17 @@ ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t
if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
break;
}
- spec = 3178 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE;
+ spec = 2462 | 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 = 3203 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE;
+ spec = 2487 | 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 = 3228 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE;
+ spec = 2512 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE;
}
break;
case ZEND_IS_EQUAL:
@@ -65335,12 +61524,12 @@ ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t
if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
break;
}
- spec = 3253 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE;
+ spec = 2537 | 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 = 3328 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE;
+ spec = 2612 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE;
}
break;
case ZEND_IS_NOT_EQUAL:
@@ -65351,12 +61540,12 @@ ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t
if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
break;
}
- spec = 3403 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE;
+ spec = 2687 | 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 = 3478 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE;
+ spec = 2762 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE;
}
break;
case ZEND_IS_SMALLER:
@@ -65364,12 +61553,12 @@ ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t
if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
break;
}
- spec = 3553 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH;
+ spec = 2837 | 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 = 3628 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH;
+ spec = 2912 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH;
}
break;
case ZEND_IS_SMALLER_OR_EQUAL:
@@ -65377,75 +61566,69 @@ ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t
if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
break;
}
- spec = 3703 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH;
+ spec = 2987 | 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 = 3778 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH;
+ spec = 3062 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH;
}
break;
case ZEND_QM_ASSIGN:
- if (op1_info == MAY_BE_DOUBLE) {
- spec = 3871 | SPEC_RULE_OP1;
+ if (op1_info == MAY_BE_LONG) {
+ spec = 3149 | SPEC_RULE_OP1;
+ } else if (op1_info == MAY_BE_DOUBLE) {
+ spec = 3154 | 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;
+ spec = 3159 | SPEC_RULE_OP1;
}
break;
case ZEND_PRE_INC:
if (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG) {
- spec = 3853 | SPEC_RULE_RETVAL;
+ spec = 3137 | SPEC_RULE_RETVAL;
} else if (op1_info == MAY_BE_LONG) {
- spec = 3855 | SPEC_RULE_RETVAL;
- } else if (op1_info == (MAY_BE_LONG|MAY_BE_DOUBLE)) {
- spec = 3857 | SPEC_RULE_RETVAL;
+ spec = 3139 | SPEC_RULE_RETVAL;
}
break;
case ZEND_PRE_DEC:
if (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG) {
- spec = 3859 | SPEC_RULE_RETVAL;
+ spec = 3141 | SPEC_RULE_RETVAL;
} else if (op1_info == MAY_BE_LONG) {
- spec = 3861 | SPEC_RULE_RETVAL;
- } else if (op1_info == (MAY_BE_LONG|MAY_BE_DOUBLE)) {
- spec = 3863 | SPEC_RULE_RETVAL;
+ spec = 3143 | SPEC_RULE_RETVAL;
}
break;
case ZEND_POST_INC:
if (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG) {
- spec = 3865;
+ spec = 3145;
} else if (op1_info == MAY_BE_LONG) {
- spec = 3866;
- } else if (op1_info == (MAY_BE_LONG|MAY_BE_DOUBLE)) {
- spec = 3867;
+ spec = 3146;
}
break;
case ZEND_POST_DEC:
if (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG) {
- spec = 3868;
+ spec = 3147;
} else if (op1_info == MAY_BE_LONG) {
- spec = 3869;
- } else if (op1_info == (MAY_BE_LONG|MAY_BE_DOUBLE)) {
- spec = 3870;
+ spec = 3148;
}
break;
case ZEND_JMP:
if (OP_JMP_ADDR(op, op->op1) > op) {
- spec = 3027;
+ spec = 2311;
}
break;
case ZEND_SEND_VAL:
if (op->op1_type == IS_CONST && !Z_REFCOUNTED_P(RT_CONSTANT(op, op->op1))) {
- spec = 3916;
+ spec = 3199;
}
break;
case ZEND_SEND_VAR_EX:
if (op->op2.num <= MAX_ARG_FLAG_NUM && (op1_info & (MAY_BE_UNDEF|MAY_BE_REF)) == 0) {
- spec = 3911 | SPEC_RULE_OP1;
+ spec = 3194 | 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 = 3918 | SPEC_RULE_RETVAL;
+ spec = 3201 | SPEC_RULE_RETVAL;
}
break;
case ZEND_FETCH_DIM_R:
@@ -65453,17 +61636,17 @@ ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t
if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
break;
}
- spec = 3881 | SPEC_RULE_OP1 | SPEC_RULE_OP2;
+ spec = 3164 | 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;
+ spec = 3200;
}
break;
case ZEND_SEND_VAR:
if ((op1_info & (MAY_BE_UNDEF|MAY_BE_REF)) == 0) {
- spec = 3906 | SPEC_RULE_OP1;
+ spec = 3189 | SPEC_RULE_OP1;
}
break;
case ZEND_BW_OR:
diff --git a/Zend/zend_vm_execute.skl b/Zend/zend_vm_execute.skl
index 30f0017cbd..170fc300bb 100644
--- a/Zend/zend_vm_execute.skl
+++ b/Zend/zend_vm_execute.skl
@@ -1,5 +1,10 @@
{%DEFINES%}
+#if (ZEND_VM_KIND != ZEND_VM_KIND_CALL) && (ZEND_GCC_VERSION >= 4000) && !defined(__clang__)
+# pragma GCC push_options
+# pragma GCC optimize("no-gcse")
+# pragma GCC optimize("no-ivopts")
+#endif
ZEND_API void {%EXECUTOR_NAME%}_ex(zend_execute_data *ex)
{
DCL_OPLINE
@@ -20,17 +25,29 @@ ZEND_API void {%EXECUTOR_NAME%}_ex(zend_execute_data *ex)
}
zend_error_noreturn(E_CORE_ERROR, "Arrived at end of main loop which shouldn't happen");
}
+#if (ZEND_VM_KIND != ZEND_VM_KIND_CALL) && (ZEND_GCC_VERSION >= 4000) && !defined(__clang__)
+# pragma GCC pop_options
+#endif
ZEND_API void zend_{%EXECUTOR_NAME%}(zend_op_array *op_array, zval *return_value)
{
zend_execute_data *execute_data;
+ void *object_or_called_scope;
+ uint32_t call_info;
if (EG(exception) != NULL) {
return;
}
- execute_data = zend_vm_stack_push_call_frame(ZEND_CALL_TOP_CODE | ZEND_CALL_HAS_SYMBOL_TABLE,
- (zend_function*)op_array, 0, zend_get_called_scope(EG(current_execute_data)), zend_get_this_object(EG(current_execute_data)));
+ object_or_called_scope = zend_get_this_object(EG(current_execute_data));
+ if (EXPECTED(!object_or_called_scope)) {
+ object_or_called_scope = zend_get_called_scope(EG(current_execute_data));
+ call_info = ZEND_CALL_TOP_CODE | ZEND_CALL_HAS_SYMBOL_TABLE;
+ } else {
+ call_info = ZEND_CALL_TOP_CODE | ZEND_CALL_HAS_SYMBOL_TABLE | ZEND_CALL_HAS_THIS;
+ }
+ execute_data = zend_vm_stack_push_call_frame(call_info,
+ (zend_function*)op_array, 0, object_or_called_scope);
if (EG(current_execute_data)) {
execute_data->symbol_table = zend_rebuild_symbol_table();
} else {
@@ -50,13 +67,18 @@ void {%INITIALIZER_NAME%}(void)
VM_TRACE_START();
}
+static HashTable *zend_handlers_table = NULL;
+
void zend_vm_dtor(void)
{
VM_TRACE_END();
+ if (zend_handlers_table) {
+ zend_hash_destroy(zend_handlers_table);
+ free(zend_handlers_table);
+ zend_handlers_table = NULL;
+ }
}
-static HashTable *zend_handlers_table = NULL;
-
static void init_opcode_serialiser(void)
{
int i;
diff --git a/Zend/zend_vm_gen.php b/Zend/zend_vm_gen.php
index d9e307d17f..22586cbd0b 100644..100755
--- a/Zend/zend_vm_gen.php
+++ b/Zend/zend_vm_gen.php
@@ -1,9 +1,10 @@
+#!/usr/bin/env php
<?php
/*
+----------------------------------------------------------------------+
| Zend Engine |
+----------------------------------------------------------------------+
- | Copyright (c) 1998-2018 Zend Technologies Ltd. (http://www.zend.com) |
+ | Copyright (c) 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 |
@@ -22,7 +23,7 @@ const HEADER_TEXT = <<< DATA
+----------------------------------------------------------------------+
| Zend Engine |
+----------------------------------------------------------------------+
- | Copyright (c) 1998-2018 Zend Technologies Ltd. (http://www.zend.com) |
+ | Copyright (c) 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 |
@@ -42,8 +43,8 @@ const HEADER_TEXT = <<< DATA
DATA;
/*
- This script creates zend_vm_execute.h and zend_vm_opcodes.h
- from existing zend_vm_def.h and zend_vm_execute.skl
+ This script creates zend_vm_execute.h and zend_vm_opcodes.h
+ from existing zend_vm_def.h and zend_vm_execute.skl
*/
error_reporting(E_ALL);
@@ -54,538 +55,564 @@ const ZEND_VM_KIND_GOTO = 3;
const ZEND_VM_KIND_HYBRID = 4;
$vm_op_flags = array(
- "ZEND_VM_OP_SPEC" => 1<<0,
- "ZEND_VM_OP_CONST" => 1<<1,
- "ZEND_VM_OP_TMPVAR" => 1<<2,
- "ZEND_VM_OP_TMPVARCV" => 1<<3,
- "ZEND_VM_OP_MASK" => 0xf0,
- "ZEND_VM_OP_NUM" => 0x10,
- "ZEND_VM_OP_JMP_ADDR" => 0x20,
- "ZEND_VM_OP_TRY_CATCH" => 0x30,
- // 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_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,
- "ZEND_VM_EXT_LAST_CATCH" => 0x02000000,
- "ZEND_VM_EXT_JMP_ADDR" => 0x03000000,
- "ZEND_VM_EXT_DIM_OBJ" => 0x04000000,
+ "ZEND_VM_OP_SPEC" => 1<<0,
+ "ZEND_VM_OP_CONST" => 1<<1,
+ "ZEND_VM_OP_TMPVAR" => 1<<2,
+ "ZEND_VM_OP_TMPVARCV" => 1<<3,
+ "ZEND_VM_OP_MASK" => 0xf0,
+ "ZEND_VM_OP_NUM" => 0x10,
+ "ZEND_VM_OP_JMP_ADDR" => 0x20,
+ "ZEND_VM_OP_TRY_CATCH" => 0x30,
+ // 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_CACHE_SLOT" => 1<<18,
+ "ZEND_VM_EXT_ARRAY_INIT" => 1<<19,
+ "ZEND_VM_EXT_REF" => 1<<20,
+ "ZEND_VM_EXT_FETCH_REF" => 1<<21,
+ "ZEND_VM_EXT_DIM_OBJ_WRITE" => 1<<22,
+ "ZEND_VM_EXT_MASK" => 0x0f000000,
+ "ZEND_VM_EXT_NUM" => 0x01000000,
+ "ZEND_VM_EXT_LAST_CATCH" => 0x02000000,
+ "ZEND_VM_EXT_JMP_ADDR" => 0x03000000,
+ "ZEND_VM_EXT_OP" => 0x04000000,
// unused 0x5000000
// unused 0x6000000
- "ZEND_VM_EXT_TYPE" => 0x07000000,
- "ZEND_VM_EXT_EVAL" => 0x08000000,
- "ZEND_VM_EXT_TYPE_MASK" => 0x09000000,
- // unused 0x0a000000,
- "ZEND_VM_EXT_SRC" => 0x0b000000,
- // unused 0x0c000000,
- "ZEND_VM_NO_CONST_CONST" => 0x40000000,
- "ZEND_VM_COMMUTATIVE" => 0x80000000,
+ "ZEND_VM_EXT_TYPE" => 0x07000000,
+ "ZEND_VM_EXT_EVAL" => 0x08000000,
+ "ZEND_VM_EXT_TYPE_MASK" => 0x09000000,
+ // unused 0x0a000000,
+ "ZEND_VM_EXT_SRC" => 0x0b000000,
+ // unused 0x0c000000,
+ "ZEND_VM_NO_CONST_CONST" => 0x40000000,
+ "ZEND_VM_COMMUTATIVE" => 0x80000000,
);
foreach ($vm_op_flags as $name => $val) {
- define($name, $val);
+ define($name, $val);
}
$vm_op_decode = array(
- "ANY" => 0,
- "CONST" => ZEND_VM_OP_SPEC | ZEND_VM_OP_CONST,
- "TMP" => ZEND_VM_OP_SPEC,
- "VAR" => ZEND_VM_OP_SPEC,
- "UNUSED" => ZEND_VM_OP_SPEC,
- "CV" => ZEND_VM_OP_SPEC,
- "TMPVAR" => ZEND_VM_OP_SPEC | ZEND_VM_OP_TMPVAR,
- "TMPVARCV" => ZEND_VM_OP_SPEC | ZEND_VM_OP_TMPVARCV,
- "NUM" => ZEND_VM_OP_NUM,
- "JMP_ADDR" => ZEND_VM_OP_JMP_ADDR,
- "TRY_CATCH" => ZEND_VM_OP_TRY_CATCH,
- "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,
+ "ANY" => 0,
+ "CONST" => ZEND_VM_OP_SPEC | ZEND_VM_OP_CONST,
+ "TMP" => ZEND_VM_OP_SPEC,
+ "VAR" => ZEND_VM_OP_SPEC,
+ "UNUSED" => ZEND_VM_OP_SPEC,
+ "CV" => ZEND_VM_OP_SPEC,
+ "TMPVAR" => ZEND_VM_OP_SPEC | ZEND_VM_OP_TMPVAR,
+ "TMPVARCV" => ZEND_VM_OP_SPEC | ZEND_VM_OP_TMPVARCV,
+ "NUM" => ZEND_VM_OP_NUM,
+ "JMP_ADDR" => ZEND_VM_OP_JMP_ADDR,
+ "TRY_CATCH" => ZEND_VM_OP_TRY_CATCH,
+ "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,
- "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,
- "REF" => ZEND_VM_EXT_REF,
- "SRC" => ZEND_VM_EXT_SRC,
- "CACHE_SLOT" => ZEND_VM_EXT_CACHE_SLOT,
+ "NUM" => ZEND_VM_EXT_NUM,
+ "LAST_CATCH" => ZEND_VM_EXT_LAST_CATCH,
+ "JMP_ADDR" => ZEND_VM_EXT_JMP_ADDR,
+ "OP" => ZEND_VM_EXT_OP,
+ "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,
+ "REF" => ZEND_VM_EXT_REF,
+ "FETCH_REF" => ZEND_VM_EXT_FETCH_REF,
+ "SRC" => ZEND_VM_EXT_SRC,
+ "CACHE_SLOT" => ZEND_VM_EXT_CACHE_SLOT,
+ "DIM_OBJ_WRITE" => ZEND_VM_EXT_DIM_OBJ_WRITE,
);
$vm_kind_name = array(
- ZEND_VM_KIND_CALL => "ZEND_VM_KIND_CALL",
- ZEND_VM_KIND_SWITCH => "ZEND_VM_KIND_SWITCH",
- ZEND_VM_KIND_GOTO => "ZEND_VM_KIND_GOTO",
- ZEND_VM_KIND_HYBRID => "ZEND_VM_KIND_HYBRID",
+ ZEND_VM_KIND_CALL => "ZEND_VM_KIND_CALL",
+ ZEND_VM_KIND_SWITCH => "ZEND_VM_KIND_SWITCH",
+ ZEND_VM_KIND_GOTO => "ZEND_VM_KIND_GOTO",
+ ZEND_VM_KIND_HYBRID => "ZEND_VM_KIND_HYBRID",
);
$op_types = array(
- "ANY",
- "CONST",
- "TMP",
- "VAR",
- "UNUSED",
- "CV"
+ "ANY",
+ "CONST",
+ "TMP",
+ "VAR",
+ "UNUSED",
+ "CV"
);
$op_types_ex = array(
- "ANY",
- "CONST",
- "TMPVARCV",
- "TMPVAR",
- "TMP",
- "VAR",
- "UNUSED",
- "CV",
+ "ANY",
+ "CONST",
+ "TMPVARCV",
+ "TMPVAR",
+ "TMP",
+ "VAR",
+ "UNUSED",
+ "CV",
);
$prefix = array(
- "ANY" => "",
- "TMP" => "_TMP",
- "VAR" => "_VAR",
- "CONST" => "_CONST",
- "UNUSED" => "_UNUSED",
- "CV" => "_CV",
- "TMPVAR" => "_TMPVAR",
- "TMPVARCV" => "_TMPVARCV",
+ "ANY" => "",
+ "TMP" => "_TMP",
+ "VAR" => "_VAR",
+ "CONST" => "_CONST",
+ "UNUSED" => "_UNUSED",
+ "CV" => "_CV",
+ "TMPVAR" => "_TMPVAR",
+ "TMPVARCV" => "_TMPVARCV",
);
$commutative_order = array(
- "ANY" => 0,
- "TMP" => 1,
- "VAR" => 2,
- "CONST" => 0,
- "UNUSED" => 0,
- "CV" => 4,
- "TMPVAR" => 2,
- "TMPVARCV" => 4,
+ "ANY" => 0,
+ "TMP" => 1,
+ "VAR" => 2,
+ "CONST" => 0,
+ "UNUSED" => 0,
+ "CV" => 4,
+ "TMPVAR" => 2,
+ "TMPVARCV" => 4,
);
$op1_type = array(
- "ANY" => "opline->op1_type",
- "TMP" => "IS_TMP_VAR",
- "VAR" => "IS_VAR",
- "CONST" => "IS_CONST",
- "UNUSED" => "IS_UNUSED",
- "CV" => "IS_CV",
- "TMPVAR" => "(IS_TMP_VAR|IS_VAR)",
- "TMPVARCV" => "(IS_TMP_VAR|IS_VAR|IS_CV)",
+ "ANY" => "opline->op1_type",
+ "TMP" => "IS_TMP_VAR",
+ "VAR" => "IS_VAR",
+ "CONST" => "IS_CONST",
+ "UNUSED" => "IS_UNUSED",
+ "CV" => "IS_CV",
+ "TMPVAR" => "(IS_TMP_VAR|IS_VAR)",
+ "TMPVARCV" => "(IS_TMP_VAR|IS_VAR|IS_CV)",
);
$op2_type = array(
- "ANY" => "opline->op2_type",
- "TMP" => "IS_TMP_VAR",
- "VAR" => "IS_VAR",
- "CONST" => "IS_CONST",
- "UNUSED" => "IS_UNUSED",
- "CV" => "IS_CV",
- "TMPVAR" => "(IS_TMP_VAR|IS_VAR)",
- "TMPVARCV" => "(IS_TMP_VAR|IS_VAR|IS_CV)",
+ "ANY" => "opline->op2_type",
+ "TMP" => "IS_TMP_VAR",
+ "VAR" => "IS_VAR",
+ "CONST" => "IS_CONST",
+ "UNUSED" => "IS_UNUSED",
+ "CV" => "IS_CV",
+ "TMPVAR" => "(IS_TMP_VAR|IS_VAR)",
+ "TMPVARCV" => "(IS_TMP_VAR|IS_VAR|IS_CV)",
);
$op1_free = array(
- "ANY" => "(free_op1 != NULL)",
- "TMP" => "1",
- "VAR" => "(free_op1 != NULL)",
- "CONST" => "0",
- "UNUSED" => "0",
- "CV" => "0",
- "TMPVAR" => "???",
- "TMPVARCV" => "???",
+ "ANY" => "(free_op1 != NULL)",
+ "TMP" => "1",
+ "VAR" => "(free_op1 != NULL)",
+ "CONST" => "0",
+ "UNUSED" => "0",
+ "CV" => "0",
+ "TMPVAR" => "???",
+ "TMPVARCV" => "???",
);
$op2_free = array(
- "ANY" => "(free_op2 != NULL)",
- "TMP" => "1",
- "VAR" => "(free_op2 != NULL)",
- "CONST" => "0",
- "UNUSED" => "0",
- "CV" => "0",
- "TMPVAR" => "???",
- "TMPVARCV" => "???",
+ "ANY" => "(free_op2 != NULL)",
+ "TMP" => "1",
+ "VAR" => "(free_op2 != NULL)",
+ "CONST" => "0",
+ "UNUSED" => "0",
+ "CV" => "0",
+ "TMPVAR" => "???",
+ "TMPVARCV" => "???",
);
$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" => "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)",
- "TMPVARCV" => "???",
+ "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" => "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)",
+ "TMPVARCV" => "???",
);
$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" => "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)",
- "TMPVARCV" => "???",
+ "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" => "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)",
+ "TMPVARCV" => "???",
);
$op1_get_zval_ptr_ptr = array(
- "ANY" => "get_zval_ptr_ptr(opline->op1_type, opline->op1, &free_op1, \\1)",
- "TMP" => "NULL",
- "VAR" => "_get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC)",
- "CONST" => "NULL",
- "UNUSED" => "NULL",
- "CV" => "_get_zval_ptr_cv_\\1(opline->op1.var EXECUTE_DATA_CC)",
- "TMPVAR" => "???",
- "TMPVARCV" => "???",
+ "ANY" => "get_zval_ptr_ptr(opline->op1_type, opline->op1, &free_op1, \\1)",
+ "TMP" => "NULL",
+ "VAR" => "_get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC)",
+ "CONST" => "NULL",
+ "UNUSED" => "NULL",
+ "CV" => "_get_zval_ptr_cv_\\1(opline->op1.var EXECUTE_DATA_CC)",
+ "TMPVAR" => "???",
+ "TMPVARCV" => "???",
);
$op2_get_zval_ptr_ptr = array(
- "ANY" => "get_zval_ptr_ptr(opline->op2_type, opline->op2, &free_op2, \\1)",
- "TMP" => "NULL",
- "VAR" => "_get_zval_ptr_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC)",
- "CONST" => "NULL",
- "UNUSED" => "NULL",
- "CV" => "_get_zval_ptr_cv_\\1(opline->op2.var EXECUTE_DATA_CC)",
- "TMPVAR" => "???",
- "TMPVARCV" => "???",
+ "ANY" => "get_zval_ptr_ptr(opline->op2_type, opline->op2, &free_op2, \\1)",
+ "TMP" => "NULL",
+ "VAR" => "_get_zval_ptr_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC)",
+ "CONST" => "NULL",
+ "UNUSED" => "NULL",
+ "CV" => "_get_zval_ptr_cv_\\1(opline->op2.var EXECUTE_DATA_CC)",
+ "TMPVAR" => "???",
+ "TMPVARCV" => "???",
);
$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" => "RT_CONSTANT(opline, opline->op1)",
- "UNUSED" => "NULL",
- "CV" => "_get_zval_ptr_cv_deref_\\1(opline->op1.var EXECUTE_DATA_CC)",
- "TMPVAR" => "???",
- "TMPVARCV" => "???",
+ "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" => "RT_CONSTANT(opline, opline->op1)",
+ "UNUSED" => "NULL",
+ "CV" => "_get_zval_ptr_cv_deref_\\1(opline->op1.var EXECUTE_DATA_CC)",
+ "TMPVAR" => "???",
+ "TMPVARCV" => "???",
);
$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" => "RT_CONSTANT(opline, opline->op2)",
- "UNUSED" => "NULL",
- "CV" => "_get_zval_ptr_cv_deref_\\1(opline->op2.var EXECUTE_DATA_CC)",
- "TMPVAR" => "???",
- "TMPVARCV" => "???",
+ "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" => "RT_CONSTANT(opline, opline->op2)",
+ "UNUSED" => "NULL",
+ "CV" => "_get_zval_ptr_cv_deref_\\1(opline->op2.var EXECUTE_DATA_CC)",
+ "TMPVAR" => "???",
+ "TMPVARCV" => "???",
);
$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" => "RT_CONSTANT(opline, opline->op1)",
- "UNUSED" => "NULL",
- "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)",
+ "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" => "RT_CONSTANT(opline, opline->op1)",
+ "UNUSED" => "NULL",
+ "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)",
);
$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" => "RT_CONSTANT(opline, opline->op2)",
- "UNUSED" => "NULL",
- "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)",
+ "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" => "RT_CONSTANT(opline, opline->op2)",
+ "UNUSED" => "NULL",
+ "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)",
);
$op1_get_zval_ptr_ptr_undef = array(
- "ANY" => "get_zval_ptr_ptr_undef(opline->op1_type, opline->op1, &free_op1, \\1)",
- "TMP" => "NULL",
- "VAR" => "_get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC)",
- "CONST" => "NULL",
- "UNUSED" => "NULL",
- "CV" => "EX_VAR(opline->op1.var)",
- "TMPVAR" => "???",
- "TMPVARCV" => "???",
+ "ANY" => "get_zval_ptr_ptr_undef(opline->op1_type, opline->op1, &free_op1, \\1)",
+ "TMP" => "NULL",
+ "VAR" => "_get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC)",
+ "CONST" => "NULL",
+ "UNUSED" => "NULL",
+ "CV" => "EX_VAR(opline->op1.var)",
+ "TMPVAR" => "???",
+ "TMPVARCV" => "???",
);
$op2_get_zval_ptr_ptr_undef = array(
- "ANY" => "get_zval_ptr_ptr_undef(opline->op2_type, opline->op2, &free_op2, \\1)",
- "TMP" => "NULL",
- "VAR" => "_get_zval_ptr_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC)",
- "CONST" => "NULL",
- "UNUSED" => "NULL",
- "CV" => "EX_VAR(opline->op2.var)",
- "TMPVAR" => "???",
- "TMPVARCV" => "???",
+ "ANY" => "get_zval_ptr_ptr_undef(opline->op2_type, opline->op2, &free_op2, \\1)",
+ "TMP" => "NULL",
+ "VAR" => "_get_zval_ptr_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC)",
+ "CONST" => "NULL",
+ "UNUSED" => "NULL",
+ "CV" => "EX_VAR(opline->op2.var)",
+ "TMPVAR" => "???",
+ "TMPVARCV" => "???",
);
$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" => "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" => "???",
+ "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" => "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" => "???",
);
$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" => "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" => "???",
+ "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" => "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" => "???",
);
$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" => "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)",
+ "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" => "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)",
);
$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" => "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)",
+ "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" => "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)",
);
$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" => "RT_CONSTANT(opline, opline->op1)",
- "UNUSED" => "&EX(This)",
- "CV" => "_get_zval_ptr_cv_deref_\\1(opline->op1.var EXECUTE_DATA_CC)",
- "TMPVAR" => "???",
- "TMPVARCV" => "???",
+ "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" => "RT_CONSTANT(opline, opline->op1)",
+ "UNUSED" => "&EX(This)",
+ "CV" => "_get_zval_ptr_cv_deref_\\1(opline->op1.var EXECUTE_DATA_CC)",
+ "TMPVAR" => "???",
+ "TMPVARCV" => "???",
);
$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" => "RT_CONSTANT(opline, opline->op2)",
- "UNUSED" => "&EX(This)",
- "CV" => "_get_zval_ptr_cv_deref_\\1(opline->op2.var EXECUTE_DATA_CC)",
- "TMPVAR" => "???",
- "TMPVARCV" => "???",
+ "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" => "RT_CONSTANT(opline, opline->op2)",
+ "UNUSED" => "&EX(This)",
+ "CV" => "_get_zval_ptr_cv_deref_\\1(opline->op2.var EXECUTE_DATA_CC)",
+ "TMPVAR" => "???",
+ "TMPVARCV" => "???",
);
$op1_get_obj_zval_ptr_ptr = array(
- "ANY" => "get_obj_zval_ptr_ptr(opline->op1_type, opline->op1, &free_op1, \\1)",
- "TMP" => "NULL",
- "VAR" => "_get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC)",
- "CONST" => "NULL",
- "UNUSED" => "&EX(This)",
- "CV" => "_get_zval_ptr_cv_\\1(opline->op1.var EXECUTE_DATA_CC)",
- "TMPVAR" => "???",
- "TMPVARCV" => "???",
+ "ANY" => "get_obj_zval_ptr_ptr(opline->op1_type, opline->op1, &free_op1, \\1)",
+ "TMP" => "NULL",
+ "VAR" => "_get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC)",
+ "CONST" => "NULL",
+ "UNUSED" => "&EX(This)",
+ "CV" => "_get_zval_ptr_cv_\\1(opline->op1.var EXECUTE_DATA_CC)",
+ "TMPVAR" => "???",
+ "TMPVARCV" => "???",
);
$op2_get_obj_zval_ptr_ptr = array(
- "ANY" => "get_obj_zval_ptr_ptr(opline->op2_type, opline->op2, &free_op2, \\1)",
- "TMP" => "NULL",
- "VAR" => "_get_zval_ptr_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC)",
- "CONST" => "NULL",
- "UNUSED" => "&EX(This)",
- "CV" => "_get_zval_ptr_cv_\\1(opline->op2.var EXECUTE_DATA_CC)",
- "TMPVAR" => "???",
- "TMPVARCV" => "???",
+ "ANY" => "get_obj_zval_ptr_ptr(opline->op2_type, opline->op2, &free_op2, \\1)",
+ "TMP" => "NULL",
+ "VAR" => "_get_zval_ptr_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC)",
+ "CONST" => "NULL",
+ "UNUSED" => "&EX(This)",
+ "CV" => "_get_zval_ptr_cv_\\1(opline->op2.var EXECUTE_DATA_CC)",
+ "TMPVAR" => "???",
+ "TMPVARCV" => "???",
);
$op1_get_obj_zval_ptr_ptr_undef = array(
- "ANY" => "get_obj_zval_ptr_ptr(opline->op1_type, opline->op1, &free_op1, \\1)",
- "TMP" => "NULL",
- "VAR" => "_get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC)",
- "CONST" => "NULL",
- "UNUSED" => "&EX(This)",
- "CV" => "EX_VAR(opline->op1.var)",
- "TMPVAR" => "???",
- "TMPVARCV" => "???",
+ "ANY" => "get_obj_zval_ptr_ptr(opline->op1_type, opline->op1, &free_op1, \\1)",
+ "TMP" => "NULL",
+ "VAR" => "_get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC)",
+ "CONST" => "NULL",
+ "UNUSED" => "&EX(This)",
+ "CV" => "EX_VAR(opline->op1.var)",
+ "TMPVAR" => "???",
+ "TMPVARCV" => "???",
);
$op2_get_obj_zval_ptr_ptr_undef = array(
- "ANY" => "get_obj_zval_ptr_ptr(opline->op2_type, opline->op2, &free_op2, \\1)",
- "TMP" => "NULL",
- "VAR" => "_get_zval_ptr_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC)",
- "CONST" => "NULL",
- "UNUSED" => "&EX(This)",
- "CV" => "EX_VAR(opline->op2.var)",
- "TMPVAR" => "???",
- "TMPVARCV" => "???",
+ "ANY" => "get_obj_zval_ptr_ptr(opline->op2_type, opline->op2, &free_op2, \\1)",
+ "TMP" => "NULL",
+ "VAR" => "_get_zval_ptr_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC)",
+ "CONST" => "NULL",
+ "UNUSED" => "&EX(This)",
+ "CV" => "EX_VAR(opline->op2.var)",
+ "TMPVAR" => "???",
+ "TMPVARCV" => "???",
);
$op1_free_op = array(
- "ANY" => "FREE_OP(free_op1)",
- "TMP" => "zval_ptr_dtor_nogc(free_op1)",
- "VAR" => "zval_ptr_dtor_nogc(free_op1)",
- "CONST" => "",
- "UNUSED" => "",
- "CV" => "",
- "TMPVAR" => "zval_ptr_dtor_nogc(free_op1)",
- "TMPVARCV" => "???",
+ "ANY" => "FREE_OP(free_op1)",
+ "TMP" => "zval_ptr_dtor_nogc(free_op1)",
+ "VAR" => "zval_ptr_dtor_nogc(free_op1)",
+ "CONST" => "",
+ "UNUSED" => "",
+ "CV" => "",
+ "TMPVAR" => "zval_ptr_dtor_nogc(free_op1)",
+ "TMPVARCV" => "???",
);
$op2_free_op = array(
- "ANY" => "FREE_OP(free_op2)",
- "TMP" => "zval_ptr_dtor_nogc(free_op2)",
- "VAR" => "zval_ptr_dtor_nogc(free_op2)",
- "CONST" => "",
- "UNUSED" => "",
- "CV" => "",
- "TMPVAR" => "zval_ptr_dtor_nogc(free_op2)",
- "TMPVARCV" => "???",
+ "ANY" => "FREE_OP(free_op2)",
+ "TMP" => "zval_ptr_dtor_nogc(free_op2)",
+ "VAR" => "zval_ptr_dtor_nogc(free_op2)",
+ "CONST" => "",
+ "UNUSED" => "",
+ "CV" => "",
+ "TMPVAR" => "zval_ptr_dtor_nogc(free_op2)",
+ "TMPVARCV" => "???",
);
$op1_free_op_if_var = array(
- "ANY" => "if (opline->op1_type == IS_VAR) {zval_ptr_dtor_nogc(free_op1);}",
- "TMP" => "",
- "VAR" => "zval_ptr_dtor_nogc(free_op1)",
- "CONST" => "",
- "UNUSED" => "",
- "CV" => "",
- "TMPVAR" => "???",
- "TMPVARCV" => "???",
+ "ANY" => "if (opline->op1_type == IS_VAR) {zval_ptr_dtor_nogc(free_op1);}",
+ "TMP" => "",
+ "VAR" => "zval_ptr_dtor_nogc(free_op1)",
+ "CONST" => "",
+ "UNUSED" => "",
+ "CV" => "",
+ "TMPVAR" => "???",
+ "TMPVARCV" => "???",
);
$op2_free_op_if_var = array(
- "ANY" => "if (opline->op2_type == IS_VAR) {zval_ptr_dtor_nogc(free_op2);}",
- "TMP" => "",
- "VAR" => "zval_ptr_dtor_nogc(free_op2)",
- "CONST" => "",
- "UNUSED" => "",
- "CV" => "",
- "TMPVAR" => "???",
- "TMPVARCV" => "???",
+ "ANY" => "if (opline->op2_type == IS_VAR) {zval_ptr_dtor_nogc(free_op2);}",
+ "TMP" => "",
+ "VAR" => "zval_ptr_dtor_nogc(free_op2)",
+ "CONST" => "",
+ "UNUSED" => "",
+ "CV" => "",
+ "TMPVAR" => "???",
+ "TMPVARCV" => "???",
);
$op1_free_op_var_ptr = array(
- "ANY" => "if (free_op1) {zval_ptr_dtor_nogc(free_op1);}",
- "TMP" => "",
- "VAR" => "if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}",
- "CONST" => "",
- "UNUSED" => "",
- "CV" => "",
- "TMPVAR" => "???",
- "TMPVARCV" => "???",
+ "ANY" => "if (free_op1) {zval_ptr_dtor_nogc(free_op1);}",
+ "TMP" => "",
+ "VAR" => "if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}",
+ "CONST" => "",
+ "UNUSED" => "",
+ "CV" => "",
+ "TMPVAR" => "???",
+ "TMPVARCV" => "???",
);
$op2_free_op_var_ptr = array(
- "ANY" => "if (free_op2) {zval_ptr_dtor_nogc(free_op2);}",
- "TMP" => "",
- "VAR" => "if (UNEXPECTED(free_op2)) {zval_ptr_dtor_nogc(free_op2);}",
- "CONST" => "",
- "UNUSED" => "",
- "CV" => "",
- "TMPVAR" => "???",
- "TMPVARCV" => "???",
+ "ANY" => "if (free_op2) {zval_ptr_dtor_nogc(free_op2);}",
+ "TMP" => "",
+ "VAR" => "if (UNEXPECTED(free_op2)) {zval_ptr_dtor_nogc(free_op2);}",
+ "CONST" => "",
+ "UNUSED" => "",
+ "CV" => "",
+ "TMPVAR" => "???",
+ "TMPVARCV" => "???",
);
$op1_free_unfetched = array(
- "ANY" => "FREE_UNFETCHED_OP(opline->op1_type, opline->op1.var)",
- "TMP" => "zval_ptr_dtor_nogc(EX_VAR(opline->op1.var))",
- "VAR" => "zval_ptr_dtor_nogc(EX_VAR(opline->op1.var))",
- "CONST" => "",
- "UNUSED" => "",
- "CV" => "",
- "TMPVAR" => "zval_ptr_dtor_nogc(EX_VAR(opline->op1.var))",
- "TMPVARCV" => "???",
+ "ANY" => "FREE_UNFETCHED_OP(opline->op1_type, opline->op1.var)",
+ "TMP" => "zval_ptr_dtor_nogc(EX_VAR(opline->op1.var))",
+ "VAR" => "zval_ptr_dtor_nogc(EX_VAR(opline->op1.var))",
+ "CONST" => "",
+ "UNUSED" => "",
+ "CV" => "",
+ "TMPVAR" => "zval_ptr_dtor_nogc(EX_VAR(opline->op1.var))",
+ "TMPVARCV" => "???",
);
$op2_free_unfetched = array(
- "ANY" => "FREE_UNFETCHED_OP(opline->op2_type, opline->op2.var)",
- "TMP" => "zval_ptr_dtor_nogc(EX_VAR(opline->op2.var))",
- "VAR" => "zval_ptr_dtor_nogc(EX_VAR(opline->op2.var))",
- "CONST" => "",
- "UNUSED" => "",
- "CV" => "",
- "TMPVAR" => "zval_ptr_dtor_nogc(EX_VAR(opline->op2.var))",
- "TMPVARCV" => "???",
+ "ANY" => "FREE_UNFETCHED_OP(opline->op2_type, opline->op2.var)",
+ "TMP" => "zval_ptr_dtor_nogc(EX_VAR(opline->op2.var))",
+ "VAR" => "zval_ptr_dtor_nogc(EX_VAR(opline->op2.var))",
+ "CONST" => "",
+ "UNUSED" => "",
+ "CV" => "",
+ "TMPVAR" => "zval_ptr_dtor_nogc(EX_VAR(opline->op2.var))",
+ "TMPVARCV" => "???",
);
$op_data_type = array(
- "ANY" => "(opline+1)->op1_type",
- "TMP" => "IS_TMP_VAR",
- "VAR" => "IS_VAR",
- "CONST" => "IS_CONST",
- "UNUSED" => "IS_UNUSED",
- "CV" => "IS_CV",
- "TMPVAR" => "(IS_TMP_VAR|IS_VAR)",
- "TMPVARCV" => "(IS_TMP_VAR|IS_VAR|IS_CV)",
+ "ANY" => "(opline+1)->op1_type",
+ "TMP" => "IS_TMP_VAR",
+ "VAR" => "IS_VAR",
+ "CONST" => "IS_CONST",
+ "UNUSED" => "IS_UNUSED",
+ "CV" => "IS_CV",
+ "TMPVAR" => "(IS_TMP_VAR|IS_VAR)",
+ "TMPVARCV" => "(IS_TMP_VAR|IS_VAR|IS_CV)",
);
$op_data_get_zval_ptr = array(
- "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" => "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)",
- "TMPVARCV" => "???",
+ "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" => "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)",
+ "TMPVARCV" => "???",
);
$op_data_get_zval_ptr_deref = array(
- "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" => "RT_CONSTANT((opline+1), (opline+1)->op1)",
- "UNUSED" => "NULL",
- "CV" => "_get_zval_ptr_cv_deref_\\1((opline+1)->op1.var EXECUTE_DATA_CC)",
- "TMPVAR" => "???",
- "TMPVARCV" => "???",
+ "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" => "RT_CONSTANT((opline+1), (opline+1)->op1)",
+ "UNUSED" => "NULL",
+ "CV" => "_get_zval_ptr_cv_deref_\\1((opline+1)->op1.var EXECUTE_DATA_CC)",
+ "TMPVAR" => "???",
+ "TMPVARCV" => "???",
+);
+
+$op_data_get_zval_ptr_ptr = array(
+ "ANY" => "get_zval_ptr_ptr((opline+1)->op1_type, (opline+1)->op1, &free_op_data, \\1)",
+ "TMP" => "NULL",
+ "VAR" => "_get_zval_ptr_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC)",
+ "CONST" => "NULL",
+ "UNUSED" => "NULL",
+ "CV" => "_get_zval_ptr_cv_\\1((opline+1)->op1.var EXECUTE_DATA_CC)",
+ "TMPVAR" => "???",
+ "TMPVARCV" => "???",
);
$op_data_free_op = array(
- "ANY" => "FREE_OP(free_op_data)",
- "TMP" => "zval_ptr_dtor_nogc(free_op_data)",
- "VAR" => "zval_ptr_dtor_nogc(free_op_data)",
- "CONST" => "",
- "UNUSED" => "",
- "CV" => "",
- "TMPVAR" => "zval_ptr_dtor_nogc(free_op_data)",
- "TMPVARCV" => "???",
+ "ANY" => "FREE_OP(free_op_data)",
+ "TMP" => "zval_ptr_dtor_nogc(free_op_data)",
+ "VAR" => "zval_ptr_dtor_nogc(free_op_data)",
+ "CONST" => "",
+ "UNUSED" => "",
+ "CV" => "",
+ "TMPVAR" => "zval_ptr_dtor_nogc(free_op_data)",
+ "TMPVARCV" => "???",
+);
+
+$op_data_free_op_var_ptr = array(
+ "ANY" => "if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}",
+ "TMP" => "",
+ "VAR" => "if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}",
+ "CONST" => "",
+ "UNUSED" => "",
+ "CV" => "",
+ "TMPVAR" => "???",
+ "TMPVARCV" => "???",
);
$op_data_free_unfetched = array(
- "ANY" => "FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var)",
- "TMP" => "zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var))",
- "VAR" => "zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var))",
- "CONST" => "",
- "UNUSED" => "",
- "CV" => "",
- "TMPVAR" => "zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var))",
- "TMPVARCV" => "???",
+ "ANY" => "FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var)",
+ "TMP" => "zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var))",
+ "VAR" => "zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var))",
+ "CONST" => "",
+ "UNUSED" => "",
+ "CV" => "",
+ "TMPVAR" => "zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var))",
+ "TMPVARCV" => "???",
);
$list = array(); // list of opcode handlers and helpers in original order
@@ -599,2537 +626,2576 @@ $used_extra_spec = array();
// Writes $s into resulting executor
function out($f, $s) {
- global $line_no;
+ global $line_no;
- fputs($f,$s);
- $line_no += substr_count($s, "\n");
+ fputs($f,$s);
+ $line_no += substr_count($s, "\n");
}
// Resets #line directives in resulting executor
function out_line($f) {
- global $line_no, $executor_file;
+ global $line_no, $executor_file;
- fputs($f,"#line ".($line_no+1)." \"".$executor_file."\"\n");
- ++$line_no;
+ fputs($f,"#line ".($line_no+1)." \"".$executor_file."\"\n");
+ ++$line_no;
}
function is_hot_helper($name) {
- global $helpers;
+ global $helpers;
- if (isset($helpers[$name]["hot"])) {
- return $helpers[$name]["hot"];
- } else {
- return false;
- }
+ 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;
-
- $extra = "";
-
- if (isset($helpers[$name])) {
- // If we haven't helper with specified spicialized operands then
- // using unspecialized helper
- 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])) {
- 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"])) {
- $extra = extra_spec_name(array_intersect_key($extra_spec, $helpers[$name]["spec"]));
- }
- }
- return $name.($spec?"_SPEC":"").$prefix[$op1].$prefix[$op2].$extra;
+ global $prefix, $helpers;
+
+ $extra = "";
+
+ if (isset($helpers[$name])) {
+ // If we haven't helper with specified spicialized operands then
+ // using unspecialized helper
+ 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])) {
+ 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"])) {
+ $extra = extra_spec_name(array_intersect_key($extra_spec, $helpers[$name]["spec"]));
+ }
+ }
+ return $name.($spec?"_SPEC":"").$prefix[$op1].$prefix[$op2].$extra;
}
-function opcode_name($name, $spec, $op1, $op2) {
- global $prefix, $opnames, $opcodes;
-
- if (isset($opnames[$name])) {
- $opcode = $opcodes[$opnames[$name]];
- // If we haven't helper with specified spicialized operands then
- // using unspecialized helper
- 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])) {
- 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];
+function opcode_name($name, $spec, $op1, $op2, $extra_spec) {
+ global $prefix, $opnames, $opcodes;
+
+ $extra = "";
+
+ if (isset($opnames[$name])) {
+ $opcode = $opcodes[$opnames[$name]];
+ // If we haven't helper with specified spicialized operands then
+ // using unspecialized helper
+ 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])) {
+ 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";
+ }
+ }
+ /* forward common specs (e.g. in ZEND_VM_DISPATCH_TO_HANDLER) */
+ if (isset($extra_spec, $opcode["spec"])) {
+ $extra = extra_spec_name(array_intersect_key($extra_spec, $opcode["spec"]));
+ }
+ }
+ return $name.($spec?"_SPEC":"").$prefix[$op1].$prefix[$op2].$extra;
}
// Formats condition, protecting it by parentheses when needed.
function format_condition($condition) {
- if ($condition === "") {
- throw new InvalidArgumentException("A non empty string condition was expected.");
- }
+ if ($condition === "") {
+ throw new InvalidArgumentException("A non empty string condition was expected.");
+ }
- if ($condition[0] === "(" && substr($condition, -1) === ")") {
- return $condition;
- }
+ if ($condition[0] === "(" && substr($condition, -1) === ")") {
+ return $condition;
+ }
- return "(".$condition.")";
+ return "(".$condition.")";
}
// Generates code for opcode handler or helper
function gen_code($f, $spec, $kind, $export, $code, $op1, $op2, $name, $extra_spec=null) {
- global $op1_type, $op2_type, $op1_get_zval_ptr, $op2_get_zval_ptr,
- $op1_get_zval_ptr_deref, $op2_get_zval_ptr_deref,
- $op1_get_zval_ptr_undef, $op2_get_zval_ptr_undef,
- $op1_get_zval_ptr_ptr, $op2_get_zval_ptr_ptr,
- $op1_get_zval_ptr_ptr_undef, $op2_get_zval_ptr_ptr_undef,
- $op1_get_obj_zval_ptr, $op2_get_obj_zval_ptr,
- $op1_get_obj_zval_ptr_undef, $op2_get_obj_zval_ptr_undef,
- $op1_get_obj_zval_ptr_deref, $op2_get_obj_zval_ptr_deref,
- $op1_get_obj_zval_ptr_ptr, $op2_get_obj_zval_ptr_ptr,
- $op1_get_obj_zval_ptr_ptr_undef, $op2_get_obj_zval_ptr_ptr_undef,
- $op1_free, $op2_free, $op1_free_unfetched, $op2_free_unfetched,
- $op1_free_op, $op2_free_op, $op1_free_op_if_var, $op2_free_op_if_var,
- $op1_free_op_var_ptr, $op2_free_op_var_ptr, $prefix,
- $op_data_type, $op_data_get_zval_ptr, $op_data_get_zval_ptr_deref,
- $op_data_free_op, $op_data_free_unfetched;
-
- // Specializing
- $code = preg_replace(
- array(
- "/OP1_TYPE/",
- "/OP2_TYPE/",
- "/OP1_FREE/",
- "/OP2_FREE/",
- "/GET_OP1_ZVAL_PTR\(([^)]*)\)/",
- "/GET_OP2_ZVAL_PTR\(([^)]*)\)/",
- "/GET_OP1_ZVAL_PTR_DEREF\(([^)]*)\)/",
- "/GET_OP2_ZVAL_PTR_DEREF\(([^)]*)\)/",
- "/GET_OP1_ZVAL_PTR_UNDEF\(([^)]*)\)/",
- "/GET_OP2_ZVAL_PTR_UNDEF\(([^)]*)\)/",
- "/GET_OP1_ZVAL_PTR_PTR\(([^)]*)\)/",
- "/GET_OP2_ZVAL_PTR_PTR\(([^)]*)\)/",
- "/GET_OP1_ZVAL_PTR_PTR_UNDEF\(([^)]*)\)/",
- "/GET_OP2_ZVAL_PTR_PTR_UNDEF\(([^)]*)\)/",
- "/GET_OP1_OBJ_ZVAL_PTR\(([^)]*)\)/",
- "/GET_OP2_OBJ_ZVAL_PTR\(([^)]*)\)/",
- "/GET_OP1_OBJ_ZVAL_PTR_UNDEF\(([^)]*)\)/",
- "/GET_OP2_OBJ_ZVAL_PTR_UNDEF\(([^)]*)\)/",
- "/GET_OP1_OBJ_ZVAL_PTR_DEREF\(([^)]*)\)/",
- "/GET_OP2_OBJ_ZVAL_PTR_DEREF\(([^)]*)\)/",
- "/GET_OP1_OBJ_ZVAL_PTR_PTR\(([^)]*)\)/",
- "/GET_OP2_OBJ_ZVAL_PTR_PTR\(([^)]*)\)/",
- "/GET_OP1_OBJ_ZVAL_PTR_PTR_UNDEF\(([^)]*)\)/",
- "/GET_OP2_OBJ_ZVAL_PTR_PTR_UNDEF\(([^)]*)\)/",
- "/FREE_OP1\(\)/",
- "/FREE_OP2\(\)/",
- "/FREE_OP1_IF_VAR\(\)/",
- "/FREE_OP2_IF_VAR\(\)/",
- "/FREE_OP1_VAR_PTR\(\)/",
- "/FREE_OP2_VAR_PTR\(\)/",
- "/FREE_UNFETCHED_OP1\(\)/",
- "/FREE_UNFETCHED_OP2\(\)/",
- "/^#(\s*)ifdef\s+ZEND_VM_SPEC\s*\n/m",
- "/^#(\s*)ifndef\s+ZEND_VM_SPEC\s*\n/m",
- "/\!defined\(ZEND_VM_SPEC\)/m",
- "/defined\(ZEND_VM_SPEC\)/m",
- "/ZEND_VM_C_LABEL\(\s*([A-Za-z_]*)\s*\)/m",
- "/ZEND_VM_C_GOTO\(\s*([A-Za-z_]*)\s*\)/m",
- "/^#(\s*)if\s+1\s*\\|\\|.*[^\\\\]$/m",
- "/^#(\s*)if\s+0\s*&&.*[^\\\\]$/m",
- "/^#(\s*)ifdef\s+ZEND_VM_EXPORT\s*\n/m",
- "/^#(\s*)ifndef\s+ZEND_VM_EXPORT\s*\n/m",
- "/OP_DATA_TYPE/",
- "/GET_OP_DATA_ZVAL_PTR\(([^)]*)\)/",
- "/GET_OP_DATA_ZVAL_PTR_DEREF\(([^)]*)\)/",
- "/FREE_OP_DATA\(\)/",
- "/FREE_UNFETCHED_OP_DATA\(\)/",
- "/RETURN_VALUE_USED\(opline\)/",
- "/arg_num <= MAX_ARG_FLAG_NUM/",
- "/ZEND_VM_SMART_BRANCH\(\s*([^,)]*)\s*,\s*([^)]*)\s*\)/",
- "/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],
- $op2_type[$op2],
- $op1_free[$op1],
- $op2_free[$op2],
- $op1_get_zval_ptr[$op1],
- $op2_get_zval_ptr[$op2],
- $op1_get_zval_ptr_deref[$op1],
- $op2_get_zval_ptr_deref[$op2],
- $op1_get_zval_ptr_undef[$op1],
- $op2_get_zval_ptr_undef[$op2],
- $op1_get_zval_ptr_ptr[$op1],
- $op2_get_zval_ptr_ptr[$op2],
- $op1_get_zval_ptr_ptr_undef[$op1],
- $op2_get_zval_ptr_ptr_undef[$op2],
- $op1_get_obj_zval_ptr[$op1],
- $op2_get_obj_zval_ptr[$op2],
- $op1_get_obj_zval_ptr_undef[$op1],
- $op2_get_obj_zval_ptr_undef[$op2],
- $op1_get_obj_zval_ptr_deref[$op1],
- $op2_get_obj_zval_ptr_deref[$op2],
- $op1_get_obj_zval_ptr_ptr[$op1],
- $op2_get_obj_zval_ptr_ptr[$op2],
- $op1_get_obj_zval_ptr_ptr_undef[$op1],
- $op2_get_obj_zval_ptr_ptr_undef[$op2],
- $op1_free_op[$op1],
- $op2_free_op[$op2],
- $op1_free_op_if_var[$op1],
- $op2_free_op_if_var[$op2],
- $op1_free_op_var_ptr[$op1],
- $op2_free_op_var_ptr[$op2],
- $op1_free_unfetched[$op1],
- $op2_free_unfetched[$op2],
- ($op1!="ANY"||$op2!="ANY")?"#\\1if 1\n":"#\\1if 0\n",
- ($op1!="ANY"||$op2!="ANY")?"#\\1if 0\n":"#\\1if 1\n",
- ($op1!="ANY"||$op2!="ANY")?"0":"1",
- ($op1!="ANY"||$op2!="ANY")?"1":"0",
- "\\1".(($spec && $kind != ZEND_VM_KIND_CALL)?("_SPEC".$prefix[$op1].$prefix[$op2].extra_spec_name($extra_spec)):""),
- "goto \\1".(($spec && $kind != ZEND_VM_KIND_CALL)?("_SPEC".$prefix[$op1].$prefix[$op2].extra_spec_name($extra_spec)):""),
- "#\\1if 1",
- "#\\1if 0",
- $export?"#\\1if 1\n":"#\\1if 0\n",
- $export?"#\\1if 0\n":"#\\1if 1\n",
- $op_data_type[isset($extra_spec['OP_DATA']) ? $extra_spec['OP_DATA'] : "ANY"],
- $op_data_get_zval_ptr[isset($extra_spec['OP_DATA']) ? $extra_spec['OP_DATA'] : "ANY"],
- $op_data_get_zval_ptr_deref[isset($extra_spec['OP_DATA']) ? $extra_spec['OP_DATA'] : "ANY"],
- $op_data_free_op[isset($extra_spec['OP_DATA']) ? $extra_spec['OP_DATA'] : "ANY"],
- $op_data_free_unfetched[isset($extra_spec['OP_DATA']) ? $extra_spec['OP_DATA'] : "ANY"],
- isset($extra_spec['RETVAL']) ? $extra_spec['RETVAL'] : "RETURN_VALUE_USED(opline)",
- isset($extra_spec['QUICK_ARG']) ? $extra_spec['QUICK_ARG'] : "arg_num <= MAX_ARG_FLAG_NUM",
- isset($extra_spec['SMART_BRANCH']) ?
- ($extra_spec['SMART_BRANCH'] == 1 ?
- "ZEND_VM_SMART_BRANCH_JMPZ(\\1, \\2)"
- : ($extra_spec['SMART_BRANCH'] == 2 ?
- "ZEND_VM_SMART_BRANCH_JMPNZ(\\1, \\2)" : ""))
- : "ZEND_VM_SMART_BRANCH(\\1, \\2)",
- isset($extra_spec['DIM_OBJ']) ?
- ($extra_spec['DIM_OBJ'] == 0 ? "1" : "0")
- : "\\0",
- isset($extra_spec['DIM_OBJ']) ?
- ($extra_spec['DIM_OBJ'] == 1 ? "1" : "0")
- : "\\0",
- 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);
-
- if (0 && strpos($code, '{') === 0) {
- $code = "{\n\tfprintf(stderr, \"$name\\n\");\n" . substr($code, 1);
- }
- // 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(
- "/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) {
- return "ZEND_VM_TAIL_CALL(" . opcode_name($matches[1], $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))";
- }
- 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_SWITCH:
- $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) {
- return "goto " . opcode_name($matches[1], $spec, $op1, $op2) . "_LABEL";
- } else {
- // ZEND_VM_DISPATCH_TO_HELPER
- if (isset($matches[2])) {
- // extra args
- $args = preg_replace("/,\s*([A-Za-z_]*)\s*,\s*([^,)\s]*)\s*/", "$1 = $2; ", $matches[2]);
- return $args . "goto " . helper_name($matches[1], $spec, $op1, $op2, $extra_spec);
- }
- return "goto " . helper_name($matches[1], $spec, $op1, $op2, $extra_spec);
- }
- },
- $code);
- break;
- case ZEND_VM_KIND_GOTO:
- $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) {
- return "goto " . opcode_name($matches[1], $spec, $op1, $op2) . "_LABEL";
- } else {
- // ZEND_VM_DISPATCH_TO_HELPER
- if (isset($matches[2])) {
- // extra args
- $args = preg_replace("/,\s*([A-Za-z_]*)\s*,\s*([^,)\s]*)\s*/", "$1 = $2; ", $matches[2]);
- return $args . "goto " . helper_name($matches[1], $spec, $op1, $op2, $extra_spec);
- }
- return "goto " . helper_name($matches[1], $spec, $op1, $op2, $extra_spec);
- }
- },
- $code);
- break;
- }
-
- /* Remove unused free_op1 and free_op2 declarations */
- if ($spec && preg_match_all('/^\s*zend_free_op\s+[^;]+;\s*$/m', $code, $matches, PREG_SET_ORDER)) {
- $n = 0;
- foreach ($matches as $match) {
- $code = preg_replace('/'.preg_quote($match[0],'/').'/', "\$D$n", $code);
- ++$n;
- }
- $del_free_op1 = (strpos($code, "free_op1") === false);
- $del_free_op2 = (strpos($code, "free_op2") === false);
- $del_free_op_data = (strpos($code, "free_op_data") === false);
- $n = 0;
- foreach ($matches as $match) {
- $dcl = $match[0];
- $changed = 0;
- if ($del_free_op1 && strpos($dcl, "free_op1") !== false) {
- $dcl = preg_replace("/free_op1\s*,\s*/", "", $dcl);
- $dcl = preg_replace("/free_op1\s*;/", ";", $dcl);
- $changed = 1;
- }
- if ($del_free_op2 && strpos($dcl, "free_op2") !== false) {
- $dcl = preg_replace("/free_op2\s*,\s*/", "", $dcl);
- $dcl = preg_replace("/free_op2\s*;/", ";", $dcl);
- $changed = 1;
- }
- if ($del_free_op_data && strpos($dcl, "free_op_data") !== false) {
- $dcl = preg_replace("/free_op_data\s*,\s*/", "", $dcl);
- $dcl = preg_replace("/free_op_data\s*;/", ";", $dcl);
- $changed = 1;
- }
- if ($changed) {
- $dcl = preg_replace("/,\s*;/", ";", $dcl);
- $dcl = preg_replace("/zend_free_op\s*;/", "", $dcl);
- }
- $code = preg_replace("/\\\$D$n/", $dcl, $code);
- ++$n;
- }
- }
-
- /* Remove unnecessary ';' */
- $code = preg_replace('/^\s*;\s*$/m', '', $code);
-
- /* Remove WS */
- $code = preg_replace('/[ \t]+\n/m', "\n", $code);
-
- out($f, $code);
+ global $op1_type, $op2_type, $op1_get_zval_ptr, $op2_get_zval_ptr,
+ $op1_get_zval_ptr_deref, $op2_get_zval_ptr_deref,
+ $op1_get_zval_ptr_undef, $op2_get_zval_ptr_undef,
+ $op1_get_zval_ptr_ptr, $op2_get_zval_ptr_ptr,
+ $op1_get_zval_ptr_ptr_undef, $op2_get_zval_ptr_ptr_undef,
+ $op1_get_obj_zval_ptr, $op2_get_obj_zval_ptr,
+ $op1_get_obj_zval_ptr_undef, $op2_get_obj_zval_ptr_undef,
+ $op1_get_obj_zval_ptr_deref, $op2_get_obj_zval_ptr_deref,
+ $op1_get_obj_zval_ptr_ptr, $op2_get_obj_zval_ptr_ptr,
+ $op1_get_obj_zval_ptr_ptr_undef, $op2_get_obj_zval_ptr_ptr_undef,
+ $op1_free, $op2_free, $op1_free_unfetched, $op2_free_unfetched,
+ $op1_free_op, $op2_free_op, $op1_free_op_if_var, $op2_free_op_if_var,
+ $op1_free_op_var_ptr, $op2_free_op_var_ptr, $prefix,
+ $op_data_type, $op_data_get_zval_ptr,
+ $op_data_get_zval_ptr_deref, $op_data_get_zval_ptr_ptr,
+ $op_data_free_op, $op_data_free_op_var_ptr, $op_data_free_unfetched;
+
+ // Specializing
+ $specialized_replacements = array(
+ "/OP1_TYPE/" => $op1_type[$op1],
+ "/OP2_TYPE/" => $op2_type[$op2],
+ "/OP1_FREE/" => $op1_free[$op1],
+ "/OP2_FREE/" => $op2_free[$op2],
+ "/GET_OP1_ZVAL_PTR\(([^)]*)\)/" => $op1_get_zval_ptr[$op1],
+ "/GET_OP2_ZVAL_PTR\(([^)]*)\)/" => $op2_get_zval_ptr[$op2],
+ "/GET_OP1_ZVAL_PTR_DEREF\(([^)]*)\)/" => $op1_get_zval_ptr_deref[$op1],
+ "/GET_OP2_ZVAL_PTR_DEREF\(([^)]*)\)/" => $op2_get_zval_ptr_deref[$op2],
+ "/GET_OP1_ZVAL_PTR_UNDEF\(([^)]*)\)/" => $op1_get_zval_ptr_undef[$op1],
+ "/GET_OP2_ZVAL_PTR_UNDEF\(([^)]*)\)/" => $op2_get_zval_ptr_undef[$op2],
+ "/GET_OP1_ZVAL_PTR_PTR\(([^)]*)\)/" => $op1_get_zval_ptr_ptr[$op1],
+ "/GET_OP2_ZVAL_PTR_PTR\(([^)]*)\)/" => $op2_get_zval_ptr_ptr[$op2],
+ "/GET_OP1_ZVAL_PTR_PTR_UNDEF\(([^)]*)\)/" => $op1_get_zval_ptr_ptr_undef[$op1],
+ "/GET_OP2_ZVAL_PTR_PTR_UNDEF\(([^)]*)\)/" => $op2_get_zval_ptr_ptr_undef[$op2],
+ "/GET_OP1_OBJ_ZVAL_PTR\(([^)]*)\)/" => $op1_get_obj_zval_ptr[$op1],
+ "/GET_OP2_OBJ_ZVAL_PTR\(([^)]*)\)/" => $op2_get_obj_zval_ptr[$op2],
+ "/GET_OP1_OBJ_ZVAL_PTR_UNDEF\(([^)]*)\)/" => $op1_get_obj_zval_ptr_undef[$op1],
+ "/GET_OP2_OBJ_ZVAL_PTR_UNDEF\(([^)]*)\)/" => $op2_get_obj_zval_ptr_undef[$op2],
+ "/GET_OP1_OBJ_ZVAL_PTR_DEREF\(([^)]*)\)/" => $op1_get_obj_zval_ptr_deref[$op1],
+ "/GET_OP2_OBJ_ZVAL_PTR_DEREF\(([^)]*)\)/" => $op2_get_obj_zval_ptr_deref[$op2],
+ "/GET_OP1_OBJ_ZVAL_PTR_PTR\(([^)]*)\)/" => $op1_get_obj_zval_ptr_ptr[$op1],
+ "/GET_OP2_OBJ_ZVAL_PTR_PTR\(([^)]*)\)/" => $op2_get_obj_zval_ptr_ptr[$op2],
+ "/GET_OP1_OBJ_ZVAL_PTR_PTR_UNDEF\(([^)]*)\)/" => $op1_get_obj_zval_ptr_ptr_undef[$op1],
+ "/GET_OP2_OBJ_ZVAL_PTR_PTR_UNDEF\(([^)]*)\)/" => $op2_get_obj_zval_ptr_ptr_undef[$op2],
+ "/FREE_OP1\(\)/" => $op1_free_op[$op1],
+ "/FREE_OP2\(\)/" => $op2_free_op[$op2],
+ "/FREE_OP1_IF_VAR\(\)/" => $op1_free_op_if_var[$op1],
+ "/FREE_OP2_IF_VAR\(\)/" => $op2_free_op_if_var[$op2],
+ "/FREE_OP1_VAR_PTR\(\)/" => $op1_free_op_var_ptr[$op1],
+ "/FREE_OP2_VAR_PTR\(\)/" => $op2_free_op_var_ptr[$op2],
+ "/FREE_UNFETCHED_OP1\(\)/" => $op1_free_unfetched[$op1],
+ "/FREE_UNFETCHED_OP2\(\)/" => $op2_free_unfetched[$op2],
+ "/\!ZEND_VM_SPEC/m" => ($op1!="ANY"||$op2!="ANY")?"0":"1",
+ "/ZEND_VM_SPEC/m" => ($op1!="ANY"||$op2!="ANY")?"1":"0",
+ "/ZEND_VM_C_LABEL\(\s*([A-Za-z_]*)\s*\)/m" => "\\1".(($spec && $kind != ZEND_VM_KIND_CALL)?("_SPEC".$prefix[$op1].$prefix[$op2].extra_spec_name($extra_spec)):""),
+ "/ZEND_VM_C_GOTO\(\s*([A-Za-z_]*)\s*\)/m" => "goto \\1".(($spec && $kind != ZEND_VM_KIND_CALL)?("_SPEC".$prefix[$op1].$prefix[$op2].extra_spec_name($extra_spec)):""),
+ "/^#(\s*)if\s+1\s*\\|\\|.*[^\\\\]$/m" => "#\\1if 1",
+ "/^#(\s*)if\s+0\s*&&.*[^\\\\]$/m" => "#\\1if 0",
+ "/^#(\s*)elif\s+1\s*\\|\\|.*[^\\\\]$/m" => "#\\1elif 1",
+ "/^#(\s*)elif\s+0\s*&&.*[^\\\\]$/m" => "#\\1elif 0",
+ "/^#(\s*)ifdef\s+ZEND_VM_EXPORT\s*\n/m" => $export?"#\\1if 1\n":"#\\1if 0\n",
+ "/^#(\s*)ifndef\s+ZEND_VM_EXPORT\s*\n/m" => $export?"#\\1if 0\n":"#\\1if 1\n",
+ "/OP_DATA_TYPE/" => $op_data_type[isset($extra_spec['OP_DATA']) ? $extra_spec['OP_DATA'] : "ANY"],
+ "/GET_OP_DATA_ZVAL_PTR\(([^)]*)\)/" => $op_data_get_zval_ptr[isset($extra_spec['OP_DATA']) ? $extra_spec['OP_DATA'] : "ANY"],
+ "/GET_OP_DATA_ZVAL_PTR_DEREF\(([^)]*)\)/" => $op_data_get_zval_ptr_deref[isset($extra_spec['OP_DATA']) ? $extra_spec['OP_DATA'] : "ANY"],
+ "/GET_OP_DATA_ZVAL_PTR_PTR\(([^)]*)\)/" => $op_data_get_zval_ptr_ptr[isset($extra_spec['OP_DATA']) ? $extra_spec['OP_DATA'] : "ANY"],
+ "/FREE_OP_DATA\(\)/" => $op_data_free_op[isset($extra_spec['OP_DATA']) ? $extra_spec['OP_DATA'] : "ANY"],
+ "/FREE_OP_DATA_VAR_PTR\(\)/" => $op_data_free_op_var_ptr[isset($extra_spec['OP_DATA']) ? $extra_spec['OP_DATA'] : "ANY"],
+ "/FREE_UNFETCHED_OP_DATA\(\)/" => $op_data_free_unfetched[isset($extra_spec['OP_DATA']) ? $extra_spec['OP_DATA'] : "ANY"],
+ "/RETURN_VALUE_USED\(opline\)/" => isset($extra_spec['RETVAL']) ? $extra_spec['RETVAL'] : "RETURN_VALUE_USED(opline)",
+ "/arg_num <= MAX_ARG_FLAG_NUM/" => isset($extra_spec['QUICK_ARG']) ? $extra_spec['QUICK_ARG'] : "arg_num <= MAX_ARG_FLAG_NUM",
+ "/ZEND_VM_SMART_BRANCH\(\s*([^,)]*)\s*,\s*([^)]*)\s*\)/" => isset($extra_spec['SMART_BRANCH']) ?
+ ($extra_spec['SMART_BRANCH'] == 1 ?
+ "ZEND_VM_SMART_BRANCH_JMPZ(\\1, \\2)"
+ : ($extra_spec['SMART_BRANCH'] == 2 ?
+ "ZEND_VM_SMART_BRANCH_JMPNZ(\\1, \\2)" : ""))
+ : "ZEND_VM_SMART_BRANCH(\\1, \\2)",
+ "/ZEND_VM_SMART_BRANCH_TRUE\(\s*\)/" => isset($extra_spec['SMART_BRANCH']) ?
+ ($extra_spec['SMART_BRANCH'] == 1 ?
+ "ZEND_VM_SMART_BRANCH_TRUE_JMPZ()"
+ : ($extra_spec['SMART_BRANCH'] == 2 ?
+ "ZEND_VM_SMART_BRANCH_TRUE_JMPNZ()" : ""))
+ : "ZEND_VM_SMART_BRANCH_TRUE()",
+ "/ZEND_VM_SMART_BRANCH_FALSE\(\s*\)/" => isset($extra_spec['SMART_BRANCH']) ?
+ ($extra_spec['SMART_BRANCH'] == 1 ?
+ "ZEND_VM_SMART_BRANCH_FALSE_JMPZ()"
+ : ($extra_spec['SMART_BRANCH'] == 2 ?
+ "ZEND_VM_SMART_BRANCH_FALSE_JMPNZ()" : ""))
+ : "ZEND_VM_SMART_BRANCH_FALSE()",
+ "/opline->extended_value\s*&\s*ZEND_ISEMPTY/" => isset($extra_spec['ISSET']) ?
+ ($extra_spec['ISSET'] == 0 ? "0" : "1")
+ : "\\0",
+ "/opline->extended_value\s*&\s*~\s*ZEND_ISEMPTY/" => isset($extra_spec['ISSET']) ?
+ ($extra_spec['ISSET'] == 0 ? "\\0" : "opline->extended_value")
+ : "\\0",
+ );
+ $code = preg_replace(array_keys($specialized_replacements), array_values($specialized_replacements), $code);
+
+ if (0 && strpos($code, '{') === 0) {
+ $code = "{\n\tfprintf(stderr, \"$name\\n\");\n" . substr($code, 1);
+ }
+ // 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]];
+ return "goto " . opcode_name($name, $spec, $op1, $op2, $extra_spec) . "_LABEL";
+ } else {
+ // ZEND_VM_DISPATCH_TO_HELPER
+ if (is_hot_helper($matches[1])) {
+ if (isset($matches[2])) {
+ // extra args
+ $args = preg_replace("/,\s*([A-Za-z0-9_]*)\s*,\s*([^,)\s]*)\s*/", "$1 = $2; ", $matches[2]);
+ return $args . "goto " . helper_name($matches[1], $spec, $op1, $op2, $extra_spec) . "_LABEL";
+ }
+ return "goto " . helper_name($matches[1], $spec, $op1, $op2, $extra_spec) . "_LABEL";
+ }
+ if (isset($matches[2])) {
+ // extra args
+ $args = substr(preg_replace("/,\s*[A-Za-z0-9_]*\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))";
+ }
+ 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(
+ "/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, $name) {
+ 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;
+
+ $handler = $matches[1];
+ $opcode = $opcodes[$opnames[$handler]];
+ $inline =
+ ZEND_VM_KIND == ZEND_VM_KIND_HYBRID &&
+ isset($opcode["use"]) &&
+ is_hot_handler($opcode["hot"], $op1, $op2, $extra_spec) &&
+ is_hot_handler($opcodes[$opnames[$name]]["hot"], $op1, $op2, $extra_spec) ?
+ "_INLINE" : "";
+ return "ZEND_VM_TAIL_CALL(" . opcode_name($handler, $spec, $op1, $op2, $extra_spec) . $inline . "_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-z0-9_]*\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))";
+ }
+ 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_SWITCH:
+ $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) {
+ return "goto " . opcode_name($matches[1], $spec, $op1, $op2, $extra_spec) . "_LABEL";
+ } else {
+ // ZEND_VM_DISPATCH_TO_HELPER
+ if (isset($matches[2])) {
+ // extra args
+ $args = preg_replace("/,\s*([A-Za-z0-9_]*)\s*,\s*([^,)\s]*)\s*/", "$1 = $2; ", $matches[2]);
+ return $args . "goto " . helper_name($matches[1], $spec, $op1, $op2, $extra_spec);
+ }
+ return "goto " . helper_name($matches[1], $spec, $op1, $op2, $extra_spec);
+ }
+ },
+ $code);
+ break;
+ case ZEND_VM_KIND_GOTO:
+ $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) {
+ return "goto " . opcode_name($matches[1], $spec, $op1, $op2, $extra_spec) . "_LABEL";
+ } else {
+ // ZEND_VM_DISPATCH_TO_HELPER
+ if (isset($matches[2])) {
+ // extra args
+ $args = preg_replace("/,\s*([A-Za-z0-9_]*)\s*,\s*([^,)\s]*)\s*/", "$1 = $2; ", $matches[2]);
+ return $args . "goto " . helper_name($matches[1], $spec, $op1, $op2, $extra_spec);
+ }
+ return "goto " . helper_name($matches[1], $spec, $op1, $op2, $extra_spec);
+ }
+ },
+ $code);
+ break;
+ }
+
+ /* Remove unused free_op1 and free_op2 declarations */
+ if ($spec && preg_match_all('/^\s*zend_free_op\s+[^;]+;\s*$/m', $code, $matches, PREG_SET_ORDER)) {
+ $n = 0;
+ foreach ($matches as $match) {
+ $code = preg_replace('/'.preg_quote($match[0],'/').'/', "\$D$n", $code);
+ ++$n;
+ }
+ $del_free_op1 = (strpos($code, "free_op1") === false);
+ $del_free_op2 = (strpos($code, "free_op2") === false);
+ $del_free_op_data = (strpos($code, "free_op_data") === false);
+ $n = 0;
+ foreach ($matches as $match) {
+ $dcl = $match[0];
+ $changed = 0;
+ if ($del_free_op1 && strpos($dcl, "free_op1") !== false) {
+ $dcl = preg_replace("/free_op1\s*,\s*/", "", $dcl);
+ $dcl = preg_replace("/free_op1\s*;/", ";", $dcl);
+ $changed = 1;
+ }
+ if ($del_free_op2 && strpos($dcl, "free_op2") !== false) {
+ $dcl = preg_replace("/free_op2\s*,\s*/", "", $dcl);
+ $dcl = preg_replace("/free_op2\s*;/", ";", $dcl);
+ $changed = 1;
+ }
+ if ($del_free_op_data && strpos($dcl, "free_op_data") !== false) {
+ $dcl = preg_replace("/free_op_data\s*,\s*/", "", $dcl);
+ $dcl = preg_replace("/free_op_data\s*;/", ";", $dcl);
+ $changed = 1;
+ }
+ if ($changed) {
+ $dcl = preg_replace("/,\s*;/", ";", $dcl);
+ $dcl = preg_replace("/zend_free_op\s*;/", "", $dcl);
+ }
+ $code = preg_replace("/\\\$D$n/", $dcl, $code);
+ ++$n;
+ }
+ }
+
+ /* Remove unnecessary ';' */
+ $code = preg_replace('/^\s*;\s*$/m', '', $code);
+
+ /* Remove WS */
+ $code = preg_replace('/[ \t]+\n/m', "\n", $code);
+
+ out($f, $code);
}
function skip_extra_spec_function($op1, $op2, $extra_spec) {
- global $commutative_order;
-
- if (isset($extra_spec["NO_CONST_CONST"]) &&
- $op1 == "CONST" && $op2 == "CONST") {
- // Skip useless constant handlers
- return true;
- }
-
- if (isset($extra_spec["COMMUTATIVE"]) &&
- $commutative_order[$op1] < $commutative_order[$op2]) {
- // Skip duplicate commutative handlers
- return true;
- }
-
- if (isset($extra_spec["DIM_OBJ"]) &&
- (($op2 == "UNUSED" && $extra_spec["DIM_OBJ"] != 1) ||
- ($op1 == "UNUSED" && $extra_spec["DIM_OBJ"] != 2))) {
- // Skip useless handlers
- return true;
- }
-
- return false;
+ global $commutative_order;
+
+ if (isset($extra_spec["NO_CONST_CONST"]) &&
+ $op1 == "CONST" && $op2 == "CONST") {
+ // Skip useless constant handlers
+ return true;
+ }
+
+ if (isset($extra_spec["COMMUTATIVE"]) &&
+ $commutative_order[$op1] < $commutative_order[$op2]) {
+ // Skip duplicate commutative handlers
+ return true;
+ }
+
+ 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;
- }
+ if (isset($extra_spec["SMART_BRANCH"]) && $extra_spec["SMART_BRANCH"] == 0) {
+ return false;
+ }
+ if ($hot === 'HOT_' || $hot === 'INLINE_') {
+ return true;
+ } else if ($hot === 'HOT_NOCONST_') {
+ return ($op1 !== 'CONST');
+ } else if ($hot === 'HOT_NOCONSTCONST_') {
+ return (($op1 !== 'CONST') || ($op2 !== '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;
- }
+ 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 if ($hot === 'HOT_NOCONSTCONST_') {
+ return ($op1 === 'CONST' && $op2 === '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);
+ return ($hot === 'INLINE_');
}
// 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, $opnames, $gen_order;
-
- if ($spec && skip_extra_spec_function($op1, $op2, $extra_spec)) {
- return;
- }
-
- if (ZEND_VM_LINES) {
- out($f, "#line $lineno \"$definition_file\"\n");
- }
-
- // Generate opcode handler's entry point according to selected threading model
- $spec_name = $name.($spec?"_SPEC":"").$prefix[$op1].$prefix[$op2].($spec?extra_spec_name($extra_spec):"");
- switch($kind) {
- case ZEND_VM_KIND_HYBRID:
- 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 && 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");
- }
- break;
- case ZEND_VM_KIND_SWITCH:
- if ($spec) {
- $cur = $switch_labels ? end($switch_labels) + 1 : 0;
- out($f,"case $cur: /* $spec_name */");
- $switch_labels[$spec_name] = $cur;
- } else {
- out($f,"case ".$name.":");
- }
- if ($use) {
- // This handler is used by other handlers. We will add label to call it.
- out($f," {$spec_name}_LABEL:\n");
- } else {
- out($f,"\n");
- }
- break;
- case ZEND_VM_KIND_GOTO:
- out($f,"{$spec_name}_LABEL: ZEND_VM_GUARD($spec_name);\n");
- break;
- }
-
- // Generate opcode handler's code
- gen_code($f, $spec, $kind, 0, $code, $op1, $op2, $name, $extra_spec);
+ global $definition_file, $prefix, $opnames, $gen_order;
+
+ if (isset($opcode['alias']) && ($spec || $kind != ZEND_VM_KIND_SWITCH)) {
+ return;
+ }
+
+ if ($spec && skip_extra_spec_function($op1, $op2, $extra_spec)) {
+ return;
+ }
+
+ /* Skip SMART_BRANCH specialization for "cold" CONST_CONST instructions */
+ if (isset($extra_spec["SMART_BRANCH"])) {
+ if ($opcode["hot"] === 'HOT_NOCONSTCONST_'
+ || $opcode["hot"] === 'COLD_CONSTCONST_') {
+ if (($op1 === 'CONST') && ($op2 === 'CONST')) {
+ if ($extra_spec["SMART_BRANCH"] == 0) {
+ unset($extra_spec["SMART_BRANCH"]);
+ } else {
+ return;
+ }
+ }
+ }
+ }
+
+ if (ZEND_VM_LINES) {
+ out($f, "#line $lineno \"$definition_file\"\n");
+ }
+
+ // Generate opcode handler's entry point according to selected threading model
+ $additional_func = false;
+ $spec_name = $name.($spec?"_SPEC":"").$prefix[$op1].$prefix[$op2].($spec?extra_spec_name($extra_spec):"");
+ switch($kind) {
+ case ZEND_VM_KIND_HYBRID:
+ 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 {
+ $inline =
+ isset($opcode["use"]) &&
+ is_hot_handler($opcode["hot"], $op1, $op2, $extra_spec) ?
+ "_INLINE" : "";
+ $code =
+ "\t\t\tHYBRID_CASE({$spec_name}):\n"
+ . "\t\t\t\tVM_TRACE($spec_name)\n"
+ . "\t\t\t\t{$spec_name}{$inline}_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 && is_hot_handler($opcode["hot"], $op1, $op2, $extra_spec)) {
+ if (isset($opcode["use"])) {
+ out($f,"static zend_always_inline ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL {$spec_name}_INLINE_HANDLER(ZEND_OPCODE_HANDLER_ARGS)\n");
+ $additional_func = true;
+ } else {
+ 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");
+ }
+ break;
+ case ZEND_VM_KIND_SWITCH:
+ if ($spec) {
+ $cur = $switch_labels ? end($switch_labels) + 1 : 0;
+ out($f,"case $cur: /* $spec_name */");
+ $switch_labels[$spec_name] = $cur;
+ } else {
+ out($f,"case ".$name.":");
+ }
+ if ($use) {
+ // This handler is used by other handlers. We will add label to call it.
+ out($f," {$spec_name}_LABEL:\n");
+ } else {
+ out($f,"\n");
+ }
+ break;
+ case ZEND_VM_KIND_GOTO:
+ out($f,"{$spec_name}_LABEL: ZEND_VM_GUARD($spec_name);\n");
+ break;
+ }
+
+ // Generate opcode handler's code
+ gen_code($f, $spec, $kind, 0, $code, $op1, $op2, $name, $extra_spec);
+
+ if ($additional_func) {
+ out($f,"static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL {$spec_name}_HANDLER(ZEND_OPCODE_HANDLER_ARGS)\n");
+ out($f,"{\n");
+ out($f,"\tZEND_VM_TAIL_CALL({$spec_name}_INLINE_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));\n");
+ out($f,"}\n");
+ out($f,"\n");
+ }
}
// Generates helper
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 && !$hot) {
- return;
- }
-
- if ($spec && skip_extra_spec_function($op1, $op2, $extra_spec)) {
- return;
- }
-
- if (ZEND_VM_LINES) {
- out($f, "#line $lineno \"$definition_file\"\n");
- }
-
- $spec_name = $name.($spec?"_SPEC":"").$prefix[$op1].$prefix[$op2].($spec?extra_spec_name($extra_spec):"");
-
- // 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_attributes = " zend_always_inline";
- $zend_fastcall = "";
- } else {
- 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_attributes ZEND_OPCODE_HANDLER_RET$zend_fastcall $spec_name(ZEND_OPCODE_HANDLER_ARGS)\n");
- } else {
- // Helper with parameter
- 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:
- out($f, "$spec_name:\n");
- break;
- case ZEND_VM_KIND_GOTO:
- out($f, "$spec_name:\n");
- break;
- }
-
- // Generate helper's code
- gen_code($f, $spec, $kind, 0, $code, $op1, $op2, $name, $extra_spec);
+ global $definition_file, $prefix;
+
+ if ($kind == ZEND_VM_KIND_HYBRID && !$hot) {
+ return;
+ }
+
+ if ($spec && skip_extra_spec_function($op1, $op2, $extra_spec)) {
+ return;
+ }
+
+ if (ZEND_VM_LINES) {
+ out($f, "#line $lineno \"$definition_file\"\n");
+ }
+
+ $spec_name = $name.($spec?"_SPEC":"").$prefix[$op1].$prefix[$op2].($spec?extra_spec_name($extra_spec):"");
+
+ // 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_attributes = " zend_always_inline";
+ $zend_fastcall = "";
+ } else {
+ if ($cold) {
+ $zend_attributes = " zend_never_inline ZEND_COLD";
+ } else {
+ $zend_attributes = " zend_never_inline";
+ }
+ $zend_fastcall = " ZEND_FASTCALL";
+ }
+ if ($param == null) {
+ // Helper without parameters
+ 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_attributes ZEND_OPCODE_HANDLER_RET$zend_fastcall $spec_name($param ZEND_OPCODE_HANDLER_ARGS_DC)\n");
+ }
+ break;
+ case ZEND_VM_KIND_SWITCH:
+ out($f, "$spec_name:\n");
+ break;
+ case ZEND_VM_KIND_GOTO:
+ out($f, "$spec_name:\n");
+ break;
+ }
+
+ // Generate helper's code
+ gen_code($f, $spec, $kind, 0, $code, $op1, $op2, $name, $extra_spec);
}
function gen_null_label($f, $kind, $prolog) {
- switch ($kind) {
- case ZEND_VM_KIND_CALL:
- out($f,$prolog."ZEND_NULL_HANDLER,\n");
- break;
- case ZEND_VM_KIND_SWITCH:
- out($f,$prolog."(void*)(uintptr_t)-1,\n");
- break;
- case ZEND_VM_KIND_GOTO:
- out($f,$prolog."(void*)&&ZEND_NULL_LABEL,\n");
- break;
- }
+ switch ($kind) {
+ case ZEND_VM_KIND_CALL:
+ out($f,$prolog."ZEND_NULL_HANDLER,\n");
+ break;
+ case ZEND_VM_KIND_SWITCH:
+ out($f,$prolog."(void*)(uintptr_t)-1,\n");
+ break;
+ case ZEND_VM_KIND_GOTO:
+ out($f,$prolog."(void*)&&ZEND_NULL_LABEL,\n");
+ break;
+ }
}
// Generates array of opcode handlers (specialized or unspecialized)
function gen_labels($f, $spec, $kind, $prolog, &$specs, $switch_labels = array()) {
- global $opcodes, $op_types, $prefix, $op_types_ex;
-
- $list = [];
- $next = 0;
- $label = 0;
- if ($spec) {
- // Emit labels for specialized executor
-
- // For each opcode in opcode number order
- 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;
- 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";
- }
- }
- 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);
- }
- if ($num >= 256) {
- $opcodes[$num]['spec_code'] = $specs[$num];
- unset($specs[$num]);
- }
-
- $foreach_op1 = function($do) use ($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") {
- if (!isset($dsc["op1"][$op1])) {
- if ($op1 == "TMP" || $op1 == "VAR") {
- if (isset($dsc["op1"]["TMPVAR"])) {
- $op1 = "TMPVAR";
- } else if (isset($dsc["op1"]["TMPVARCV"])) {
- $op1 = "TMPVARCV";
- } else {
- $op1 = "ANY";
- }
- } else if ($op1 == "CV" && isset($dsc["op1"]["TMPVARCV"])) {
- $op1 = "TMPVARCV";
- } else {
- // Try to use unspecialized handler
- $op1 = "ANY";
- }
- }
- $do($op1, $op2);
- }
- }
- };
- };
- $foreach_op2 = function($do) use ($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") {
- if (!isset($dsc["op2"][$op2])) {
- if ($op2 == "TMP" || $op2 == "VAR") {
- if (isset($dsc["op2"]["TMPVAR"])) {
- $op2 = "TMPVAR";
- } else if (isset($dsc["op2"]["TMPVARCV"])) {
- $op2 = "TMPVARCV";
- } else {
- $op2 = "ANY";
- }
- } else if ($op2 == "CV" && isset($dsc["op2"]["TMPVARCV"])) {
- $op2 = "TMPVARCV";
- } else {
- // Try to use unspecialized handler
- $op2 = "ANY";
- }
- }
- $do($op1, $op2);
- }
- }
- };
- };
- $foreach_op_data = function($do) use ($dsc, $op_types) {
- return function($op1, $op2, $extra_spec = array()) use ($do, $dsc, $op_types) {
- // For each op_data.op_type except ANY
- foreach($op_types as $op_data) {
- if ($op_data != "ANY") {
- if (!isset($dsc["spec"]["OP_DATA"][$op_data])) {
- if ($op_data == "TMP" || $op_data == "VAR") {
- if (isset($dsc["spec"]["OP_DATA"]["TMPVAR"])) {
- $op_data = "TMPVAR";
- } else if (isset($dsc["spec"]["OP_DATA"]["TMPVARCV"])) {
- $op_data = "TMPVARCV";
- } else {
- // Try to use unspecialized handler
- $op_data = "ANY";
- }
- } else if ($op_data == "CV" && isset($dsc["OP_DATA"]["TMPVARCV"])) {
- $op_data = "TMPVARCV";
- } else {
- // Try to use unspecialized handler
- $op_data = "ANY";
- }
- }
- $do($op1, $op2, array("OP_DATA" => $op_data) + $extra_spec);
- }
- }
- };
- };
- $foreach_extra_spec = function($do, $spec) use ($dsc) {
- return function($op1, $op2, $extra_spec = array()) use ($do, $spec, $dsc) {
- foreach ($dsc["spec"][$spec] as $val) {
- $do($op1, $op2, array($spec => $val) + $extra_spec);
- }
- };
- };
- $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 */
- if (isset($dsc["op1"][$op1]) &&
- isset($dsc["op2"][$op2]) &&
- (!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;
- }
-
- // Emit pointer to specialized handler
- $spec_name = $dsc["op"]."_SPEC".$prefix[$op1].$prefix[$op2].extra_spec_name($extra_spec);
- switch ($kind) {
- case ZEND_VM_KIND_CALL:
- out($f,"$prolog{$spec_name}_HANDLER,\n");
- break;
- case ZEND_VM_KIND_SWITCH:
- out($f,$prolog."(void*)(uintptr_t)$switch_labels[$spec_name],\n");
- break;
- case ZEND_VM_KIND_GOTO:
- out($f,$prolog."(void*)&&{$spec_name}_LABEL,\n");
- break;
- }
- $list[$label] = $spec_name;
- $label++;
- } else {
- // Emit pointer to handler of undefined opcode
- gen_null_label($f, $kind, $prolog);
- $list[$label] = null;
- $label++;
- }
- };
-
- $do = $generate;
- if ($spec_extra) {
- foreach ($spec_extra as $extra => $devnull) {
- if ($extra == "OP_DATA") {
- $do = $foreach_op_data($do);
- } else {
- $do = $foreach_extra_spec($do, $extra);
- }
- }
- }
- if ($spec_op2) {
- $do = $foreach_op2($do);
- }
- if ($spec_op1) {
- $do = $foreach_op1($do);
- }
-
- $do($def_op1_type, $def_op2_type);
- }
- } else {
- // Emit labels for unspecialized executor
-
- // For each opcode in opcode number order
- foreach($opcodes as $num => $dsc) {
- while ($next != $num) {
- // If some opcode numbers are not used then fill hole with pointers
- // to handler of undefined opcode
- switch ($kind) {
- case ZEND_VM_KIND_CALL:
- out($f,$prolog."ZEND_NULL_HANDLER,\n");
- break;
- case ZEND_VM_KIND_SWITCH:
- out($f,$prolog."(void*)(uintptr_t)-1,\n");
- break;
- case ZEND_VM_KIND_GOTO:
- out($f,$prolog."(void*)&&ZEND_NULL_LABEL,\n");
- break;
- }
- $next++;
- }
- if ($num >= 256) {
- continue;
- }
- $next = $num+1;
-
- //ugly trick for ZEND_VM_DEFINE_OP
- if ($dsc["code"]) {
- // Emit pointer to unspecialized handler
- switch ($kind) {
- case ZEND_VM_KIND_CALL:
- out($f,$prolog.$dsc["op"]."_HANDLER,\n");
- break;
- case ZEND_VM_KIND_SWITCH:
- out($f,$prolog."(void*)(uintptr_t)".((string)$num).",\n");
- break;
- case ZEND_VM_KIND_GOTO:
- out($f,$prolog."(void*)&&".$dsc["op"]."_LABEL,\n");
- break;
- }
- $list[] = $dsc["op"];
- } else {
- switch ($kind) {
- case ZEND_VM_KIND_CALL:
- out($f,$prolog."ZEND_NULL_HANDLER,\n");
- break;
- case ZEND_VM_KIND_SWITCH:
- out($f,$prolog."(void*)(uintptr_t)-1,\n");
- break;
- case ZEND_VM_KIND_GOTO:
- out($f,$prolog."(void*)&&ZEND_NULL_LABEL,\n");
- break;
- }
- $list[] = null;
- }
- }
- }
-
- // Emit last handler's label (undefined opcode)
- switch ($kind) {
- case ZEND_VM_KIND_CALL:
- out($f,$prolog."ZEND_NULL_HANDLER\n");
- break;
- case ZEND_VM_KIND_SWITCH:
- out($f,$prolog."(void*)(uintptr_t)-1\n");
- break;
- case ZEND_VM_KIND_GOTO:
- out($f,$prolog."(void*)&&ZEND_NULL_LABEL\n");
- 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);
+ global $opcodes, $opnames, $op_types, $prefix, $op_types_ex;
+
+ $list = [];
+ $next = 0;
+ $label = 0;
+ if ($spec) {
+ // Emit labels for specialized executor
+
+ // For each opcode in opcode number order
+ foreach($opcodes as $num => $dsc) {
+ if (isset($dsc['alias'])) {
+ $specs[$num] = $specs[$opnames[$dsc['alias']]];
+ continue;
+ }
+ $specs[$num] = "$label";
+ $spec_op1 = $spec_op2 = $spec_extra = false;
+ $def_op1_type = $def_op2_type = "ANY";
+ $next = $num + 1;
+ 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";
+ }
+ }
+ 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);
+ }
+ if ($num >= 256) {
+ $opcodes[$num]['spec_code'] = $specs[$num];
+ unset($specs[$num]);
+ }
+
+ $foreach_op1 = function($do) use ($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") {
+ if (!isset($dsc["op1"][$op1])) {
+ if ($op1 == "TMP" || $op1 == "VAR") {
+ if (isset($dsc["op1"]["TMPVAR"])) {
+ $op1 = "TMPVAR";
+ } else if (isset($dsc["op1"]["TMPVARCV"])) {
+ $op1 = "TMPVARCV";
+ } else {
+ $op1 = "ANY";
+ }
+ } else if ($op1 == "CV" && isset($dsc["op1"]["TMPVARCV"])) {
+ $op1 = "TMPVARCV";
+ } else {
+ // Try to use unspecialized handler
+ $op1 = "ANY";
+ }
+ }
+ $do($op1, $op2);
+ }
+ }
+ };
+ };
+ $foreach_op2 = function($do) use ($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") {
+ if (!isset($dsc["op2"][$op2])) {
+ if ($op2 == "TMP" || $op2 == "VAR") {
+ if (isset($dsc["op2"]["TMPVAR"])) {
+ $op2 = "TMPVAR";
+ } else if (isset($dsc["op2"]["TMPVARCV"])) {
+ $op2 = "TMPVARCV";
+ } else {
+ $op2 = "ANY";
+ }
+ } else if ($op2 == "CV" && isset($dsc["op2"]["TMPVARCV"])) {
+ $op2 = "TMPVARCV";
+ } else {
+ // Try to use unspecialized handler
+ $op2 = "ANY";
+ }
+ }
+ $do($op1, $op2);
+ }
+ }
+ };
+ };
+ $foreach_op_data = function($do) use ($dsc, $op_types) {
+ return function($op1, $op2, $extra_spec = array()) use ($do, $dsc, $op_types) {
+ // For each op_data.op_type except ANY
+ foreach($op_types as $op_data) {
+ if ($op_data != "ANY") {
+ if (!isset($dsc["spec"]["OP_DATA"][$op_data])) {
+ if ($op_data == "TMP" || $op_data == "VAR") {
+ if (isset($dsc["spec"]["OP_DATA"]["TMPVAR"])) {
+ $op_data = "TMPVAR";
+ } else if (isset($dsc["spec"]["OP_DATA"]["TMPVARCV"])) {
+ $op_data = "TMPVARCV";
+ } else {
+ // Try to use unspecialized handler
+ $op_data = "ANY";
+ }
+ } else if ($op_data == "CV" && isset($dsc["OP_DATA"]["TMPVARCV"])) {
+ $op_data = "TMPVARCV";
+ } else {
+ // Try to use unspecialized handler
+ $op_data = "ANY";
+ }
+ }
+ $do($op1, $op2, array("OP_DATA" => $op_data) + $extra_spec);
+ }
+ }
+ };
+ };
+ $foreach_extra_spec = function($do, $spec) use ($dsc) {
+ return function($op1, $op2, $extra_spec = array()) use ($do, $spec, $dsc) {
+ foreach ($dsc["spec"][$spec] as $val) {
+ $do($op1, $op2, array($spec => $val) + $extra_spec);
+ }
+ };
+ };
+ $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 */
+ if (isset($dsc["op1"][$op1]) &&
+ isset($dsc["op2"][$op2]) &&
+ (!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;
+ }
+
+ /* Skip SMART_BRANCH specialization for "cold" CONST_CONST instructions */
+ if (isset($extra_spec["SMART_BRANCH"])) {
+ if ($dsc["hot"] === 'HOT_NOCONSTCONST_'
+ || $dsc["hot"] === 'COLD_CONSTCONST_') {
+ if (($op1 === 'CONST') && ($op2 === 'CONST')) {
+ unset($extra_spec["SMART_BRANCH"]);
+ }
+ }
+ }
+
+ // Emit pointer to specialized handler
+ $spec_name = $dsc["op"]."_SPEC".$prefix[$op1].$prefix[$op2].extra_spec_name($extra_spec);
+ switch ($kind) {
+ case ZEND_VM_KIND_CALL:
+ out($f,"$prolog{$spec_name}_HANDLER,\n");
+ break;
+ case ZEND_VM_KIND_SWITCH:
+ out($f,$prolog."(void*)(uintptr_t)$switch_labels[$spec_name],\n");
+ break;
+ case ZEND_VM_KIND_GOTO:
+ out($f,$prolog."(void*)&&{$spec_name}_LABEL,\n");
+ break;
+ }
+ $list[$label] = $spec_name;
+ $label++;
+ } else {
+ // Emit pointer to handler of undefined opcode
+ gen_null_label($f, $kind, $prolog);
+ $list[$label] = null;
+ $label++;
+ }
+ };
+
+ $do = $generate;
+ if ($spec_extra) {
+ foreach ($spec_extra as $extra => $devnull) {
+ if ($extra == "OP_DATA") {
+ $do = $foreach_op_data($do);
+ } else {
+ $do = $foreach_extra_spec($do, $extra);
+ }
+ }
+ }
+ if ($spec_op2) {
+ $do = $foreach_op2($do);
+ }
+ if ($spec_op1) {
+ $do = $foreach_op1($do);
+ }
+
+ $do($def_op1_type, $def_op2_type);
+ }
+ } else {
+ // Emit labels for unspecialized executor
+
+ // For each opcode in opcode number order
+ foreach($opcodes as $num => $dsc) {
+ while ($next != $num) {
+ // If some opcode numbers are not used then fill hole with pointers
+ // to handler of undefined opcode
+ switch ($kind) {
+ case ZEND_VM_KIND_CALL:
+ out($f,$prolog."ZEND_NULL_HANDLER,\n");
+ break;
+ case ZEND_VM_KIND_SWITCH:
+ out($f,$prolog."(void*)(uintptr_t)-1,\n");
+ break;
+ case ZEND_VM_KIND_GOTO:
+ out($f,$prolog."(void*)&&ZEND_NULL_LABEL,\n");
+ break;
+ }
+ $next++;
+ }
+ if ($num >= 256) {
+ continue;
+ }
+ $next = $num+1;
+
+ if (isset($dsc['alias']) && $kind != ZEND_VM_KIND_SWITCH) {
+ // Emit pointer to unspecialized handler
+ switch ($kind) {
+ case ZEND_VM_KIND_CALL:
+ out($f,$prolog.$dsc['alias']."_HANDLER,\n");
+ break;
+ case ZEND_VM_KIND_GOTO:
+ out($f,$prolog."(void*)&&".$dsc['alias']."_LABEL,\n");
+ break;
+ }
+ $list[] = $dsc["op"];
+ } else if ($dsc["code"]) { //ugly trick for ZEND_VM_DEFINE_OP
+ // Emit pointer to unspecialized handler
+ switch ($kind) {
+ case ZEND_VM_KIND_CALL:
+ out($f,$prolog.$dsc["op"]."_HANDLER,\n");
+ break;
+ case ZEND_VM_KIND_SWITCH:
+ out($f,$prolog."(void*)(uintptr_t)".((string)$num).",\n");
+ break;
+ case ZEND_VM_KIND_GOTO:
+ out($f,$prolog."(void*)&&".$dsc["op"]."_LABEL,\n");
+ break;
+ }
+ $list[] = $dsc["op"];
+ } else {
+ switch ($kind) {
+ case ZEND_VM_KIND_CALL:
+ out($f,$prolog."ZEND_NULL_HANDLER,\n");
+ break;
+ case ZEND_VM_KIND_SWITCH:
+ out($f,$prolog."(void*)(uintptr_t)-1,\n");
+ break;
+ case ZEND_VM_KIND_GOTO:
+ out($f,$prolog."(void*)&&ZEND_NULL_LABEL,\n");
+ break;
+ }
+ $list[] = null;
+ }
+ }
+ }
+
+ // Emit last handler's label (undefined opcode)
+ switch ($kind) {
+ case ZEND_VM_KIND_CALL:
+ out($f,$prolog."ZEND_NULL_HANDLER\n");
+ break;
+ case ZEND_VM_KIND_SWITCH:
+ out($f,$prolog."(void*)(uintptr_t)-1\n");
+ break;
+ case ZEND_VM_KIND_GOTO:
+ out($f,$prolog."(void*)&&ZEND_NULL_LABEL\n");
+ 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
function gen_specs($f, $prolog, $specs) {
- $lastdef = array_pop($specs);
- $last = 0;
- foreach ($specs as $num => $def) {
- while (++$last < $num) {
- out($f, "$prolog$lastdef,\n");
- }
- $last = $num;
- out($f, "$prolog$def,\n");
- }
- out($f, "$prolog$lastdef\n");
+ $lastdef = array_pop($specs);
+ $last = 0;
+ foreach ($specs as $num => $def) {
+ while (++$last < $num) {
+ out($f, "$prolog$lastdef,\n");
+ }
+ $last = $num;
+ out($f, "$prolog$def,\n");
+ }
+ out($f, "$prolog$lastdef\n");
}
// Generates handler for undefined opcodes (CALL threading model)
function gen_null_handler($f) {
- static $done = 0;
-
- // New and all executors with CALL threading model can use the same handler
- // for undefined opcodes, do we emit code for it only once
- if (!$done) {
- $done = 1;
- out($f,"static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_NULL_HANDLER(ZEND_OPCODE_HANDLER_ARGS)\n");
- out($f,"{\n");
- out($f,"\tUSE_OPLINE\n");
- out($f,"\n");
- out($f,"\tzend_error_noreturn(E_ERROR, \"Invalid opcode %d/%d/%d.\", OPLINE->opcode, OPLINE->op1_type, OPLINE->op2_type);\n");
- out($f,"\tZEND_VM_NEXT_OPCODE(); /* Never reached */\n");
- out($f,"}\n\n");
- }
+ static $done = 0;
+
+ // New and all executors with CALL threading model can use the same handler
+ // for undefined opcodes, do we emit code for it only once
+ if (!$done) {
+ $done = 1;
+ out($f,"static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_NULL_HANDLER(ZEND_OPCODE_HANDLER_ARGS)\n");
+ out($f,"{\n");
+ out($f,"\tUSE_OPLINE\n");
+ out($f,"\n");
+ out($f,"\tzend_error_noreturn(E_ERROR, \"Invalid opcode %d/%d/%d.\", OPLINE->opcode, OPLINE->op1_type, OPLINE->op2_type);\n");
+ out($f,"\tZEND_VM_NEXT_OPCODE(); /* Never reached */\n");
+ out($f,"}\n\n");
+ }
}
function extra_spec_name($extra_spec) {
- global $prefix;
-
- $s = "";
- if (isset($extra_spec["OP_DATA"])) {
- $s .= "_OP_DATA" . $prefix[$extra_spec["OP_DATA"]];
- }
- if (isset($extra_spec["RETVAL"])) {
- $s .= "_RETVAL_".($extra_spec["RETVAL"] ? "USED" : "UNUSED");
- }
- if (isset($extra_spec["QUICK_ARG"])) {
- if ($extra_spec["QUICK_ARG"]) {
- $s .= "_QUICK";
- }
- }
- if (isset($extra_spec["SMART_BRANCH"])) {
- if ($extra_spec["SMART_BRANCH"] == 1) {
- $s .= "_JMPZ";
- } else if ($extra_spec["SMART_BRANCH"] == 2) {
- $s .= "_JMPNZ";
- }
- }
- if (isset($extra_spec["DIM_OBJ"])) {
- if ($extra_spec["DIM_OBJ"] == 1) {
- $s .= "_DIM";
- } else if ($extra_spec["DIM_OBJ"] == 2) {
- $s .= "_OBJ";
- }
- }
- if (isset($extra_spec["ISSET"])) {
- if ($extra_spec["ISSET"] == 0) {
- $s .= "_SET";
- } else {
- $s .= "_EMPTY";
- }
- }
- return $s;
+ global $prefix;
+
+ $s = "";
+ if (isset($extra_spec["OP_DATA"])) {
+ $s .= "_OP_DATA" . $prefix[$extra_spec["OP_DATA"]];
+ }
+ if (isset($extra_spec["RETVAL"])) {
+ $s .= "_RETVAL_".($extra_spec["RETVAL"] ? "USED" : "UNUSED");
+ }
+ if (isset($extra_spec["QUICK_ARG"])) {
+ if ($extra_spec["QUICK_ARG"]) {
+ $s .= "_QUICK";
+ }
+ }
+ if (isset($extra_spec["SMART_BRANCH"])) {
+ if ($extra_spec["SMART_BRANCH"] == 1) {
+ $s .= "_JMPZ";
+ } else if ($extra_spec["SMART_BRANCH"] == 2) {
+ $s .= "_JMPNZ";
+ }
+ }
+ if (isset($extra_spec["ISSET"])) {
+ if ($extra_spec["ISSET"] == 0) {
+ $s .= "_SET";
+ } else {
+ $s .= "_EMPTY";
+ }
+ }
+ return $s;
}
function extra_spec_flags($extra_spec) {
- $s = array();
- if (isset($extra_spec["OP_DATA"])) {
- $s[] = "SPEC_RULE_OP_DATA";
- }
- if (isset($extra_spec["RETVAL"])) {
- $s[] = "SPEC_RULE_RETVAL";
- }
- if (isset($extra_spec["QUICK_ARG"])) {
- $s[] = "SPEC_RULE_QUICK_ARG";
- }
- if (isset($extra_spec["SMART_BRANCH"])) {
- $s[] = "SPEC_RULE_SMART_BRANCH";
- }
- 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;
+ $s = array();
+ if (isset($extra_spec["OP_DATA"])) {
+ $s[] = "SPEC_RULE_OP_DATA";
+ }
+ if (isset($extra_spec["RETVAL"])) {
+ $s[] = "SPEC_RULE_RETVAL";
+ }
+ if (isset($extra_spec["QUICK_ARG"])) {
+ $s[] = "SPEC_RULE_QUICK_ARG";
+ }
+ if (isset($extra_spec["SMART_BRANCH"])) {
+ $s[] = "SPEC_RULE_SMART_BRANCH";
+ }
+ if (isset($extra_spec["COMMUTATIVE"])) {
+ $s[] = "SPEC_RULE_COMMUTATIVE";
+ }
+ if (isset($extra_spec["ISSET"])) {
+ $s[] = "SPEC_RULE_ISSET";
+ }
+ return $s;
}
function extra_spec_handler($dsc) {
- global $op_types_ex;
-
- if (!isset($dsc["spec"])) {
- return array(array());
- }
- $specs = $dsc["spec"];
-
- if (isset($specs["OP_DATA"])) {
- $op_data_specs = $specs["OP_DATA"];
- $specs["OP_DATA"] = array();
- foreach($op_types_ex as $op_data) {
- if (isset($dsc["spec"]["OP_DATA"][$op_data])) {
- $specs["OP_DATA"][] = $op_data;
- }
- }
- }
-
- $f = function($specs) use (&$f) {
- $spec = key($specs);
- $top = array_shift($specs);
- if ($specs) {
- $next = $f($specs);
- } else {
- $next = array(array());
- }
- $ret = array();
- foreach ($next as $existing) {
- foreach ($top as $mode) {
- $ret[] = array($spec => $mode) + $existing;
- }
- }
- return $ret;
- };
- return $f($specs);
+ global $op_types_ex;
+
+ if (!isset($dsc["spec"])) {
+ return array(array());
+ }
+ $specs = $dsc["spec"];
+
+ if (isset($specs["OP_DATA"])) {
+ $op_data_specs = $specs["OP_DATA"];
+ $specs["OP_DATA"] = array();
+ foreach($op_types_ex as $op_data) {
+ if (isset($dsc["spec"]["OP_DATA"][$op_data])) {
+ $specs["OP_DATA"][] = $op_data;
+ }
+ }
+ }
+
+ $f = function($specs) use (&$f) {
+ $spec = key($specs);
+ $top = array_shift($specs);
+ if ($specs) {
+ $next = $f($specs);
+ } else {
+ $next = array(array());
+ }
+ $ret = array();
+ foreach ($next as $existing) {
+ foreach ($top as $mode) {
+ $ret[] = array($spec => $mode) + $existing;
+ }
+ }
+ return $ret;
+ };
+ 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;
+ $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, $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
- $op1t = $op_types_ex;
- // for each op1.op_type
- foreach($op1t as $op1) {
- $op2t = $op_types_ex;
- // for each op2.op_type
- foreach($op2t as $op2) {
- // for each handlers in helpers in original order
- foreach ($list as $lineno => $dsc) {
- if (isset($dsc["handler"])) {
- $num = $dsc["handler"];
- foreach (extra_spec_handler($opcodes[$num]) as $extra_spec) {
- // Check if handler accepts such types of operands (op1 and op2)
- if (isset($opcodes[$num]["op1"][$op1]) &&
- isset($opcodes[$num]["op2"][$op2])) {
- // Generate handler code
- gen_handler($f, 1, $kind, $opcodes[$num]["op"], $op1, $op2, isset($opcodes[$num]["use"]), $opcodes[$num]["code"], $lineno, $opcodes[$num], $extra_spec, $switch_labels);
- }
- }
- } else if (isset($dsc["helper"])) {
- $num = $dsc["helper"];
- foreach (extra_spec_handler($helpers[$num]) as $extra_spec) {
- // Check if handler accepts such types of operands (op1 and op2)
- 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"], $helpers[$num]["cold"], $helpers[$num]["hot"], $extra_spec);
- }
- }
- } else {
- var_dump($dsc);
- die("??? $kind:$num\n");
- }
- }
- }
- }
- } else {
- // Produce unspecialized executor
-
- // for each handlers in helpers in original order
- foreach ($list as $lineno => $dsc) {
- if (isset($dsc["handler"])) {
- $num = $dsc["handler"];
- // Generate handler code
- if ($num < 256) {
- gen_handler($f, 0, $kind, $opcodes[$num]["op"], "ANY", "ANY", isset($opcodes[$num]["use"]), $opcodes[$num]["code"], $lineno, $opcodes[$num]);
- }
- } 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"], $helpers[$num]["cold"], $helpers[$num]["hot"]);
- } else {
- var_dump($dsc);
- die("??? $kind:$num\n");
- }
- }
- }
-
- 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);
- }
-
- // Generate handler for undefined opcodes
- switch ($kind) {
- case ZEND_VM_KIND_CALL:
- gen_null_handler($f);
- break;
- case ZEND_VM_KIND_SWITCH:
- 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;
- case ZEND_VM_KIND_GOTO:
- out($f,"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;
- case ZEND_VM_KIND_HYBRID:
- out($f,"\t\t\tHYBRID_CASE(HYBRID_HALT):\n");
- out($f,"\t\t\t\texecute_data = orig_execute_data;\n");
- 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\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;
- }
+ 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
+ $op1t = $op_types_ex;
+ // for each op1.op_type
+ foreach($op1t as $op1) {
+ $op2t = $op_types_ex;
+ // for each op2.op_type
+ foreach($op2t as $op2) {
+ // for each handlers in helpers in original order
+ foreach ($list as $lineno => $dsc) {
+ if (isset($dsc["handler"])) {
+ $num = $dsc["handler"];
+ foreach (extra_spec_handler($opcodes[$num]) as $extra_spec) {
+ // Check if handler accepts such types of operands (op1 and op2)
+ if (isset($opcodes[$num]["op1"][$op1]) &&
+ isset($opcodes[$num]["op2"][$op2])) {
+ // Generate handler code
+ gen_handler($f, 1, $kind, $opcodes[$num]["op"], $op1, $op2, isset($opcodes[$num]["use"]), $opcodes[$num]["code"], $lineno, $opcodes[$num], $extra_spec, $switch_labels);
+ }
+ }
+ } else if (isset($dsc["helper"])) {
+ $num = $dsc["helper"];
+ foreach (extra_spec_handler($helpers[$num]) as $extra_spec) {
+ // Check if handler accepts such types of operands (op1 and op2)
+ 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"], $helpers[$num]["cold"], $helpers[$num]["hot"], $extra_spec);
+ }
+ }
+ } else {
+ var_dump($dsc);
+ die("??? $kind:$num\n");
+ }
+ }
+ }
+ }
+ } else {
+ // Produce unspecialized executor
+
+ // for each handlers in helpers in original order
+ foreach ($list as $lineno => $dsc) {
+ if (isset($dsc["handler"])) {
+ $num = $dsc["handler"];
+ // Generate handler code
+ if ($num < 256) {
+ gen_handler($f, 0, $kind, $opcodes[$num]["op"], "ANY", "ANY", isset($opcodes[$num]["use"]), $opcodes[$num]["code"], $lineno, $opcodes[$num]);
+ }
+ } 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"], $helpers[$num]["cold"], $helpers[$num]["hot"]);
+ } else {
+ var_dump($dsc);
+ die("??? $kind:$num\n");
+ }
+ }
+ }
+
+ 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);
+ }
+
+ // Generate handler for undefined opcodes
+ switch ($kind) {
+ case ZEND_VM_KIND_CALL:
+ gen_null_handler($f);
+ break;
+ case ZEND_VM_KIND_SWITCH:
+ 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;
+ case ZEND_VM_KIND_GOTO:
+ out($f,"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;
+ case ZEND_VM_KIND_HYBRID:
+ out($f,"\t\t\tHYBRID_CASE(HYBRID_HALT):\n");
+ out($f,"#ifdef ZEND_VM_FP_GLOBAL_REG\n");
+ out($f,"\t\t\t\texecute_data = orig_execute_data;\n");
+ out($f,"#endif\n");
+ out($f,"#ifdef ZEND_VM_IP_GLOBAL_REG\n");
+ out($f,"\t\t\t\topline = orig_opline;\n");
+ out($f,"#endif\n");
+ out($f,"\t\t\t\treturn;\n");
+ out($f,"\t\t\tHYBRID_DEFAULT:\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;
+ }
}
function skip_blanks($f, $prolog, $epilog) {
- if (trim($prolog) != "" || trim($epilog) != "") {
- out($f, $prolog.$epilog);
- }
+ if (trim($prolog) != "" || trim($epilog) != "") {
+ out($f, $prolog.$epilog);
+ }
}
// Generates executor from skeleton file and definition (specialized or unspecialized)
function gen_executor($f, $skl, $spec, $kind, $executor_name, $initializer_name) {
- global $params, $skeleton_file, $line_no;
-
- $switch_labels = array();
- $lineno = 0;
- foreach ($skl as $line) {
- // Skeleton file contains special markers in form %NAME% those are
- // substituted by custom code
- if (preg_match("/(.*)[{][%]([A-Z_]*)[%][}](.*)/", $line, $m)) {
- 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");
- out($f,"#define SPEC_RULE_RETVAL 0x00080000\n");
- 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 * 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 * const * zend_opcode_handler_funcs;\n");
- out($f,"static zend_op hybrid_halt_op;\n");
- out($f,"#endif\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");
- out($f,"#else\n");
- 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");
- out($f,"#define HYBRID_NEXT() goto *(void**)(OPLINE->handler)\n");
- out($f,"#define HYBRID_SWITCH() HYBRID_NEXT();\n");
- out($f,"#define HYBRID_CASE(op) op ## _LABEL\n");
- out($f,"#define HYBRID_BREAK() HYBRID_NEXT()\n");
- out($f,"#define HYBRID_DEFAULT ZEND_NULL_LABEL\n");
- out($f,"#endif\n");
- case ZEND_VM_KIND_CALL:
- out($f,"\n");
- out($f,"#ifdef ZEND_VM_FP_GLOBAL_REG\n");
- out($f,"# define ZEND_OPCODE_HANDLER_ARGS void\n");
- out($f,"# define ZEND_OPCODE_HANDLER_ARGS_PASSTHRU\n");
- out($f,"# define ZEND_OPCODE_HANDLER_ARGS_DC\n");
- out($f,"# define ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC\n");
- out($f,"#else\n");
- out($f,"# define ZEND_OPCODE_HANDLER_ARGS zend_execute_data *execute_data\n");
- out($f,"# define ZEND_OPCODE_HANDLER_ARGS_PASSTHRU execute_data\n");
- out($f,"# define ZEND_OPCODE_HANDLER_ARGS_DC , ZEND_OPCODE_HANDLER_ARGS\n");
- out($f,"# define ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC , ZEND_OPCODE_HANDLER_ARGS_PASSTHRU\n");
- out($f,"#endif\n");
- out($f,"\n");
- out($f,"#if defined(ZEND_VM_FP_GLOBAL_REG) && defined(ZEND_VM_IP_GLOBAL_REG)\n");
- out($f,"# define ZEND_OPCODE_HANDLER_RET void\n");
- out($f,"# define ZEND_VM_TAIL_CALL(call) call; return\n");
- out($f,"# ifdef ZEND_VM_TAIL_CALL_DISPATCH\n");
- out($f,"# define ZEND_VM_CONTINUE() ((opcode_handler_t)OPLINE->handler)(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); return\n");
- out($f,"# else\n");
- out($f,"# define ZEND_VM_CONTINUE() return\n");
- out($f,"# endif\n");
- 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 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");
- out($f,"# define ZEND_VM_TAIL_CALL(call) return call\n");
- out($f,"# define ZEND_VM_CONTINUE() return 0\n");
- 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");
- out($f,"typedef ZEND_OPCODE_HANDLER_RET (ZEND_FASTCALL *opcode_handler_t) (ZEND_OPCODE_HANDLER_ARGS);\n");
- out($f,"\n");
- out($f,"#undef OPLINE\n");
- out($f,"#undef DCL_OPLINE\n");
- out($f,"#undef USE_OPLINE\n");
- out($f,"#undef LOAD_OPLINE\n");
- out($f,"#undef LOAD_OPLINE_EX\n");
- out($f,"#undef SAVE_OPLINE\n");
- out($f,"#define DCL_OPLINE\n");
- out($f,"#ifdef ZEND_VM_IP_GLOBAL_REG\n");
- out($f,"# define OPLINE opline\n");
- out($f,"# define USE_OPLINE\n");
- out($f,"# define LOAD_OPLINE() opline = EX(opline)\n");
- out($f,"# define LOAD_NEXT_OPLINE() opline = EX(opline) + 1\n");
- out($f,"# define SAVE_OPLINE() EX(opline) = opline\n");
- out($f,"#else\n");
- out($f,"# define OPLINE EX(opline)\n");
- out($f,"# define USE_OPLINE const zend_op *opline = EX(opline);\n");
- out($f,"# define LOAD_OPLINE()\n");
- out($f,"# define LOAD_NEXT_OPLINE() ZEND_VM_INC_OPCODE()\n");
- out($f,"# define SAVE_OPLINE()\n");
- out($f,"#endif\n");
- out($f,"#undef HANDLE_EXCEPTION\n");
- out($f,"#undef HANDLE_EXCEPTION_LEAVE\n");
- out($f,"#define HANDLE_EXCEPTION() LOAD_OPLINE(); ZEND_VM_CONTINUE()\n");
- out($f,"#define HANDLE_EXCEPTION_LEAVE() LOAD_OPLINE(); ZEND_VM_LEAVE()\n");
- out($f,"#if defined(ZEND_VM_FP_GLOBAL_REG)\n");
- 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_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");
- out($f,"#define ZEND_VM_INTERRUPT() ZEND_VM_TAIL_CALL(zend_interrupt_helper".($spec?"_SPEC":"")."(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));\n");
- out($f,"#define ZEND_VM_LOOP_INTERRUPT() zend_interrupt_helper".($spec?"_SPEC":"")."(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);\n");
- if ($kind == ZEND_VM_KIND_HYBRID) {
- out($f,"#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));\n");
- } else {
- 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);\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:
- out($f,"\n");
- out($f,"#undef OPLINE\n");
- out($f,"#undef DCL_OPLINE\n");
- out($f,"#undef USE_OPLINE\n");
- out($f,"#undef LOAD_OPLINE\n");
- out($f,"#undef LOAD_NEXT_OPLINE\n");
- out($f,"#undef SAVE_OPLINE\n");
- out($f,"#define OPLINE opline\n");
- out($f,"#ifdef ZEND_VM_IP_GLOBAL_REG\n");
- out($f,"# define DCL_OPLINE register const zend_op *opline __asm__(ZEND_VM_IP_GLOBAL_REG);\n");
- out($f,"#else\n");
- out($f,"# define DCL_OPLINE const zend_op *opline;\n");
- out($f,"#endif\n");
- out($f,"#define USE_OPLINE\n");
- out($f,"#define LOAD_OPLINE() opline = EX(opline)\n");
- out($f,"#define LOAD_NEXT_OPLINE() opline = EX(opline) + 1\n");
- out($f,"#define SAVE_OPLINE() EX(opline) = opline\n");
- out($f,"#undef HANDLE_EXCEPTION\n");
- out($f,"#undef HANDLE_EXCEPTION_LEAVE\n");
- out($f,"#define HANDLE_EXCEPTION() LOAD_OPLINE(); ZEND_VM_CONTINUE()\n");
- out($f,"#define HANDLE_EXCEPTION_LEAVE() LOAD_OPLINE(); ZEND_VM_LEAVE()\n");
- out($f,"#define ZEND_VM_CONTINUE() goto zend_vm_continue\n");
- out($f,"#define ZEND_VM_RETURN() return\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");
- out($f,"#define ZEND_VM_DISPATCH(opcode, opline) dispatch_handler = zend_vm_get_opcode_handler(opcode, opline); goto zend_vm_dispatch;\n");
- out($f,"\n");
- break;
- case ZEND_VM_KIND_GOTO:
- out($f,"\n");
- out($f,"#undef OPLINE\n");
- out($f,"#undef DCL_OPLINE\n");
- out($f,"#undef USE_OPLINE\n");
- out($f,"#undef LOAD_OPLINE\n");
- out($f,"#undef LOAD_NEXT_OPLINE\n");
- out($f,"#undef SAVE_OPLINE\n");
- out($f,"#define OPLINE opline\n");
- out($f,"#ifdef ZEND_VM_IP_GLOBAL_REG\n");
- out($f,"# define DCL_OPLINE register const zend_op *opline __asm__(ZEND_VM_IP_GLOBAL_REG);\n");
- out($f,"#else\n");
- out($f,"# define DCL_OPLINE const zend_op *opline;\n");
- out($f,"#endif\n");
- out($f,"#define USE_OPLINE\n");
- out($f,"#define LOAD_OPLINE() opline = EX(opline)\n");
- out($f,"#define LOAD_NEXT_OPLINE() opline = EX(opline) + 1\n");
- out($f,"#define SAVE_OPLINE() EX(opline) = opline\n");
- out($f,"#undef HANDLE_EXCEPTION\n");
- out($f,"#undef HANDLE_EXCEPTION_LEAVE\n");
- if (ZEND_VM_SPEC) {
- out($f,"#define HANDLE_EXCEPTION() goto ZEND_HANDLE_EXCEPTION_SPEC_LABEL\n");
- out($f,"#define HANDLE_EXCEPTION_LEAVE() goto ZEND_HANDLE_EXCEPTION_SPEC_LABEL\n");
- } else {
- out($f,"#define HANDLE_EXCEPTION() goto ZEND_HANDLE_EXCEPTION_LABEL\n");
- out($f,"#define HANDLE_EXCEPTION_LEAVE() goto ZEND_HANDLE_EXCEPTION_LABEL\n");
- }
- 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_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");
- out($f,"#define ZEND_VM_DISPATCH(opcode, opline) goto *(void**)(zend_vm_get_opcode_handler(opcode, opline));\n");
- out($f,"\n");
- break;
- }
- 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");
+ global $params, $skeleton_file, $line_no;
+
+ $switch_labels = array();
+ $lineno = 0;
+ foreach ($skl as $line) {
+ // Skeleton file contains special markers in form %NAME% those are
+ // substituted by custom code
+ if (preg_match("/(.*)[{][%]([A-Z_]*)[%][}](.*)/", $line, $m)) {
+ 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");
+ out($f,"#define SPEC_RULE_RETVAL 0x00080000\n");
+ out($f,"#define SPEC_RULE_QUICK_ARG 0x00100000\n");
+ out($f,"#define SPEC_RULE_SMART_BRANCH 0x00200000\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 * 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 * const * zend_opcode_handler_funcs;\n");
+ out($f,"static zend_op hybrid_halt_op;\n");
+ out($f,"#endif\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");
+ out($f,"#else\n");
+ 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");
+ out($f,"#define HYBRID_NEXT() goto *(void**)(OPLINE->handler)\n");
+ out($f,"#define HYBRID_SWITCH() HYBRID_NEXT();\n");
+ out($f,"#define HYBRID_CASE(op) op ## _LABEL\n");
+ out($f,"#define HYBRID_BREAK() HYBRID_NEXT()\n");
+ out($f,"#define HYBRID_DEFAULT ZEND_NULL_LABEL\n");
+ out($f,"#endif\n");
+ case ZEND_VM_KIND_CALL:
+ out($f,"\n");
+ out($f,"#ifdef ZEND_VM_FP_GLOBAL_REG\n");
+ out($f,"# define ZEND_OPCODE_HANDLER_ARGS void\n");
+ out($f,"# define ZEND_OPCODE_HANDLER_ARGS_PASSTHRU\n");
+ out($f,"# define ZEND_OPCODE_HANDLER_ARGS_DC\n");
+ out($f,"# define ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC\n");
+ out($f,"#else\n");
+ out($f,"# define ZEND_OPCODE_HANDLER_ARGS zend_execute_data *execute_data\n");
+ out($f,"# define ZEND_OPCODE_HANDLER_ARGS_PASSTHRU execute_data\n");
+ out($f,"# define ZEND_OPCODE_HANDLER_ARGS_DC , ZEND_OPCODE_HANDLER_ARGS\n");
+ out($f,"# define ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC , ZEND_OPCODE_HANDLER_ARGS_PASSTHRU\n");
+ out($f,"#endif\n");
+ out($f,"\n");
+ out($f,"#if defined(ZEND_VM_FP_GLOBAL_REG) && defined(ZEND_VM_IP_GLOBAL_REG)\n");
+ out($f,"# define ZEND_OPCODE_HANDLER_RET void\n");
+ out($f,"# define ZEND_VM_TAIL_CALL(call) call; return\n");
+ out($f,"# ifdef ZEND_VM_TAIL_CALL_DISPATCH\n");
+ out($f,"# define ZEND_VM_CONTINUE() ((opcode_handler_t)OPLINE->handler)(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); return\n");
+ out($f,"# else\n");
+ out($f,"# define ZEND_VM_CONTINUE() return\n");
+ out($f,"# endif\n");
+ 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 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");
+ out($f,"# define ZEND_VM_TAIL_CALL(call) return call\n");
+ out($f,"# define ZEND_VM_CONTINUE() return 0\n");
+ 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");
+ out($f,"typedef ZEND_OPCODE_HANDLER_RET (ZEND_FASTCALL *opcode_handler_t) (ZEND_OPCODE_HANDLER_ARGS);\n");
+ out($f,"\n");
+ out($f,"#undef OPLINE\n");
+ out($f,"#undef DCL_OPLINE\n");
+ out($f,"#undef USE_OPLINE\n");
+ out($f,"#undef LOAD_OPLINE\n");
+ out($f,"#undef LOAD_OPLINE_EX\n");
+ out($f,"#undef SAVE_OPLINE\n");
+ out($f,"#undef SAVE_OPLINE_EX\n");
+ out($f,"#define DCL_OPLINE\n");
+ out($f,"#ifdef ZEND_VM_IP_GLOBAL_REG\n");
+ out($f,"# define OPLINE opline\n");
+ out($f,"# define USE_OPLINE\n");
+ out($f,"# define LOAD_OPLINE() opline = EX(opline)\n");
+ out($f,"# define LOAD_OPLINE_EX()\n");
+ out($f,"# define LOAD_NEXT_OPLINE() opline = EX(opline) + 1\n");
+ out($f,"# define SAVE_OPLINE() EX(opline) = opline\n");
+ out($f,"# define SAVE_OPLINE_EX() SAVE_OPLINE()\n");
+ out($f,"#else\n");
+ out($f,"# define OPLINE EX(opline)\n");
+ out($f,"# define USE_OPLINE const zend_op *opline = EX(opline);\n");
+ out($f,"# define LOAD_OPLINE()\n");
+ out($f,"# define LOAD_OPLINE_EX()\n");
+ out($f,"# define LOAD_NEXT_OPLINE() ZEND_VM_INC_OPCODE()\n");
+ out($f,"# define SAVE_OPLINE()\n");
+ out($f,"# define SAVE_OPLINE_EX()\n");
+ out($f,"#endif\n");
+ out($f,"#undef HANDLE_EXCEPTION\n");
+ out($f,"#undef HANDLE_EXCEPTION_LEAVE\n");
+ out($f,"#define HANDLE_EXCEPTION() LOAD_OPLINE(); ZEND_VM_CONTINUE()\n");
+ out($f,"#define HANDLE_EXCEPTION_LEAVE() LOAD_OPLINE(); ZEND_VM_LEAVE()\n");
+ out($f,"#if defined(ZEND_VM_FP_GLOBAL_REG)\n");
+ 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_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");
+ out($f,"#define ZEND_VM_INTERRUPT() ZEND_VM_TAIL_CALL(zend_interrupt_helper".($spec?"_SPEC":"")."(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));\n");
+ out($f,"#define ZEND_VM_LOOP_INTERRUPT() zend_interrupt_helper".($spec?"_SPEC":"")."(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);\n");
+ if ($kind == ZEND_VM_KIND_HYBRID) {
+ out($f,"#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));\n");
+ } else {
+ 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);\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:
+ out($f,"\n");
+ out($f,"#undef OPLINE\n");
+ out($f,"#undef DCL_OPLINE\n");
+ out($f,"#undef USE_OPLINE\n");
+ out($f,"#undef LOAD_OPLINE\n");
+ out($f,"#undef LOAD_OPLINE_EX\n");
+ out($f,"#undef LOAD_NEXT_OPLINE\n");
+ out($f,"#undef SAVE_OPLINE\n");
+ out($f,"#undef SAVE_OPLINE_EX\n");
+ out($f,"#define OPLINE opline\n");
+ out($f,"#ifdef ZEND_VM_IP_GLOBAL_REG\n");
+ out($f,"# define DCL_OPLINE register const zend_op *opline __asm__(ZEND_VM_IP_GLOBAL_REG);\n");
+ out($f,"#else\n");
+ out($f,"# define DCL_OPLINE const zend_op *opline;\n");
+ out($f,"#endif\n");
+ out($f,"#define USE_OPLINE\n");
+ out($f,"#define LOAD_OPLINE() opline = EX(opline)\n");
+ out($f,"# define LOAD_OPLINE_EX() LOAD_OPLINE()\n");
+ out($f,"#define LOAD_NEXT_OPLINE() opline = EX(opline) + 1\n");
+ out($f,"#define SAVE_OPLINE() EX(opline) = opline\n");
+ out($f,"#define SAVE_OPLINE_EX()\n");
+ out($f,"#undef HANDLE_EXCEPTION\n");
+ out($f,"#undef HANDLE_EXCEPTION_LEAVE\n");
+ out($f,"#define HANDLE_EXCEPTION() LOAD_OPLINE(); ZEND_VM_CONTINUE()\n");
+ out($f,"#define HANDLE_EXCEPTION_LEAVE() LOAD_OPLINE(); ZEND_VM_LEAVE()\n");
+ out($f,"#define ZEND_VM_CONTINUE() goto zend_vm_continue\n");
+ out($f,"#define ZEND_VM_RETURN() return\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");
+ out($f,"#define ZEND_VM_DISPATCH(opcode, opline) dispatch_handler = zend_vm_get_opcode_handler(opcode, opline); goto zend_vm_dispatch;\n");
+ out($f,"\n");
+ break;
+ case ZEND_VM_KIND_GOTO:
+ out($f,"\n");
+ out($f,"#undef OPLINE\n");
+ out($f,"#undef DCL_OPLINE\n");
+ out($f,"#undef USE_OPLINE\n");
+ out($f,"#undef LOAD_OPLINE\n");
+ out($f,"#undef LOAD_OPLINE_EX\n");
+ out($f,"#undef LOAD_NEXT_OPLINE\n");
+ out($f,"#undef SAVE_OPLINE\n");
+ out($f,"#undef SAVE_OPLINE_EX\n");
+ out($f,"#define OPLINE opline\n");
+ out($f,"#ifdef ZEND_VM_IP_GLOBAL_REG\n");
+ out($f,"# define DCL_OPLINE register const zend_op *opline __asm__(ZEND_VM_IP_GLOBAL_REG);\n");
+ out($f,"#else\n");
+ out($f,"# define DCL_OPLINE const zend_op *opline;\n");
+ out($f,"#endif\n");
+ out($f,"#define USE_OPLINE\n");
+ out($f,"#define LOAD_OPLINE() opline = EX(opline)\n");
+ out($f,"#define LOAD_OPLINE_EX() LOAD_OPLINE()\n");
+ out($f,"#define LOAD_NEXT_OPLINE() opline = EX(opline) + 1\n");
+ out($f,"#define SAVE_OPLINE() EX(opline) = opline\n");
+ out($f,"#define SAVE_OPLINE_EX()\n");
+ out($f,"#undef HANDLE_EXCEPTION\n");
+ out($f,"#undef HANDLE_EXCEPTION_LEAVE\n");
+ if (ZEND_VM_SPEC) {
+ out($f,"#define HANDLE_EXCEPTION() goto ZEND_HANDLE_EXCEPTION_SPEC_LABEL\n");
+ out($f,"#define HANDLE_EXCEPTION_LEAVE() goto ZEND_HANDLE_EXCEPTION_SPEC_LABEL\n");
+ } else {
+ out($f,"#define HANDLE_EXCEPTION() goto ZEND_HANDLE_EXCEPTION_LABEL\n");
+ out($f,"#define HANDLE_EXCEPTION_LEAVE() goto ZEND_HANDLE_EXCEPTION_LABEL\n");
+ }
+ 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_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");
+ out($f,"#define ZEND_VM_DISPATCH(opcode, opline) goto *(void**)(zend_vm_get_opcode_handler(opcode, opline));\n");
+ out($f,"\n");
+ break;
+ }
+ 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,"\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":
- out($f, $m[1].$executor_name.$m[3]."\n");
- break;
- case "HELPER_VARS":
- if ($kind != ZEND_VM_KIND_CALL && $kind != ZEND_VM_KIND_HYBRID) {
- if ($kind == ZEND_VM_KIND_SWITCH) {
- out($f,$m[1]."const void *dispatch_handler;\n");
- }
- // Emit local variables those are used for helpers' parameters
- foreach ($params as $param => $x) {
- out($f,$m[1].$param.";\n");
- }
- out($f,"#ifdef ZEND_VM_FP_GLOBAL_REG\n");
- out($f,$m[1]."register zend_execute_data *execute_data __asm__(ZEND_VM_FP_GLOBAL_REG) = ex;\n");
- out($f,"#else\n");
- out($f,$m[1]."zend_execute_data *execute_data = ex;\n");
- out($f,"#endif\n");
- } else {
- out($f,"#ifdef ZEND_VM_IP_GLOBAL_REG\n");
- out($f,$m[1]."const zend_op *orig_opline = opline;\n");
- out($f,"#endif\n");
- out($f,"#ifdef ZEND_VM_FP_GLOBAL_REG\n");
- out($f,$m[1]."zend_execute_data *orig_execute_data = execute_data;\n");
- out($f,$m[1]."execute_data = ex;\n");
- out($f,"#else\n");
- out($f,$m[1]."zend_execute_data *execute_data = ex;\n");
- out($f,"#endif\n");
- }
- break;
- case "INTERNAL_LABELS":
- if ($kind == ZEND_VM_KIND_GOTO || $kind == ZEND_VM_KIND_HYBRID) {
- // Emit array of labels of opcode handlers and code for
- // zend_opcode_handlers initialization
- if ($kind == ZEND_VM_KIND_HYBRID) {
- out($f,"#if (ZEND_VM_KIND == ZEND_VM_KIND_HYBRID)\n");
- }
- $prolog = $m[1];
- out($f,$prolog."if (UNEXPECTED(execute_data == NULL)) {\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");
- out($f,$prolog."\tzend_handlers_count = sizeof(labels) / sizeof(void*);\n");
- if ($kind == ZEND_VM_KIND_HYBRID) {
- out($f,$prolog."\tmemset(&hybrid_halt_op, 0, sizeof(hybrid_halt_op));\n");
- out($f,$prolog."\thybrid_halt_op.handler = (void*)&&HYBRID_HALT_LABEL;\n");
- out($f,$prolog."\tgoto HYBRID_HALT_LABEL;\n");
- } else {
- out($f,$prolog."\treturn;\n");
- }
- out($f,$prolog."}\n");
- if ($kind == ZEND_VM_KIND_HYBRID) {
- out($f,"#endif\n");
- }
- } else {
- skip_blanks($f, $m[1], $m[3]);
- }
- break;
- case "ZEND_VM_CONTINUE_LABEL":
- if ($kind == ZEND_VM_KIND_CALL || $kind == ZEND_VM_KIND_HYBRID) {
- // Only SWITCH dispatch method use it
- out($f,"#if !defined(ZEND_VM_FP_GLOBAL_REG) || !defined(ZEND_VM_IP_GLOBAL_REG)\n");
- out($f,$m[1]."\tint ret;".$m[3]."\n");
- out($f,"#endif\n");
- } else if ($kind == ZEND_VM_KIND_SWITCH) {
- // Only SWITCH dispatch method use it
- out($f,"zend_vm_continue:".$m[3]."\n");
- } else {
- skip_blanks($f, $m[1], $m[3]);
- }
- break;
- case "ZEND_VM_DISPATCH":
- // Emit code that dispatches to opcode handler
- switch ($kind) {
- case ZEND_VM_KIND_SWITCH:
- out($f, $m[1]."dispatch_handler = OPLINE->handler;\nzend_vm_dispatch:\n".$m[1]."switch ((int)(uintptr_t)dispatch_handler)".$m[3]."\n");
- break;
- case ZEND_VM_KIND_GOTO:
- out($f, $m[1]."goto *(void**)(OPLINE->handler);".$m[3]."\n");
- break;
- case ZEND_VM_KIND_HYBRID:
- out($f,"#if (ZEND_VM_KIND == ZEND_VM_KIND_HYBRID)\n");
- out($f, $m[1]."HYBRID_SWITCH()".$m[3]."\n");
- out($f,"#else\n");
- case ZEND_VM_KIND_CALL:
- out($f,"#if defined(ZEND_VM_FP_GLOBAL_REG) && defined(ZEND_VM_IP_GLOBAL_REG)\n");
- out($f, $m[1]."((opcode_handler_t)OPLINE->handler)(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);\n");
- out($f, $m[1]."if (UNEXPECTED(!OPLINE))".$m[3]."\n");
- out($f,"#else\n");
- out($f, $m[1]."if (UNEXPECTED((ret = ((opcode_handler_t)OPLINE->handler)(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)) != 0))".$m[3]."\n");
- out($f,"#endif\n");
- if ($kind == ZEND_VM_KIND_HYBRID) {
- out($f,"#endif\n");
- }
- break;
- }
- break;
- case "INTERNAL_EXECUTOR":
- if ($kind != ZEND_VM_KIND_CALL) {
- // Emit executor code
- if ($kind == ZEND_VM_KIND_HYBRID) {
- out($f,"#if (ZEND_VM_KIND == ZEND_VM_KIND_HYBRID)\n");
- }
- gen_executor_code($f, $spec, $kind, $m[1], $switch_labels);
- }
- if ($kind == ZEND_VM_KIND_CALL || $kind == ZEND_VM_KIND_HYBRID) {
- // Executor is defined as a set of functions
- if ($kind == ZEND_VM_KIND_HYBRID) {
- out($f,"#else\n");
- }
- out($f,
- "#ifdef ZEND_VM_FP_GLOBAL_REG\n" .
- $m[1]."execute_data = orig_execute_data;\n" .
- "# ifdef ZEND_VM_IP_GLOBAL_REG\n" .
- $m[1]."opline = orig_opline;\n" .
- "# endif\n" .
- $m[1]."return;\n" .
- "#else\n" .
- $m[1]."if (EXPECTED(ret > 0)) {\n" .
- $m[1]."\texecute_data = EG(current_execute_data);\n".
- $m[1]."\tZEND_VM_LOOP_INTERRUPT_CHECK();\n".
- $m[1]."} else {\n" .
- "# ifdef ZEND_VM_IP_GLOBAL_REG\n" .
- $m[1]."\topline = orig_opline;\n" .
- "# endif\n".
- $m[1]."\treturn;\n".
- $m[1]."}\n".
- "#endif\n");
- if ($kind == ZEND_VM_KIND_HYBRID) {
- out($f,"#endif\n");
- }
- }
- break;
- case "EXTERNAL_EXECUTOR":
- if ($kind == ZEND_VM_KIND_CALL) {
- gen_executor_code($f, $spec, $kind, $m[1]);
- }
- break;
- case "INITIALIZER_NAME":
- out($f, $m[1].$initializer_name.$m[3]."\n");
- break;
- case "EXTERNAL_LABELS":
- // Emit code that initializes zend_opcode_handlers array
- $prolog = $m[1];
- if ($kind == ZEND_VM_KIND_GOTO) {
- // Labels are defined in the executor itself, so we call it
- // with execute_data NULL and it sets zend_opcode_handlers array
- out($f,$prolog."static const uint32_t specs[] = {\n");
- gen_specs($f, $prolog."\t", $specs);
- out($f,$prolog."};\n");
- out($f,$prolog."zend_spec_handlers = specs;\n");
- out($f,$prolog.$executor_name."_ex(NULL);\n");
- } else {
- 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");
- gen_specs($f, $prolog."\t", $specs);
- out($f,$prolog."};\n");
- if ($kind == ZEND_VM_KIND_HYBRID) {
- out($f,"#if (ZEND_VM_KIND == ZEND_VM_KIND_HYBRID)\n");
- out($f,$prolog."zend_opcode_handler_funcs = labels;\n");
- out($f,$prolog."zend_spec_handlers = specs;\n");
- out($f,$prolog.$executor_name."_ex(NULL);\n");
- out($f,"#else\n");
- }
- out($f,$prolog."zend_opcode_handlers = labels;\n");
- out($f,$prolog."zend_handlers_count = sizeof(labels) / sizeof(void*);\n");
- out($f,$prolog."zend_spec_handlers = specs;\n");
- if ($kind == ZEND_VM_KIND_HYBRID) {
- out($f,"#endif\n");
- }
- }
- break;
- default:
- die("ERROR: Unknown keyword ".$m[2]." in skeleton file.\n");
- }
- } else {
- // Copy the line as is
- out($f, $line);
- }
- }
+ out($f,"#endif\n\n");
+ }
+ break;
+ case "EXECUTOR_NAME":
+ out($f, $m[1].$executor_name.$m[3]."\n");
+ break;
+ case "HELPER_VARS":
+ if ($kind == ZEND_VM_KIND_SWITCH) {
+ out($f,$m[1]."const void *dispatch_handler;\n");
+ }
+ if ($kind != ZEND_VM_KIND_CALL && count($params)) {
+ if ($kind == ZEND_VM_KIND_HYBRID) {
+ out($f, "#if (ZEND_VM_KIND == ZEND_VM_KIND_HYBRID)\n");
+ }
+ // Emit local variables those are used for helpers' parameters
+ foreach ($params as $param => $x) {
+ out($f,$m[1].$param.";\n");
+ }
+ if ($kind == ZEND_VM_KIND_HYBRID) {
+ out($f, "#endif\n");
+ }
+ }
+ if ($kind != ZEND_VM_KIND_CALL && $kind != ZEND_VM_KIND_HYBRID) {
+ out($f,"#ifdef ZEND_VM_FP_GLOBAL_REG\n");
+ out($f,$m[1]."register zend_execute_data *execute_data __asm__(ZEND_VM_FP_GLOBAL_REG) = ex;\n");
+ out($f,"#else\n");
+ out($f,$m[1]."zend_execute_data *execute_data = ex;\n");
+ out($f,"#endif\n");
+ } else {
+ out($f,"#ifdef ZEND_VM_IP_GLOBAL_REG\n");
+ out($f,$m[1]."const zend_op *orig_opline = opline;\n");
+ out($f,"#endif\n");
+ out($f,"#ifdef ZEND_VM_FP_GLOBAL_REG\n");
+ out($f,$m[1]."zend_execute_data *orig_execute_data = execute_data;\n");
+ out($f,$m[1]."execute_data = ex;\n");
+ out($f,"#else\n");
+ out($f,$m[1]."zend_execute_data *execute_data = ex;\n");
+ out($f,"#endif\n");
+ }
+ break;
+ case "INTERNAL_LABELS":
+ if ($kind == ZEND_VM_KIND_GOTO || $kind == ZEND_VM_KIND_HYBRID) {
+ // Emit array of labels of opcode handlers and code for
+ // zend_opcode_handlers initialization
+ if ($kind == ZEND_VM_KIND_HYBRID) {
+ out($f,"#if (ZEND_VM_KIND == ZEND_VM_KIND_HYBRID)\n");
+ }
+ $prolog = $m[1];
+ out($f,$prolog."if (UNEXPECTED(execute_data == NULL)) {\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");
+ out($f,$prolog."\tzend_handlers_count = sizeof(labels) / sizeof(void*);\n");
+ if ($kind == ZEND_VM_KIND_HYBRID) {
+ out($f,$prolog."\tmemset(&hybrid_halt_op, 0, sizeof(hybrid_halt_op));\n");
+ out($f,$prolog."\thybrid_halt_op.handler = (void*)&&HYBRID_HALT_LABEL;\n");
+ out($f,$prolog."\tgoto HYBRID_HALT_LABEL;\n");
+ } else {
+ out($f,$prolog."\treturn;\n");
+ }
+ out($f,$prolog."}\n");
+ if ($kind == ZEND_VM_KIND_HYBRID) {
+ out($f,"#endif\n");
+ }
+ } else {
+ skip_blanks($f, $m[1], $m[3]);
+ }
+ break;
+ case "ZEND_VM_CONTINUE_LABEL":
+ if ($kind == ZEND_VM_KIND_CALL || $kind == ZEND_VM_KIND_HYBRID) {
+ // Only SWITCH dispatch method use it
+ out($f,"#if !defined(ZEND_VM_FP_GLOBAL_REG) || !defined(ZEND_VM_IP_GLOBAL_REG)\n");
+ out($f,$m[1]."\tint ret;".$m[3]."\n");
+ out($f,"#endif\n");
+ } else if ($kind == ZEND_VM_KIND_SWITCH) {
+ // Only SWITCH dispatch method use it
+ out($f,"zend_vm_continue:".$m[3]."\n");
+ } else {
+ skip_blanks($f, $m[1], $m[3]);
+ }
+ break;
+ case "ZEND_VM_DISPATCH":
+ // Emit code that dispatches to opcode handler
+ switch ($kind) {
+ case ZEND_VM_KIND_SWITCH:
+ out($f, $m[1]."dispatch_handler = OPLINE->handler;\nzend_vm_dispatch:\n".$m[1]."switch ((int)(uintptr_t)dispatch_handler)".$m[3]."\n");
+ break;
+ case ZEND_VM_KIND_GOTO:
+ out($f, $m[1]."goto *(void**)(OPLINE->handler);".$m[3]."\n");
+ break;
+ case ZEND_VM_KIND_HYBRID:
+ out($f,"#if (ZEND_VM_KIND == ZEND_VM_KIND_HYBRID)\n");
+ out($f, $m[1]."HYBRID_SWITCH()".$m[3]."\n");
+ out($f,"#else\n");
+ case ZEND_VM_KIND_CALL:
+ out($f,"#if defined(ZEND_VM_FP_GLOBAL_REG) && defined(ZEND_VM_IP_GLOBAL_REG)\n");
+ out($f, $m[1]."((opcode_handler_t)OPLINE->handler)(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);\n");
+ out($f, $m[1]."if (UNEXPECTED(!OPLINE))".$m[3]."\n");
+ out($f,"#else\n");
+ out($f, $m[1]."if (UNEXPECTED((ret = ((opcode_handler_t)OPLINE->handler)(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)) != 0))".$m[3]."\n");
+ out($f,"#endif\n");
+ if ($kind == ZEND_VM_KIND_HYBRID) {
+ out($f,"#endif\n");
+ }
+ break;
+ }
+ break;
+ case "INTERNAL_EXECUTOR":
+ if ($kind != ZEND_VM_KIND_CALL) {
+ // Emit executor code
+ if ($kind == ZEND_VM_KIND_HYBRID) {
+ out($f,"#if (ZEND_VM_KIND == ZEND_VM_KIND_HYBRID)\n");
+ }
+ gen_executor_code($f, $spec, $kind, $m[1], $switch_labels);
+ }
+ if ($kind == ZEND_VM_KIND_CALL || $kind == ZEND_VM_KIND_HYBRID) {
+ // Executor is defined as a set of functions
+ if ($kind == ZEND_VM_KIND_HYBRID) {
+ out($f,"#else\n");
+ }
+ out($f,
+ "#ifdef ZEND_VM_FP_GLOBAL_REG\n" .
+ $m[1]."execute_data = orig_execute_data;\n" .
+ "# ifdef ZEND_VM_IP_GLOBAL_REG\n" .
+ $m[1]."opline = orig_opline;\n" .
+ "# endif\n" .
+ $m[1]."return;\n" .
+ "#else\n" .
+ $m[1]."if (EXPECTED(ret > 0)) {\n" .
+ $m[1]."\texecute_data = EG(current_execute_data);\n".
+ $m[1]."\tZEND_VM_LOOP_INTERRUPT_CHECK();\n".
+ $m[1]."} else {\n" .
+ "# ifdef ZEND_VM_IP_GLOBAL_REG\n" .
+ $m[1]."\topline = orig_opline;\n" .
+ "# endif\n".
+ $m[1]."\treturn;\n".
+ $m[1]."}\n".
+ "#endif\n");
+ if ($kind == ZEND_VM_KIND_HYBRID) {
+ out($f,"#endif\n");
+ }
+ }
+ break;
+ case "EXTERNAL_EXECUTOR":
+ if ($kind == ZEND_VM_KIND_CALL) {
+ gen_executor_code($f, $spec, $kind, $m[1]);
+ }
+ break;
+ case "INITIALIZER_NAME":
+ out($f, $m[1].$initializer_name.$m[3]."\n");
+ break;
+ case "EXTERNAL_LABELS":
+ // Emit code that initializes zend_opcode_handlers array
+ $prolog = $m[1];
+ if ($kind == ZEND_VM_KIND_GOTO) {
+ // Labels are defined in the executor itself, so we call it
+ // with execute_data NULL and it sets zend_opcode_handlers array
+ out($f,$prolog."static const uint32_t specs[] = {\n");
+ gen_specs($f, $prolog."\t", $specs);
+ out($f,$prolog."};\n");
+ out($f,$prolog."zend_spec_handlers = specs;\n");
+ out($f,$prolog.$executor_name."_ex(NULL);\n");
+ } else {
+ 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");
+ gen_specs($f, $prolog."\t", $specs);
+ out($f,$prolog."};\n");
+ if ($kind == ZEND_VM_KIND_HYBRID) {
+ out($f,"#if (ZEND_VM_KIND == ZEND_VM_KIND_HYBRID)\n");
+ out($f,$prolog."zend_opcode_handler_funcs = labels;\n");
+ out($f,$prolog."zend_spec_handlers = specs;\n");
+ out($f,$prolog.$executor_name."_ex(NULL);\n");
+ out($f,"#else\n");
+ }
+ out($f,$prolog."zend_opcode_handlers = labels;\n");
+ out($f,$prolog."zend_handlers_count = sizeof(labels) / sizeof(void*);\n");
+ out($f,$prolog."zend_spec_handlers = specs;\n");
+ if ($kind == ZEND_VM_KIND_HYBRID) {
+ out($f,"#endif\n");
+ }
+ }
+ break;
+ default:
+ die("ERROR: Unknown keyword ".$m[2]." in skeleton file.\n");
+ }
+ } else {
+ // Copy the line as is
+ out($f, $line);
+ }
+ }
}
function parse_operand_spec($def, $lineno, $str, &$flags) {
- global $vm_op_decode;
-
- $flags = 0;
- $a = explode("|",$str);
- foreach($a as $val) {
- if (isset($vm_op_decode[$val])) {
- $flags |= $vm_op_decode[$val];
- } else {
- die("ERROR ($def:$lineno): Wrong operand type '$str'\n");
- }
- }
- if (!($flags & ZEND_VM_OP_SPEC)) {
- if (count($a) != 1) {
- die("ERROR ($def:$lineno): Wrong operand type '$str'\n");
- }
- $a = array("ANY");
- }
- return array_flip($a);
+ global $vm_op_decode;
+
+ $flags = 0;
+ $a = explode("|",$str);
+ foreach($a as $val) {
+ if (isset($vm_op_decode[$val])) {
+ $flags |= $vm_op_decode[$val];
+ } else {
+ die("ERROR ($def:$lineno): Wrong operand type '$str'\n");
+ }
+ }
+ if (!($flags & ZEND_VM_OP_SPEC)) {
+ if (count($a) != 1) {
+ die("ERROR ($def:$lineno): Wrong operand type '$str'\n");
+ }
+ $a = array("ANY");
+ }
+ return array_flip($a);
}
function parse_ext_spec($def, $lineno, $str) {
- global $vm_ext_decode;
-
- $flags = 0;
- $a = explode("|",$str);
- foreach($a as $val) {
- if (isset($vm_ext_decode[$val])) {
- $flags |= $vm_ext_decode[$val];
- } else {
- die("ERROR ($def:$lineno): Wrong extended_value type '$str'\n");
- }
- }
- return $flags;
+ global $vm_ext_decode;
+
+ $flags = 0;
+ $a = explode("|",$str);
+ foreach($a as $val) {
+ if (isset($vm_ext_decode[$val])) {
+ $flags |= $vm_ext_decode[$val];
+ } else {
+ die("ERROR ($def:$lineno): Wrong extended_value type '$str'\n");
+ }
+ }
+ return $flags;
}
function parse_spec_rules($def, $lineno, $str) {
- global $used_extra_spec;
-
- $ret = array();
- $a = explode(",", $str);
- foreach($a as $rule) {
- $n = strpos($rule, "=");
- if ($n !== false) {
- $id = trim(substr($rule, 0, $n));
- $val = trim(substr($rule, $n+1));
- switch ($id) {
- case "OP_DATA":
- $ret["OP_DATA"] = parse_operand_spec($def, $lineno, $val, $devnull);
- break;
- default:
- die("ERROR ($def:$lineno): Wrong specialization rules '$str'\n");
- }
- $used_extra_spec[$id] = 1;
- } else {
- switch ($rule) {
- case "RETVAL":
- $ret["RETVAL"] = array(0, 1);
- break;
- case "QUICK_ARG":
- $ret["QUICK_ARG"] = array(0, 1);
- break;
- case "SMART_BRANCH":
- $ret["SMART_BRANCH"] = array(0, 1, 2);
- break;
- case "DIM_OBJ":
- $ret["DIM_OBJ"] = array(0, 1, 2);
- break;
- case "NO_CONST_CONST":
- $ret["NO_CONST_CONST"] = array(1);
- break;
- 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");
- }
- $used_extra_spec[$rule] = 1;
- }
- }
- return $ret;
+ global $used_extra_spec;
+
+ $ret = array();
+ $a = explode(",", $str);
+ foreach($a as $rule) {
+ $n = strpos($rule, "=");
+ if ($n !== false) {
+ $id = trim(substr($rule, 0, $n));
+ $val = trim(substr($rule, $n+1));
+ switch ($id) {
+ case "OP_DATA":
+ $ret["OP_DATA"] = parse_operand_spec($def, $lineno, $val, $devnull);
+ break;
+ default:
+ die("ERROR ($def:$lineno): Wrong specialization rules '$str'\n");
+ }
+ $used_extra_spec[$id] = 1;
+ } else {
+ switch ($rule) {
+ case "RETVAL":
+ $ret["RETVAL"] = array(0, 1);
+ break;
+ case "QUICK_ARG":
+ $ret["QUICK_ARG"] = array(0, 1);
+ break;
+ case "SMART_BRANCH":
+ $ret["SMART_BRANCH"] = array(0, 1, 2);
+ break;
+ case "NO_CONST_CONST":
+ $ret["NO_CONST_CONST"] = array(1);
+ break;
+ 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");
+ }
+ $used_extra_spec[$rule] = 1;
+ }
+ }
+ return $ret;
}
function gen_vm($def, $skel) {
- global $definition_file, $skeleton_file, $executor_file,
- $op_types, $list, $opcodes, $helpers, $params, $opnames,
- $vm_op_flags, $used_extra_spec;
-
- // Load definition file
- $in = @file($def);
- if (!$in) {
- die("ERROR: Can not open definition file '$def'\n");
- }
- // We need absolute path to definition file to use it in #line directives
- $definition_file = realpath($def);
-
- // Load skeleton file
- $skl = @file($skel);
- if (!$skl) {
- die("ERROR: Can not open skeleton file '$skel'\n");
- }
- // We need absolute path to skeleton file to use it in #line directives
- $skeleton_file = realpath($skel);
-
- // Parse definition file into tree
- $lineno = 0;
- $handler = null;
- $helper = null;
- $max_opcode_len = 0;
- $max_opcode = 0;
- $extra_num = 256;
- $export = array();
- foreach ($in as $line) {
- ++$lineno;
- if (strpos($line,"ZEND_VM_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_|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]) ? $m[1] : false;
- $code = (int)$m[2];
- $op = $m[3];
- $len = strlen($op);
- $op1 = parse_operand_spec($def, $lineno, $m[4], $flags1);
- $op2 = parse_operand_spec($def, $lineno, $m[5], $flags2);
- $flags = $flags1 | ($flags2 << 8);
- if (!empty($m[7])) {
- $flags |= parse_ext_spec($def, $lineno, $m[7]);
- }
-
- if ($len > $max_opcode_len) {
- $max_opcode_len = $len;
- }
- if ($code > $max_opcode) {
- $max_opcode = $code;
- }
- if (isset($opcodes[$code])) {
- die("ERROR ($def:$lineno): Opcode with code '$code' is already defined.\n");
- }
- if (isset($opnames[$op])) {
- die("ERROR ($def:$lineno): Opcode with name '$op' is already defined.\n");
- }
- $opcodes[$code] = array("op"=>$op,"op1"=>$op1,"op2"=>$op2,"code"=>"","flags"=>$flags,"hot"=>$hot);
- if (isset($m[9])) {
- $opcodes[$code]["spec"] = parse_spec_rules($def, $lineno, $m[9]);
- if (isset($opcodes[$code]["spec"]["NO_CONST_CONST"])) {
- $opcodes[$code]["flags"] |= $vm_op_flags["ZEND_VM_NO_CONST_CONST"];
- }
- if (isset($opcodes[$code]["spec"]["COMMUTATIVE"])) {
- $opcodes[$code]["flags"] |= $vm_op_flags["ZEND_VM_COMMUTATIVE"];
- }
- }
- $opnames[$op] = $code;
- $handler = $code;
- $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_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_|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]) ? $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");
- }
- $orig_code = $opnames[$orig_op];
- $condition = $m[3];
- $code = $extra_num++;
- $op = $m[4];
- $op1 = parse_operand_spec($def, $lineno, $m[5], $flags1);
- $op2 = parse_operand_spec($def, $lineno, $m[6], $flags2);
- $flags = $flags1 | ($flags2 << 8);
- if (!empty($m[8])) {
- $flags |= parse_ext_spec($def, $lineno, $m[8]);
- }
-
- if (isset($opcodes[$code])) {
- die("ERROR ($def:$lineno): Opcode with name '$code' is already defined.\n");
- }
- $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,"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"])) {
- $opcodes[$code]["flags"] |= $vm_op_flags["ZEND_VM_NO_CONST_CONST"];
- }
- if (isset($opcodes[$code]["spec"]["COMMUTATIVE"])) {
- $opcodes[$code]["flags"] |= $vm_op_flags["ZEND_VM_COMMUTATIVE"];
- }
- }
- $opnames[$op] = $code;
- $handler = $code;
- $helper = null;
- $list[$lineno] = array("handler"=>$handler);
- } 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|_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]) && $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);
- $param = isset($m[6]) ? $m[6] : null;
- if (isset($helpers[$helper])) {
- die("ERROR ($def:$lineno): Helper with name '$helper' is already defined.\n");
- }
-
- // Store parameters
- foreach (explode(",", $param) as $p) {
- $p = trim($p);
- if ($p !== "") {
- $params[$p] = 1;
- }
- }
-
- $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]);
- }
-
- $handler = null;
- $list[$lineno] = array("helper"=>$helper);
- } else if (strpos($line,"ZEND_VM_EXPORT_HANDLER(") === 0) {
- if (preg_match(
- "/^ZEND_VM_EXPORT_HANDLER\(\s*([A-Za-z_]+)\s*,\s*([A-Z_]+)\s*\)/",
- $line,
- $m) == 0) {
- die("ERROR ($def:$lineno): Invalid ZEND_VM_EXPORT_HANDLER definition.\n");
- }
- if (!isset($opnames[$m[2]])) {
- die("ERROR ($def:$lineno): opcode '{$m[2]}' is not defined.\n");
- }
- $export[] = array("handler",$m[1],$m[2]);
- } else if (strpos($line,"ZEND_VM_EXPORT_HELPER(") === 0) {
- if (preg_match(
- "/^ZEND_VM_EXPORT_HELPER\(\s*([A-Za-z_]+)\s*,\s*([A-Za-z_]+)\s*\)/",
- $line,
- $m) == 0) {
- die("ERROR ($def:$lineno): Invalid ZEND_VM_EXPORT_HELPER definition.\n");
- }
- if (!isset($helpers[$m[2]])) {
- die("ERROR ($def:$lineno): helper '{$m[2]}' is not defined.\n");
- }
- $export[] = array("helper",$m[1],$m[2]);
- } else if (strpos($line,"ZEND_VM_DEFINE_OP(") === 0) {
- if (preg_match(
- "/^ZEND_VM_DEFINE_OP\(\s*([0-9]+)\s*,\s*([A-Z_]+)\s*\);/",
- $line,
- $m) == 0) {
- die("ERROR ($def:$lineno): Invalid ZEND_VM_DEFINE_OP definition.\n");
- }
- $code = (int)$m[1];
- $op = $m[2];
- $len = strlen($op);
-
- if ($len > $max_opcode_len) {
- $max_opcode_len = $len;
- }
- if ($code > $max_opcode) {
- $max_opcode = $code;
- }
- if (isset($opcodes[$code])) {
- die("ERROR ($def:$lineno): Opcode with code '$code' is already defined.\n");
- }
- if (isset($opnames[$op])) {
- die("ERROR ($def:$lineno): Opcode with name '$op' is already defined.\n");
- }
- $opcodes[$code] = array("op"=>$op,"code"=>"");
- $opnames[$op] = $code;
- } else if ($handler !== null) {
- // Add line of code to current opcode handler
- $opcodes[$handler]["code"] .= $line;
- } else if ($helper !== null) {
- // Add line of code to current helper
- $helpers[$helper]["code"] .= $line;
- }
- }
-
- ksort($opcodes);
-
- // Search for opcode handlers those are used by other opcode handlers
- foreach ($opcodes as $dsc) {
- 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;
- }
- }
- }
-
- // Generate opcode #defines (zend_vm_opcodes.h)
- $code_len = strlen((string)$max_opcode);
- $f = fopen(__DIR__ . "/zend_vm_opcodes.h", "w+") or die("ERROR: Cannot create zend_vm_opcodes.h\n");
-
- // Insert header
- out($f, HEADER_TEXT);
- fputs($f, "#ifndef ZEND_VM_OPCODES_H\n#define ZEND_VM_OPCODES_H\n\n");
- fputs($f, "#define ZEND_VM_SPEC\t\t" . ZEND_VM_SPEC . "\n");
- fputs($f, "#define ZEND_VM_LINES\t\t" . ZEND_VM_LINES . "\n");
- fputs($f, "#define ZEND_VM_KIND_CALL\t" . ZEND_VM_KIND_CALL . "\n");
- fputs($f, "#define ZEND_VM_KIND_SWITCH\t" . ZEND_VM_KIND_SWITCH . "\n");
- fputs($f, "#define ZEND_VM_KIND_GOTO\t" . ZEND_VM_KIND_GOTO . "\n");
- fputs($f, "#define ZEND_VM_KIND_HYBRID\t" . ZEND_VM_KIND_HYBRID . "\n");
- if ($GLOBALS["vm_kind_name"][ZEND_VM_KIND] === "ZEND_VM_KIND_HYBRID") {
- fputs($f, "/* HYBRID requires support for computed GOTO and global register variables*/\n");
- fputs($f, "#if (defined(__GNUC__) && defined(HAVE_GCC_GLOBAL_REGS))\n");
- fputs($f, "# define ZEND_VM_KIND\t\tZEND_VM_KIND_HYBRID\n");
- fputs($f, "#else\n");
- fputs($f, "# define ZEND_VM_KIND\t\tZEND_VM_KIND_CALL\n");
- fputs($f, "#endif\n");
- } else {
- fputs($f, "#define ZEND_VM_KIND\t\t" . $GLOBALS["vm_kind_name"][ZEND_VM_KIND] . "\n");
- }
- fputs($f, "\n");
- foreach($vm_op_flags as $name => $val) {
- fprintf($f, "#define %-24s 0x%08x\n", $name, $val);
- }
- fputs($f, "#define ZEND_VM_OP1_FLAGS(flags) (flags & 0xff)\n");
- 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_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) {
- $code = str_pad((string)$code,$code_len," ",STR_PAD_LEFT);
- $op = str_pad($dsc["op"],$max_opcode_len);
- if ($code <= $max_opcode) {
- fputs($f,"#define $op $code\n");
- }
- }
-
- $code = str_pad((string)$max_opcode,$code_len," ",STR_PAD_LEFT);
- $op = str_pad("ZEND_VM_LAST_OPCODE",$max_opcode_len);
- fputs($f,"\n#define $op $code\n");
-
- fputs($f, "\n#endif\n");
- fclose($f);
- echo "zend_vm_opcodes.h generated successfully.\n";
-
- // zend_vm_opcodes.c
- $f = fopen(__DIR__ . "/zend_vm_opcodes.c", "w+") or die("ERROR: Cannot create zend_vm_opcodes.c\n");
-
- // Insert header
- out($f, HEADER_TEXT);
- fputs($f,"#include <stdio.h>\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++) {
- fputs($f,"\t".(isset($opcodes[$i]["op"])?'"'.$opcodes[$i]["op"].'"':"NULL").",\n");
- }
- fputs($f, "};\n\n");
-
- fputs($f,"static uint32_t zend_vm_opcodes_flags[".($max_opcode + 1)."] = {\n");
- for ($i = 0; $i <= $max_opcode; $i++) {
- fprintf($f, "\t0x%08x,\n", isset($opcodes[$i]["flags"]) ? $opcodes[$i]["flags"] : 0);
- }
- fputs($f, "};\n\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_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");
-
- fclose($f);
- echo "zend_vm_opcodes.c generated successfully.\n";
-
- // Generate zend_vm_execute.h
- $f = fopen(__DIR__ . "/zend_vm_execute.h", "w+") or die("ERROR: Cannot create zend_vm_execute.h\n");
- $executor_file = realpath(__DIR__ . "/zend_vm_execute.h");
-
- // Insert header
- out($f, HEADER_TEXT);
-
- out($f, "#ifdef ZEND_WIN32\n");
- // Suppress free_op1 warnings on Windows
- out($f, "# pragma warning(disable : 4101)\n");
- if (ZEND_VM_SPEC) {
- // Suppress (<non-zero constant> || <expression>) warnings on windows
- out($f, "# pragma warning(once : 6235)\n");
- // Suppress (<zero> && <expression>) warnings on windows
- out($f, "# pragma warning(once : 6237)\n");
- // Suppress (<non-zero constant> && <expression>) warnings on windows
- out($f, "# pragma warning(once : 6239)\n");
- // Suppress (<expression> && <non-zero constant>) warnings on windows
- out($f, "# pragma warning(once : 6240)\n");
- // Suppress (<non-zero constant> || <non-zero constant>) warnings on windows
- out($f, "# pragma warning(once : 6285)\n");
- // Suppress (<non-zero constant> || <expression>) warnings on windows
- out($f, "# pragma warning(once : 6286)\n");
- // Suppress constant with constant comparison warnings on windows
- out($f, "# pragma warning(once : 6326)\n");
- }
- out($f, "#endif\n");
-
- // Support for ZEND_USER_OPCODE
- out($f, "static user_opcode_handler_t zend_user_opcode_handlers[256] = {\n");
- for ($i = 0; $i < 255; ++$i) {
- out($f, "\t(user_opcode_handler_t)NULL,\n");
- }
- out($f, "\t(user_opcode_handler_t)NULL\n};\n\n");
-
- out($f, "static zend_uchar zend_user_opcodes[256] = {");
- for ($i = 0; $i < 255; ++$i) {
- if ($i % 16 == 1) out($f, "\n\t");
- out($f, "$i,");
- }
- out($f, "255\n};\n\n");
-
- // Generate specialized executor
- 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_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 = 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");
- out($f, "\t\t_VAR_CODE, /* 4 = IS_VAR */\n");
- 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_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"]) ||
- 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) {
- out($f, "\treturn zend_vm_get_opcode_handler_ex(opcode, op);\n");
- } else {
- out($f, "\treturn zend_vm_get_opcode_handler_ex(zend_spec_handlers[opcode], op);\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
- 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");
- out($f, "{\n");
- out($f, "\tuint32_t spec = zend_spec_handlers[opcode];\n");
- if (!ZEND_VM_SPEC) {
- 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 = 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");
- out($f, "\t\t_VAR_CODE, /* 4 = IS_VAR */\n");
- 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_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"]) ||
- 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");
- out($f, "#endif\n\n");
- }
-
- // Generate zend_vm_get_opcode_handler() function
- out($f, "ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler(zend_op* op)\n");
- out($f, "{\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_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) {
- out($f, "\top->handler = zend_vm_get_opcode_handler_ex(opcode, op);\n");
- } else {
- out($f, "\tuint32_t spec = zend_spec_handlers[opcode];\n");
- if (isset($used_extra_spec["TYPE"])) {
- out($f, "\tswitch (opcode) {\n");
- foreach($opcodes as $code => $dsc) {
- 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);
- if ($first) {
- out($f, "\t\t\tif $condition {\n");
- $first = false;
- } else {
- out($f, "\t\t\t} else if $condition {\n");
- }
- $spec_dsc = $opcodes[$code];
- if (isset($spec_dsc["spec"]["NO_CONST_CONST"])) {
- out($f, "\t\t\t\tif (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {\n");
- out($f, "\t\t\t\t\tbreak;\n");
- out($f, "\t\t\t\t}\n");
- }
- out($f, "\t\t\t\tspec = ${spec_dsc['spec_code']};\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");
- }
- }
- if (!$first) {
- out($f, "\t\t\t}\n");
- }
- 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");
- }
- out($f, "\top->handler = zend_vm_get_opcode_handler_ex(spec, op);\n");
- }
- out($f, "}\n\n");
-
- // 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_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");
- out($f, "\topcode_handler_t handler;\n");
- out($f,"#endif\n");
- }
- out($f, "\tint ret;\n");
- out($f, "#ifdef ZEND_VM_IP_GLOBAL_REG\n");
- out($f, "\tconst zend_op *orig_opline = opline;\n");
- out($f, "#endif\n");
- out($f, "#ifdef ZEND_VM_FP_GLOBAL_REG\n");
- out($f, "\tzend_execute_data *orig_execute_data = execute_data;\n");
- out($f, "\texecute_data = ex;\n");
- out($f, "#else\n");
- out($f, "\tzend_execute_data *execute_data = ex;\n");
- out($f, "#endif\n");
- out($f, "\n");
- out($f, "\tLOAD_OPLINE();\n");
- out($f,"#if defined(ZEND_VM_FP_GLOBAL_REG) && defined(ZEND_VM_IP_GLOBAL_REG)\n");
- if (ZEND_VM_KIND == ZEND_VM_KIND_HYBRID) {
- out($f,"#if (ZEND_VM_KIND == ZEND_VM_KIND_HYBRID)\n");
- out($f, "\thandler = (opcode_handler_t)zend_vm_get_opcode_handler_func(zend_user_opcodes[opline->opcode], opline);\n");
- out($f, "\thandler(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);\n");
- out($f, "\tif (EXPECTED(opline != &hybrid_halt_op)) {\n");
- out($f,"#else\n");
- }
- out($f, "\t((opcode_handler_t)OPLINE->handler)(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);\n");
- if (ZEND_VM_KIND == ZEND_VM_KIND_HYBRID) {
- out($f, "\tif (EXPECTED(opline)) {\n");
- out($f,"#endif\n");
- } else {
- out($f, "\tif (EXPECTED(opline)) {\n");
- }
- out($f, "\t\tret = execute_data != ex ? (int)(execute_data->prev_execute_data != ex) + 1 : 0;\n");
- out($f, "\t\tSAVE_OPLINE();\n");
- out($f, "\t} else {\n");
- out($f, "\t\tret = -1;\n");
- out($f, "\t}\n");
- out($f, "#else\n");
- out($f, "\tret = ((opcode_handler_t)OPLINE->handler)(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);\n");
- out($f, "\tSAVE_OPLINE();\n");
- out($f, "#endif\n");
- out($f, "#ifdef ZEND_VM_FP_GLOBAL_REG\n");
- out($f, "\texecute_data = orig_execute_data;\n");
- out($f, "#endif\n");
- out($f, "#ifdef ZEND_VM_IP_GLOBAL_REG\n");
- out($f, "\topline = orig_opline;\n");
- out($f, "#endif\n");
- out($f, "\treturn ret;\n");
- out($f, "}\n\n");
- } else {
- 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");
- out($f, "}\n\n");
- }
-
- // Export handlers and helpers
- if (count($export) > 0 &&
- ZEND_VM_KIND != ZEND_VM_KIND_CALL) {
- out($f,"#undef OPLINE\n");
- out($f,"#undef DCL_OPLINE\n");
- out($f,"#undef USE_OPLINE\n");
- out($f,"#undef LOAD_OPLINE\n");
- out($f,"#undef LOAD_NEXT_OPLINE\n");
- out($f,"#undef SAVE_OPLINE\n");
- out($f,"#define OPLINE EX(opline)\n");
- out($f,"#define DCL_OPLINE\n");
- out($f,"#define USE_OPLINE const zend_op *opline = EX(opline);\n");
- out($f,"#define LOAD_OPLINE()\n");
- out($f,"#define LOAD_NEXT_OPLINE() ZEND_VM_INC_OPCODE()\n");
- out($f,"#define SAVE_OPLINE()\n");
- out($f,"#undef HANDLE_EXCEPTION\n");
- out($f,"#undef HANDLE_EXCEPTION_LEAVE\n");
- out($f,"#define HANDLE_EXCEPTION() LOAD_OPLINE(); ZEND_VM_CONTINUE()\n");
- out($f,"#define HANDLE_EXCEPTION_LEAVE() LOAD_OPLINE(); ZEND_VM_LEAVE()\n");
- out($f,"#undef ZEND_VM_CONTINUE\n");
- 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");
- out($f,"#define ZEND_VM_DISPATCH(opcode, opline) return zend_vm_get_opcode_handler(opcode, opline)(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);\n\n");
- out($f,"\n");
- }
- foreach ($export as $dsk) {
- list($kind, $func, $name) = $dsk;
- out($f, "ZEND_API int $func(");
- if ($kind == "handler") {
- out($f, "ZEND_OPCODE_HANDLER_ARGS)\n");
- $code = $opcodes[$opnames[$name]]['code'];
- } else {
- $h = $helpers[$name];
- if ($h['param'] == null) {
- out($f, "ZEND_OPCODE_HANDLER_ARGS)\n");
- } else {
- out($f, $h['param']. " ZEND_OPCODE_HANDLER_ARGS_DC)\n");
- }
- $code = $h['code'];
- }
- $done = 0;
- if (ZEND_VM_KIND == ZEND_VM_KIND_CALL) {
- if ($kind == "handler") {
- $op = $opcodes[$opnames[$name]];
- if (isset($op['op1']["ANY"]) && isset($op['op2']["ANY"])) {
- out($f, "{\n\treturn ".$name.(ZEND_VM_SPEC?"_SPEC":"")."_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);\n}\n\n");
- $done = 1;
- }
- } else if ($helpers[$name]["param"] == null) {
- $h = $helpers[$name];
- if (isset($h['op1']["ANY"]) && isset($h['op2']["ANY"])) {
- out($f, "{\n\treturn ".$name.(ZEND_VM_SPEC?"_SPEC":"")."(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);\n}\n\n");
- $done = 1;
- }
- }
- }
- if (!$done) {
- gen_code($f, 0, ZEND_VM_KIND_CALL, 1, $code, 'ANY', 'ANY', $name);
- }
- }
-
- fclose($f);
- echo "zend_vm_execute.h generated successfully.\n";
+ global $definition_file, $skeleton_file, $executor_file,
+ $op_types, $list, $opcodes, $helpers, $params, $opnames,
+ $vm_op_flags, $used_extra_spec;
+
+ // Load definition file
+ $in = @file($def);
+ if (!$in) {
+ die("ERROR: Can not open definition file '$def'\n");
+ }
+ // We need absolute path to definition file to use it in #line directives
+ $definition_file = realpath($def);
+
+ // Load skeleton file
+ $skl = @file($skel);
+ if (!$skl) {
+ die("ERROR: Can not open skeleton file '$skel'\n");
+ }
+ // We need absolute path to skeleton file to use it in #line directives
+ $skeleton_file = realpath($skel);
+
+ // Parse definition file into tree
+ $lineno = 0;
+ $handler = null;
+ $helper = null;
+ $max_opcode_len = 0;
+ $max_opcode = 0;
+ $extra_num = 256;
+ $export = array();
+ foreach ($in as $line) {
+ ++$lineno;
+ if (strpos($line,"ZEND_VM_HANDLER(") === 0 ||
+ strpos($line,"ZEND_VM_INLINE_HANDLER(") === 0 ||
+ strpos($line,"ZEND_VM_HOT_HANDLER(") === 0 ||
+ strpos($line,"ZEND_VM_HOT_NOCONST_HANDLER(") === 0 ||
+ strpos($line,"ZEND_VM_HOT_NOCONSTCONST_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_|INLINE_|HOT_OBJ_|HOT_SEND_|HOT_NOCONST_|HOT_NOCONSTCONST_|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]) ? $m[1] : false;
+ $code = (int)$m[2];
+ $op = $m[3];
+ $len = strlen($op);
+ $op1 = parse_operand_spec($def, $lineno, $m[4], $flags1);
+ $op2 = parse_operand_spec($def, $lineno, $m[5], $flags2);
+ $flags = $flags1 | ($flags2 << 8);
+ if (!empty($m[7])) {
+ $flags |= parse_ext_spec($def, $lineno, $m[7]);
+ }
+
+ if ($len > $max_opcode_len) {
+ $max_opcode_len = $len;
+ }
+ if ($code > $max_opcode) {
+ $max_opcode = $code;
+ }
+ if (isset($opcodes[$code])) {
+ die("ERROR ($def:$lineno): Opcode with code '$code' is already defined.\n");
+ }
+ if (isset($opnames[$op])) {
+ die("ERROR ($def:$lineno): Opcode with name '$op' is already defined.\n");
+ }
+ $opcodes[$code] = array("op"=>$op,"op1"=>$op1,"op2"=>$op2,"code"=>"","flags"=>$flags,"hot"=>$hot);
+ if (isset($m[9])) {
+ $opcodes[$code]["spec"] = parse_spec_rules($def, $lineno, $m[9]);
+ if (isset($opcodes[$code]["spec"]["NO_CONST_CONST"])) {
+ $opcodes[$code]["flags"] |= $vm_op_flags["ZEND_VM_NO_CONST_CONST"];
+ }
+ if (isset($opcodes[$code]["spec"]["COMMUTATIVE"])) {
+ $opcodes[$code]["flags"] |= $vm_op_flags["ZEND_VM_COMMUTATIVE"];
+ }
+ }
+ $opnames[$op] = $code;
+ $handler = $code;
+ $helper = null;
+ $list[$lineno] = array("handler"=>$handler);
+ } else if (strpos($line,"ZEND_VM_TYPE_SPEC_HANDLER(") === 0 ||
+ strpos($line,"ZEND_VM_INLINE_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_NOCONSTCONST_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_|INLINE_|HOT_OBJ_|HOT_SEND_|HOT_NOCONST_|HOT_NOCONSTCONST_)?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]) ? $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");
+ }
+ $orig_code = $opnames[$orig_op];
+ $condition = $m[3];
+ $code = $extra_num++;
+ $op = $m[4];
+ $op1 = parse_operand_spec($def, $lineno, $m[5], $flags1);
+ $op2 = parse_operand_spec($def, $lineno, $m[6], $flags2);
+ $flags = $flags1 | ($flags2 << 8);
+ if (!empty($m[8])) {
+ $flags |= parse_ext_spec($def, $lineno, $m[8]);
+ }
+
+ if (isset($opcodes[$code])) {
+ die("ERROR ($def:$lineno): Opcode with name '$code' is already defined.\n");
+ }
+ $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,"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"])) {
+ $opcodes[$code]["flags"] |= $vm_op_flags["ZEND_VM_NO_CONST_CONST"];
+ }
+ if (isset($opcodes[$code]["spec"]["COMMUTATIVE"])) {
+ $opcodes[$code]["flags"] |= $vm_op_flags["ZEND_VM_COMMUTATIVE"];
+ }
+ }
+ $opnames[$op] = $code;
+ $handler = $code;
+ $helper = null;
+ $list[$lineno] = array("handler"=>$handler);
+ } 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|_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]) && $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);
+ $param = isset($m[6]) ? $m[6] : null;
+ if (isset($helpers[$helper])) {
+ die("ERROR ($def:$lineno): Helper with name '$helper' is already defined.\n");
+ }
+
+ // Store parameters
+ if (ZEND_VM_KIND == ZEND_VM_KIND_GOTO
+ || ZEND_VM_KIND == ZEND_VM_KIND_SWITCH
+ || (ZEND_VM_KIND == ZEND_VM_KIND_HYBRID && $hot)) {
+ foreach (explode(",", $param) as $p) {
+ $p = trim($p);
+ if ($p !== "") {
+ $params[$p] = 1;
+ }
+ }
+ }
+
+ $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]);
+ }
+
+ $handler = null;
+ $list[$lineno] = array("helper"=>$helper);
+ } else if (strpos($line,"ZEND_VM_EXPORT_HANDLER(") === 0) {
+ if (preg_match(
+ "/^ZEND_VM_EXPORT_HANDLER\(\s*([A-Za-z_]+)\s*,\s*([A-Z_]+)\s*\)/",
+ $line,
+ $m) == 0) {
+ die("ERROR ($def:$lineno): Invalid ZEND_VM_EXPORT_HANDLER definition.\n");
+ }
+ if (!isset($opnames[$m[2]])) {
+ die("ERROR ($def:$lineno): opcode '{$m[2]}' is not defined.\n");
+ }
+ $export[] = array("handler",$m[1],$m[2]);
+ } else if (strpos($line,"ZEND_VM_EXPORT_HELPER(") === 0) {
+ if (preg_match(
+ "/^ZEND_VM_EXPORT_HELPER\(\s*([A-Za-z_]+)\s*,\s*([A-Za-z_]+)\s*\)/",
+ $line,
+ $m) == 0) {
+ die("ERROR ($def:$lineno): Invalid ZEND_VM_EXPORT_HELPER definition.\n");
+ }
+ if (!isset($helpers[$m[2]])) {
+ die("ERROR ($def:$lineno): helper '{$m[2]}' is not defined.\n");
+ }
+ $export[] = array("helper",$m[1],$m[2]);
+ } else if (strpos($line,"ZEND_VM_DEFINE_OP(") === 0) {
+ if (preg_match(
+ "/^ZEND_VM_DEFINE_OP\(\s*([0-9]+)\s*,\s*([A-Z_]+)\s*\);/",
+ $line,
+ $m) == 0) {
+ die("ERROR ($def:$lineno): Invalid ZEND_VM_DEFINE_OP definition.\n");
+ }
+ $code = (int)$m[1];
+ $op = $m[2];
+ $len = strlen($op);
+
+ if ($len > $max_opcode_len) {
+ $max_opcode_len = $len;
+ }
+ if ($code > $max_opcode) {
+ $max_opcode = $code;
+ }
+ if (isset($opcodes[$code])) {
+ die("ERROR ($def:$lineno): Opcode with code '$code' is already defined.\n");
+ }
+ if (isset($opnames[$op])) {
+ die("ERROR ($def:$lineno): Opcode with name '$op' is already defined.\n");
+ }
+ $opcodes[$code] = array("op"=>$op,"code"=>"");
+ $opnames[$op] = $code;
+ } else if ($handler !== null) {
+ // Add line of code to current opcode handler
+ $opcodes[$handler]["code"] .= $line;
+ } else if ($helper !== null) {
+ // Add line of code to current helper
+ $helpers[$helper]["code"] .= $line;
+ }
+ }
+
+ ksort($opcodes);
+
+ // Search for opcode handlers those are used by other opcode handlers
+ foreach ($opcodes as $dsc) {
+ if (preg_match("/^\s*{\s*ZEND_VM_DISPATCH_TO_HANDLER\(\s*([A-Z_]*)\s*\)\s*;\s*}\s*/", $dsc["code"], $m)) {
+ $op = $m[1];
+ if (!isset($opnames[$op])) {
+ die("ERROR ($def:$lineno): Opcode with name '$op' is not defined.\n");
+ }
+ $opcodes[$opnames[$dsc['op']]]['alias'] = $op;
+ if (!ZEND_VM_SPEC && ZEND_VM_KIND == ZEND_VM_KIND_SWITCH) {
+ $code = $opnames[$op];
+ $opcodes[$code]['use'] = 1;
+ }
+ } else 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;
+ }
+ }
+ }
+
+ // Generate opcode #defines (zend_vm_opcodes.h)
+ $code_len = strlen((string)$max_opcode);
+ $f = fopen(__DIR__ . "/zend_vm_opcodes.h", "w+") or die("ERROR: Cannot create zend_vm_opcodes.h\n");
+
+ // Insert header
+ out($f, HEADER_TEXT);
+ fputs($f, "#ifndef ZEND_VM_OPCODES_H\n#define ZEND_VM_OPCODES_H\n\n");
+ fputs($f, "#define ZEND_VM_SPEC\t\t" . ZEND_VM_SPEC . "\n");
+ fputs($f, "#define ZEND_VM_LINES\t\t" . ZEND_VM_LINES . "\n");
+ fputs($f, "#define ZEND_VM_KIND_CALL\t" . ZEND_VM_KIND_CALL . "\n");
+ fputs($f, "#define ZEND_VM_KIND_SWITCH\t" . ZEND_VM_KIND_SWITCH . "\n");
+ fputs($f, "#define ZEND_VM_KIND_GOTO\t" . ZEND_VM_KIND_GOTO . "\n");
+ fputs($f, "#define ZEND_VM_KIND_HYBRID\t" . ZEND_VM_KIND_HYBRID . "\n");
+ if ($GLOBALS["vm_kind_name"][ZEND_VM_KIND] === "ZEND_VM_KIND_HYBRID") {
+ fputs($f, "/* HYBRID requires support for computed GOTO and global register variables*/\n");
+ fputs($f, "#if (defined(__GNUC__) && defined(HAVE_GCC_GLOBAL_REGS))\n");
+ fputs($f, "# define ZEND_VM_KIND\t\tZEND_VM_KIND_HYBRID\n");
+ fputs($f, "#else\n");
+ fputs($f, "# define ZEND_VM_KIND\t\tZEND_VM_KIND_CALL\n");
+ fputs($f, "#endif\n");
+ } else {
+ fputs($f, "#define ZEND_VM_KIND\t\t" . $GLOBALS["vm_kind_name"][ZEND_VM_KIND] . "\n");
+ }
+ fputs($f, "\n");
+ foreach($vm_op_flags as $name => $val) {
+ fprintf($f, "#define %-24s 0x%08x\n", $name, $val);
+ }
+ fputs($f, "#define ZEND_VM_OP1_FLAGS(flags) (flags & 0xff)\n");
+ 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_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) {
+ $code = str_pad((string)$code,$code_len," ",STR_PAD_LEFT);
+ $op = str_pad($dsc["op"],$max_opcode_len);
+ if ($code <= $max_opcode) {
+ fputs($f,"#define $op $code\n");
+ }
+ }
+
+ $code = str_pad((string)$max_opcode,$code_len," ",STR_PAD_LEFT);
+ $op = str_pad("ZEND_VM_LAST_OPCODE",$max_opcode_len);
+ fputs($f,"\n#define $op $code\n");
+
+ fputs($f, "\n#endif\n");
+ fclose($f);
+ echo "zend_vm_opcodes.h generated successfully.\n";
+
+ // zend_vm_opcodes.c
+ $f = fopen(__DIR__ . "/zend_vm_opcodes.c", "w+") or die("ERROR: Cannot create zend_vm_opcodes.c\n");
+
+ // Insert header
+ out($f, HEADER_TEXT);
+ fputs($f,"#include <stdio.h>\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++) {
+ fputs($f,"\t".(isset($opcodes[$i]["op"])?'"'.$opcodes[$i]["op"].'"':"NULL").",\n");
+ }
+ fputs($f, "};\n\n");
+
+ fputs($f,"static uint32_t zend_vm_opcodes_flags[".($max_opcode + 1)."] = {\n");
+ for ($i = 0; $i <= $max_opcode; $i++) {
+ fprintf($f, "\t0x%08x,\n", isset($opcodes[$i]["flags"]) ? $opcodes[$i]["flags"] : 0);
+ }
+ fputs($f, "};\n\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_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");
+
+ fclose($f);
+ echo "zend_vm_opcodes.c generated successfully.\n";
+
+ // Generate zend_vm_execute.h
+ $f = fopen(__DIR__ . "/zend_vm_execute.h", "w+") or die("ERROR: Cannot create zend_vm_execute.h\n");
+ $executor_file = realpath(__DIR__ . "/zend_vm_execute.h");
+
+ // Insert header
+ out($f, HEADER_TEXT);
+
+ out($f, "#ifdef ZEND_WIN32\n");
+ // Suppress free_op1 warnings on Windows
+ out($f, "# pragma warning(disable : 4101)\n");
+ if (ZEND_VM_SPEC) {
+ // Suppress (<non-zero constant> || <expression>) warnings on windows
+ out($f, "# pragma warning(once : 6235)\n");
+ // Suppress (<zero> && <expression>) warnings on windows
+ out($f, "# pragma warning(once : 6237)\n");
+ // Suppress (<non-zero constant> && <expression>) warnings on windows
+ out($f, "# pragma warning(once : 6239)\n");
+ // Suppress (<expression> && <non-zero constant>) warnings on windows
+ out($f, "# pragma warning(once : 6240)\n");
+ // Suppress (<non-zero constant> || <non-zero constant>) warnings on windows
+ out($f, "# pragma warning(once : 6285)\n");
+ // Suppress (<non-zero constant> || <expression>) warnings on windows
+ out($f, "# pragma warning(once : 6286)\n");
+ // Suppress constant with constant comparison warnings on windows
+ out($f, "# pragma warning(once : 6326)\n");
+ }
+ out($f, "#endif\n");
+
+ // Support for ZEND_USER_OPCODE
+ out($f, "static user_opcode_handler_t zend_user_opcode_handlers[256] = {\n");
+ for ($i = 0; $i < 255; ++$i) {
+ out($f, "\t(user_opcode_handler_t)NULL,\n");
+ }
+ out($f, "\t(user_opcode_handler_t)NULL\n};\n\n");
+
+ out($f, "static zend_uchar zend_user_opcodes[256] = {");
+ for ($i = 0; $i < 255; ++$i) {
+ if ($i % 16 == 1) out($f, "\n\t");
+ out($f, "$i,");
+ }
+ out($f, "255\n};\n\n");
+
+ // Generate specialized executor
+ 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_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 = 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");
+ out($f, "\t\t_VAR_CODE, /* 4 = IS_VAR */\n");
+ 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_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"]) ||
+ isset($used_extra_spec["RETVAL"]) ||
+ isset($used_extra_spec["QUICK_ARG"]) ||
+ isset($used_extra_spec["SMART_BRANCH"]) ||
+ isset($used_extra_spec["ISSET"])) {
+
+ $else = "";
+ out($f, "\tif (spec & SPEC_EXTRA_MASK) {\n");
+
+ if (isset($used_extra_spec["RETVAL"])) {
+ out($f, "\t\t{$else}if (spec & SPEC_RULE_RETVAL) {\n");
+ out($f, "\t\t\toffset = 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) {\n");
+ out($f, "\t\t\toffset = offset * 2 + (op->op2.num <= MAX_ARG_FLAG_NUM);\n");
+ $else = "} else ";
+ }
+ if (isset($used_extra_spec["OP_DATA"])) {
+ out($f, "\t\t{$else}if (spec & SPEC_RULE_OP_DATA) {\n");
+ out($f, "\t\t\toffset = offset * 5 + zend_vm_decode[(op + 1)->op1_type];\n");
+ $else = "} else ";
+ }
+ if (isset($used_extra_spec["ISSET"])) {
+ out($f, "\t\t{$else}if (spec & SPEC_RULE_ISSET) {\n");
+ out($f, "\t\t\toffset = offset * 2 + (op->extended_value & ZEND_ISEMPTY);\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");
+ $else = "} else ";
+ }
+ if ($else !== "") {
+ out($f, "\t\t}\n");
+ }
+ 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) {
+ out($f, "\treturn zend_vm_get_opcode_handler_ex(opcode, op);\n");
+ } else {
+ out($f, "\treturn zend_vm_get_opcode_handler_ex(zend_spec_handlers[opcode], op);\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
+ 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");
+ out($f, "{\n");
+ out($f, "\tuint32_t spec = zend_spec_handlers[opcode];\n");
+ if (!ZEND_VM_SPEC) {
+ 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 = 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");
+ out($f, "\t\t_VAR_CODE, /* 4 = IS_VAR */\n");
+ 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_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"]) ||
+ isset($used_extra_spec["RETVAL"]) ||
+ isset($used_extra_spec["QUICK_ARG"]) ||
+ isset($used_extra_spec["SMART_BRANCH"]) ||
+ 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["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");
+ out($f, "#endif\n\n");
+ }
+
+ // Generate zend_vm_get_opcode_handler() function
+ out($f, "ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler(zend_op* op)\n");
+ out($f, "{\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_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) {
+ out($f, "\top->handler = zend_vm_get_opcode_handler_ex(opcode, op);\n");
+ } else {
+ out($f, "\tuint32_t spec = zend_spec_handlers[opcode];\n");
+ if (isset($used_extra_spec["TYPE"])) {
+ out($f, "\tswitch (opcode) {\n");
+ foreach($opcodes as $code => $dsc) {
+ 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);
+ if ($first) {
+ out($f, "\t\t\tif $condition {\n");
+ $first = false;
+ } else {
+ out($f, "\t\t\t} else if $condition {\n");
+ }
+ $spec_dsc = $opcodes[$code];
+ if (isset($spec_dsc["spec"]["NO_CONST_CONST"])) {
+ out($f, "\t\t\t\tif (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {\n");
+ out($f, "\t\t\t\t\tbreak;\n");
+ out($f, "\t\t\t\t}\n");
+ }
+ out($f, "\t\t\t\tspec = ${spec_dsc['spec_code']};\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");
+ }
+ }
+ if (!$first) {
+ out($f, "\t\t\t}\n");
+ }
+ 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");
+ }
+ out($f, "\top->handler = zend_vm_get_opcode_handler_ex(spec, op);\n");
+ }
+ out($f, "}\n\n");
+
+ // 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_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");
+ out($f, "\topcode_handler_t handler;\n");
+ out($f,"#endif\n");
+ }
+ out($f, "\tint ret;\n");
+ out($f, "#ifdef ZEND_VM_IP_GLOBAL_REG\n");
+ out($f, "\tconst zend_op *orig_opline = opline;\n");
+ out($f, "#endif\n");
+ out($f, "#ifdef ZEND_VM_FP_GLOBAL_REG\n");
+ out($f, "\tzend_execute_data *orig_execute_data = execute_data;\n");
+ out($f, "\texecute_data = ex;\n");
+ out($f, "#else\n");
+ out($f, "\tzend_execute_data *execute_data = ex;\n");
+ out($f, "#endif\n");
+ out($f, "\n");
+ out($f, "\tLOAD_OPLINE();\n");
+ out($f,"#if defined(ZEND_VM_FP_GLOBAL_REG) && defined(ZEND_VM_IP_GLOBAL_REG)\n");
+ if (ZEND_VM_KIND == ZEND_VM_KIND_HYBRID) {
+ out($f,"#if (ZEND_VM_KIND == ZEND_VM_KIND_HYBRID)\n");
+ out($f, "\thandler = (opcode_handler_t)zend_vm_get_opcode_handler_func(zend_user_opcodes[opline->opcode], opline);\n");
+ out($f, "\thandler(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);\n");
+ out($f, "\tif (EXPECTED(opline != &hybrid_halt_op)) {\n");
+ out($f,"#else\n");
+ }
+ out($f, "\t((opcode_handler_t)OPLINE->handler)(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);\n");
+ if (ZEND_VM_KIND == ZEND_VM_KIND_HYBRID) {
+ out($f, "\tif (EXPECTED(opline)) {\n");
+ out($f,"#endif\n");
+ } else {
+ out($f, "\tif (EXPECTED(opline)) {\n");
+ }
+ out($f, "\t\tret = execute_data != ex ? (int)(execute_data->prev_execute_data != ex) + 1 : 0;\n");
+ out($f, "\t\tSAVE_OPLINE();\n");
+ out($f, "\t} else {\n");
+ out($f, "\t\tret = -1;\n");
+ out($f, "\t}\n");
+ out($f, "#else\n");
+ out($f, "\tret = ((opcode_handler_t)OPLINE->handler)(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);\n");
+ out($f, "\tSAVE_OPLINE();\n");
+ out($f, "#endif\n");
+ out($f, "#ifdef ZEND_VM_FP_GLOBAL_REG\n");
+ out($f, "\texecute_data = orig_execute_data;\n");
+ out($f, "#endif\n");
+ out($f, "#ifdef ZEND_VM_IP_GLOBAL_REG\n");
+ out($f, "\topline = orig_opline;\n");
+ out($f, "#endif\n");
+ out($f, "\treturn ret;\n");
+ out($f, "}\n\n");
+ } else {
+ 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");
+ out($f, "}\n\n");
+ }
+
+ // Export handlers and helpers
+ if (count($export) > 0 &&
+ ZEND_VM_KIND != ZEND_VM_KIND_CALL) {
+ out($f,"#undef OPLINE\n");
+ out($f,"#undef DCL_OPLINE\n");
+ out($f,"#undef USE_OPLINE\n");
+ out($f,"#undef LOAD_OPLINE\n");
+ out($f,"#undef LOAD_OPLINE_EX\n");
+ out($f,"#undef LOAD_NEXT_OPLINE\n");
+ out($f,"#undef SAVE_OPLINE\n");
+ out($f,"#undef SAVE_OPLINE_EX\n");
+ out($f,"#define OPLINE EX(opline)\n");
+ out($f,"#define DCL_OPLINE\n");
+ out($f,"#define USE_OPLINE const zend_op *opline = EX(opline);\n");
+ out($f,"#define LOAD_OPLINE()\n");
+ out($f,"#define LOAD_OPLINE_EX()\n");
+ out($f,"#define LOAD_NEXT_OPLINE() ZEND_VM_INC_OPCODE()\n");
+ out($f,"#define SAVE_OPLINE()\n");
+ out($f,"#define SAVE_OPLINE_EX()\n");
+ out($f,"#undef HANDLE_EXCEPTION\n");
+ out($f,"#undef HANDLE_EXCEPTION_LEAVE\n");
+ out($f,"#define HANDLE_EXCEPTION() LOAD_OPLINE(); ZEND_VM_CONTINUE()\n");
+ out($f,"#define HANDLE_EXCEPTION_LEAVE() LOAD_OPLINE(); ZEND_VM_LEAVE()\n");
+ out($f,"#undef ZEND_VM_CONTINUE\n");
+ 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");
+ out($f,"#define ZEND_VM_DISPATCH(opcode, opline) return zend_vm_get_opcode_handler(opcode, opline)(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);\n\n");
+ out($f,"\n");
+ }
+ foreach ($export as $dsk) {
+ list($kind, $func, $name) = $dsk;
+ out($f, "ZEND_API int $func(");
+ if ($kind == "handler") {
+ out($f, "ZEND_OPCODE_HANDLER_ARGS)\n");
+ $code = $opcodes[$opnames[$name]]['code'];
+ } else {
+ $h = $helpers[$name];
+ if ($h['param'] == null) {
+ out($f, "ZEND_OPCODE_HANDLER_ARGS)\n");
+ } else {
+ out($f, $h['param']. " ZEND_OPCODE_HANDLER_ARGS_DC)\n");
+ }
+ $code = $h['code'];
+ }
+ $done = 0;
+ if (ZEND_VM_KIND == ZEND_VM_KIND_CALL) {
+ if ($kind == "handler") {
+ $op = $opcodes[$opnames[$name]];
+ if (isset($op['op1']["ANY"]) && isset($op['op2']["ANY"])) {
+ out($f, "{\n\treturn ".$name.(ZEND_VM_SPEC?"_SPEC":"")."_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);\n}\n\n");
+ $done = 1;
+ }
+ } else if ($helpers[$name]["param"] == null) {
+ $h = $helpers[$name];
+ if (isset($h['op1']["ANY"]) && isset($h['op2']["ANY"])) {
+ out($f, "{\n\treturn ".$name.(ZEND_VM_SPEC?"_SPEC":"")."(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);\n}\n\n");
+ $done = 1;
+ }
+ }
+ }
+ if (!$done) {
+ gen_code($f, 0, ZEND_VM_KIND_CALL, 1, $code, 'ANY', 'ANY', $name);
+ }
+ }
+
+ fclose($f);
+ echo "zend_vm_execute.h generated successfully.\n";
}
function usage() {
- echo("\nUsage: php zend_vm_gen.php [options]\n".
- "\nOptions:".
- "\n --with-vm-kind=CALL|SWITCH|GOTO|HYBRID - select threading model (default is HYBRID)".
- "\n --without-specializer - disable executor specialization".
- "\n --with-lines - enable #line directives".
- "\n\n");
+ echo("\nUsage: php zend_vm_gen.php [options]\n".
+ "\nOptions:".
+ "\n --with-vm-kind=CALL|SWITCH|GOTO|HYBRID - select threading model (default is HYBRID)".
+ "\n --without-specializer - disable executor specialization".
+ "\n --with-lines - enable #line directives".
+ "\n\n");
}
// Parse arguments
for ($i = 1; $i < $argc; $i++) {
- if (strpos($argv[$i],"--with-vm-kind=") === 0) {
- $kind = substr($argv[$i], strlen("--with-vm-kind="));
- switch ($kind) {
- case "CALL":
- define("ZEND_VM_KIND", ZEND_VM_KIND_CALL);
- break;
- case "SWITCH":
- define("ZEND_VM_KIND", ZEND_VM_KIND_SWITCH);
- break;
- case "GOTO":
- define("ZEND_VM_KIND", ZEND_VM_KIND_GOTO);
- break;
- case "HYBRID":
- define("ZEND_VM_KIND", ZEND_VM_KIND_HYBRID);
- break;
- default:
- echo("ERROR: Invalid vm kind '$kind'\n");
- usage();
- die();
- }
- } else if ($argv[$i] == "--without-specializer") {
- // Disabling specialization
- define("ZEND_VM_SPEC", 0);
- } else if ($argv[$i] == "--with-lines") {
- // Enabling debugging using original zend_vm_def.h
- define("ZEND_VM_LINES", 1);
- } else if ($argv[$i] == "--help") {
- usage();
- exit();
- } else {
- echo("ERROR: Invalid option '".$argv[$i]."'\n");
- usage();
- die();
- }
+ if (strpos($argv[$i],"--with-vm-kind=") === 0) {
+ $kind = substr($argv[$i], strlen("--with-vm-kind="));
+ switch ($kind) {
+ case "CALL":
+ define("ZEND_VM_KIND", ZEND_VM_KIND_CALL);
+ break;
+ case "SWITCH":
+ define("ZEND_VM_KIND", ZEND_VM_KIND_SWITCH);
+ break;
+ case "GOTO":
+ define("ZEND_VM_KIND", ZEND_VM_KIND_GOTO);
+ break;
+ case "HYBRID":
+ define("ZEND_VM_KIND", ZEND_VM_KIND_HYBRID);
+ break;
+ default:
+ echo("ERROR: Invalid vm kind '$kind'\n");
+ usage();
+ die();
+ }
+ } else if ($argv[$i] == "--without-specializer") {
+ // Disabling specialization
+ define("ZEND_VM_SPEC", 0);
+ } else if ($argv[$i] == "--with-lines") {
+ // Enabling debugging using original zend_vm_def.h
+ define("ZEND_VM_LINES", 1);
+ } else if ($argv[$i] == "--help") {
+ usage();
+ exit();
+ } else {
+ echo("ERROR: Invalid option '".$argv[$i]."'\n");
+ usage();
+ die();
+ }
}
// Using defaults
if (!defined("ZEND_VM_KIND")) {
- // Using CALL threading by default
- define("ZEND_VM_KIND", ZEND_VM_KIND_HYBRID);
+ // Using CALL threading by default
+ define("ZEND_VM_KIND", ZEND_VM_KIND_HYBRID);
}
if (!defined("ZEND_VM_SPEC")) {
- // Using specialized executor by default
- define("ZEND_VM_SPEC", 1);
+ // Using specialized executor by default
+ define("ZEND_VM_SPEC", 1);
}
if (!defined("ZEND_VM_LINES")) {
- // Disabling #line directives
- define("ZEND_VM_LINES", 0);
+ // Disabling #line directives
+ define("ZEND_VM_LINES", 0);
}
gen_vm(__DIR__ . "/zend_vm_def.h", __DIR__ . "/zend_vm_execute.skl");
diff --git a/Zend/zend_vm_handlers.h b/Zend/zend_vm_handlers.h
index 8ea4001851..7aa1a93981 100644
--- a/Zend/zend_vm_handlers.h
+++ b/Zend/zend_vm_handlers.h
@@ -1,48 +1,50 @@
#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) \
+ _(2, ZEND_ADD_SPEC_CONST_TMPVARCV) \
+ _(3, ZEND_ADD_SPEC_CONST_TMPVARCV) \
+ _(5, ZEND_ADD_SPEC_CONST_TMPVARCV) \
+ _(6, ZEND_ADD_SPEC_TMPVARCV_CONST) \
+ _(7, ZEND_ADD_SPEC_TMPVARCV_TMPVARCV) \
+ _(8, ZEND_ADD_SPEC_TMPVARCV_TMPVARCV) \
+ _(10, ZEND_ADD_SPEC_TMPVARCV_TMPVARCV) \
+ _(11, ZEND_ADD_SPEC_TMPVARCV_CONST) \
+ _(12, ZEND_ADD_SPEC_TMPVARCV_TMPVARCV) \
+ _(13, ZEND_ADD_SPEC_TMPVARCV_TMPVARCV) \
+ _(15, ZEND_ADD_SPEC_TMPVARCV_TMPVARCV) \
+ _(21, ZEND_ADD_SPEC_TMPVARCV_CONST) \
+ _(22, ZEND_ADD_SPEC_TMPVARCV_TMPVARCV) \
+ _(23, ZEND_ADD_SPEC_TMPVARCV_TMPVARCV) \
+ _(25, ZEND_ADD_SPEC_TMPVARCV_TMPVARCV) \
_(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) \
+ _(27, ZEND_SUB_SPEC_CONST_TMPVARCV) \
+ _(28, ZEND_SUB_SPEC_CONST_TMPVARCV) \
+ _(30, ZEND_SUB_SPEC_CONST_TMPVARCV) \
+ _(31, ZEND_SUB_SPEC_TMPVARCV_CONST) \
+ _(32, ZEND_SUB_SPEC_TMPVARCV_TMPVARCV) \
+ _(33, ZEND_SUB_SPEC_TMPVARCV_TMPVARCV) \
+ _(35, ZEND_SUB_SPEC_TMPVARCV_TMPVARCV) \
+ _(36, ZEND_SUB_SPEC_TMPVARCV_CONST) \
+ _(37, ZEND_SUB_SPEC_TMPVARCV_TMPVARCV) \
+ _(38, ZEND_SUB_SPEC_TMPVARCV_TMPVARCV) \
+ _(40, ZEND_SUB_SPEC_TMPVARCV_TMPVARCV) \
+ _(46, ZEND_SUB_SPEC_TMPVARCV_CONST) \
+ _(47, ZEND_SUB_SPEC_TMPVARCV_TMPVARCV) \
+ _(48, ZEND_SUB_SPEC_TMPVARCV_TMPVARCV) \
+ _(50, ZEND_SUB_SPEC_TMPVARCV_TMPVARCV) \
_(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) \
+ _(56, ZEND_MUL_SPEC_TMPVARCV_CONST) \
+ _(57, ZEND_MUL_SPEC_TMPVARCV_TMPVARCV) \
+ _(58, ZEND_MUL_SPEC_TMPVARCV_TMPVARCV) \
+ _(60, ZEND_MUL_SPEC_TMPVARCV_TMPVARCV) \
+ _(61, ZEND_MUL_SPEC_TMPVARCV_CONST) \
+ _(62, ZEND_MUL_SPEC_TMPVARCV_TMPVARCV) \
+ _(63, ZEND_MUL_SPEC_TMPVARCV_TMPVARCV) \
+ _(65, ZEND_MUL_SPEC_TMPVARCV_TMPVARCV) \
+ _(71, ZEND_MUL_SPEC_TMPVARCV_CONST) \
+ _(72, ZEND_MUL_SPEC_TMPVARCV_TMPVARCV) \
+ _(73, ZEND_MUL_SPEC_TMPVARCV_TMPVARCV) \
+ _(75, ZEND_MUL_SPEC_TMPVARCV_TMPVARCV) \
_(76, ZEND_DIV_SPEC_CONST_CONST) \
_(77, ZEND_DIV_SPEC_CONST_TMPVAR) \
_(78, ZEND_DIV_SPEC_CONST_TMPVAR) \
@@ -60,53 +62,53 @@
_(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) \
+ _(102, ZEND_MOD_SPEC_CONST_TMPVARCV) \
+ _(103, ZEND_MOD_SPEC_CONST_TMPVARCV) \
+ _(105, ZEND_MOD_SPEC_CONST_TMPVARCV) \
+ _(106, ZEND_MOD_SPEC_TMPVARCV_CONST) \
+ _(107, ZEND_MOD_SPEC_TMPVARCV_TMPVARCV) \
+ _(108, ZEND_MOD_SPEC_TMPVARCV_TMPVARCV) \
+ _(110, ZEND_MOD_SPEC_TMPVARCV_TMPVARCV) \
+ _(111, ZEND_MOD_SPEC_TMPVARCV_CONST) \
+ _(112, ZEND_MOD_SPEC_TMPVARCV_TMPVARCV) \
+ _(113, ZEND_MOD_SPEC_TMPVARCV_TMPVARCV) \
+ _(115, ZEND_MOD_SPEC_TMPVARCV_TMPVARCV) \
+ _(121, ZEND_MOD_SPEC_TMPVARCV_CONST) \
+ _(122, ZEND_MOD_SPEC_TMPVARCV_TMPVARCV) \
+ _(123, ZEND_MOD_SPEC_TMPVARCV_TMPVARCV) \
+ _(125, ZEND_MOD_SPEC_TMPVARCV_TMPVARCV) \
_(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) \
+ _(127, ZEND_SL_SPEC_CONST_TMPVARCV) \
+ _(128, ZEND_SL_SPEC_CONST_TMPVARCV) \
+ _(130, ZEND_SL_SPEC_CONST_TMPVARCV) \
+ _(131, ZEND_SL_SPEC_TMPVARCV_CONST) \
+ _(132, ZEND_SL_SPEC_TMPVARCV_TMPVARCV) \
+ _(133, ZEND_SL_SPEC_TMPVARCV_TMPVARCV) \
+ _(135, ZEND_SL_SPEC_TMPVARCV_TMPVARCV) \
+ _(136, ZEND_SL_SPEC_TMPVARCV_CONST) \
+ _(137, ZEND_SL_SPEC_TMPVARCV_TMPVARCV) \
+ _(138, ZEND_SL_SPEC_TMPVARCV_TMPVARCV) \
+ _(140, ZEND_SL_SPEC_TMPVARCV_TMPVARCV) \
+ _(146, ZEND_SL_SPEC_TMPVARCV_CONST) \
+ _(147, ZEND_SL_SPEC_TMPVARCV_TMPVARCV) \
+ _(148, ZEND_SL_SPEC_TMPVARCV_TMPVARCV) \
+ _(150, ZEND_SL_SPEC_TMPVARCV_TMPVARCV) \
_(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) \
+ _(152, ZEND_SR_SPEC_CONST_TMPVARCV) \
+ _(153, ZEND_SR_SPEC_CONST_TMPVARCV) \
+ _(155, ZEND_SR_SPEC_CONST_TMPVARCV) \
+ _(156, ZEND_SR_SPEC_TMPVARCV_CONST) \
+ _(157, ZEND_SR_SPEC_TMPVARCV_TMPVARCV) \
+ _(158, ZEND_SR_SPEC_TMPVARCV_TMPVARCV) \
+ _(160, ZEND_SR_SPEC_TMPVARCV_TMPVARCV) \
+ _(161, ZEND_SR_SPEC_TMPVARCV_CONST) \
+ _(162, ZEND_SR_SPEC_TMPVARCV_TMPVARCV) \
+ _(163, ZEND_SR_SPEC_TMPVARCV_TMPVARCV) \
+ _(165, ZEND_SR_SPEC_TMPVARCV_TMPVARCV) \
+ _(171, ZEND_SR_SPEC_TMPVARCV_CONST) \
+ _(172, ZEND_SR_SPEC_TMPVARCV_TMPVARCV) \
+ _(173, ZEND_SR_SPEC_TMPVARCV_TMPVARCV) \
+ _(175, ZEND_SR_SPEC_TMPVARCV_TMPVARCV) \
_(177, ZEND_CONCAT_SPEC_CONST_TMPVAR) \
_(178, ZEND_CONCAT_SPEC_CONST_TMPVAR) \
_(180, ZEND_CONCAT_SPEC_CONST_CV) \
@@ -123,1937 +125,1652 @@
_(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) \
+ _(206, ZEND_BW_OR_SPEC_TMPVARCV_CONST) \
+ _(207, ZEND_BW_OR_SPEC_TMPVARCV_TMPVARCV) \
+ _(208, ZEND_BW_OR_SPEC_TMPVARCV_TMPVARCV) \
+ _(210, ZEND_BW_OR_SPEC_TMPVARCV_TMPVARCV) \
+ _(211, ZEND_BW_OR_SPEC_TMPVARCV_CONST) \
+ _(212, ZEND_BW_OR_SPEC_TMPVARCV_TMPVARCV) \
+ _(213, ZEND_BW_OR_SPEC_TMPVARCV_TMPVARCV) \
+ _(215, ZEND_BW_OR_SPEC_TMPVARCV_TMPVARCV) \
+ _(221, ZEND_BW_OR_SPEC_TMPVARCV_CONST) \
+ _(222, ZEND_BW_OR_SPEC_TMPVARCV_TMPVARCV) \
+ _(223, ZEND_BW_OR_SPEC_TMPVARCV_TMPVARCV) \
+ _(225, ZEND_BW_OR_SPEC_TMPVARCV_TMPVARCV) \
_(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) \
+ _(231, ZEND_BW_AND_SPEC_TMPVARCV_CONST) \
+ _(232, ZEND_BW_AND_SPEC_TMPVARCV_TMPVARCV) \
+ _(233, ZEND_BW_AND_SPEC_TMPVARCV_TMPVARCV) \
+ _(235, ZEND_BW_AND_SPEC_TMPVARCV_TMPVARCV) \
+ _(236, ZEND_BW_AND_SPEC_TMPVARCV_CONST) \
+ _(237, ZEND_BW_AND_SPEC_TMPVARCV_TMPVARCV) \
+ _(238, ZEND_BW_AND_SPEC_TMPVARCV_TMPVARCV) \
+ _(240, ZEND_BW_AND_SPEC_TMPVARCV_TMPVARCV) \
+ _(246, ZEND_BW_AND_SPEC_TMPVARCV_CONST) \
+ _(247, ZEND_BW_AND_SPEC_TMPVARCV_TMPVARCV) \
+ _(248, ZEND_BW_AND_SPEC_TMPVARCV_TMPVARCV) \
+ _(250, ZEND_BW_AND_SPEC_TMPVARCV_TMPVARCV) \
_(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)
+ _(256, ZEND_BW_XOR_SPEC_TMPVARCV_CONST) \
+ _(257, ZEND_BW_XOR_SPEC_TMPVARCV_TMPVARCV) \
+ _(258, ZEND_BW_XOR_SPEC_TMPVARCV_TMPVARCV) \
+ _(260, ZEND_BW_XOR_SPEC_TMPVARCV_TMPVARCV) \
+ _(261, ZEND_BW_XOR_SPEC_TMPVARCV_CONST) \
+ _(262, ZEND_BW_XOR_SPEC_TMPVARCV_TMPVARCV) \
+ _(263, ZEND_BW_XOR_SPEC_TMPVARCV_TMPVARCV) \
+ _(265, ZEND_BW_XOR_SPEC_TMPVARCV_TMPVARCV) \
+ _(271, ZEND_BW_XOR_SPEC_TMPVARCV_CONST) \
+ _(272, ZEND_BW_XOR_SPEC_TMPVARCV_TMPVARCV) \
+ _(273, ZEND_BW_XOR_SPEC_TMPVARCV_TMPVARCV) \
+ _(275, ZEND_BW_XOR_SPEC_TMPVARCV_TMPVARCV) \
+ _(276, ZEND_POW_SPEC_CONST_CONST) \
+ _(277, ZEND_POW_SPEC_CONST_TMPVAR) \
+ _(278, ZEND_POW_SPEC_CONST_TMPVAR) \
+ _(280, ZEND_POW_SPEC_CONST_CV) \
+ _(281, ZEND_POW_SPEC_TMPVAR_CONST) \
+ _(282, ZEND_POW_SPEC_TMPVAR_TMPVAR) \
+ _(283, ZEND_POW_SPEC_TMPVAR_TMPVAR) \
+ _(285, ZEND_POW_SPEC_TMPVAR_CV) \
+ _(286, ZEND_POW_SPEC_TMPVAR_CONST) \
+ _(287, ZEND_POW_SPEC_TMPVAR_TMPVAR) \
+ _(288, ZEND_POW_SPEC_TMPVAR_TMPVAR) \
+ _(290, ZEND_POW_SPEC_TMPVAR_CV) \
+ _(296, ZEND_POW_SPEC_CV_CONST) \
+ _(297, ZEND_POW_SPEC_CV_TMPVAR) \
+ _(298, ZEND_POW_SPEC_CV_TMPVAR) \
+ _(300, ZEND_POW_SPEC_CV_CV) \
+ _(301, ZEND_BW_NOT_SPEC_CONST) \
+ _(302, ZEND_BW_NOT_SPEC_TMPVAR) \
+ _(303, ZEND_BW_NOT_SPEC_TMPVAR) \
+ _(305, ZEND_BW_NOT_SPEC_CV) \
+ _(306, ZEND_BOOL_NOT_SPEC_CONST) \
+ _(307, ZEND_BOOL_NOT_SPEC_TMPVAR) \
+ _(308, ZEND_BOOL_NOT_SPEC_TMPVAR) \
+ _(310, ZEND_BOOL_NOT_SPEC_CV) \
+ _(311, ZEND_BOOL_XOR_SPEC_CONST_CONST) \
+ _(316, ZEND_BOOL_XOR_SPEC_TMPVAR_CONST) \
+ _(317, ZEND_BOOL_XOR_SPEC_TMPVAR_TMPVAR) \
+ _(318, ZEND_BOOL_XOR_SPEC_TMPVAR_TMPVAR) \
+ _(321, ZEND_BOOL_XOR_SPEC_TMPVAR_CONST) \
+ _(322, ZEND_BOOL_XOR_SPEC_TMPVAR_TMPVAR) \
+ _(323, ZEND_BOOL_XOR_SPEC_TMPVAR_TMPVAR) \
+ _(331, ZEND_BOOL_XOR_SPEC_CV_CONST) \
+ _(332, ZEND_BOOL_XOR_SPEC_CV_TMPVAR) \
+ _(333, ZEND_BOOL_XOR_SPEC_CV_TMPVAR) \
+ _(335, ZEND_BOOL_XOR_SPEC_CV_CV) \
+ _(336, ZEND_IS_IDENTICAL_SPEC_CONST_CONST) \
+ _(341, ZEND_IS_IDENTICAL_SPEC_TMP_CONST) \
+ _(342, ZEND_IS_IDENTICAL_SPEC_TMP_TMP) \
+ _(346, ZEND_IS_IDENTICAL_SPEC_VAR_CONST) \
+ _(347, ZEND_IS_IDENTICAL_SPEC_VAR_TMP) \
+ _(348, ZEND_IS_IDENTICAL_SPEC_VAR_VAR) \
+ _(356, ZEND_IS_IDENTICAL_SPEC_CV_CONST) \
+ _(357, ZEND_IS_IDENTICAL_SPEC_CV_TMP) \
+ _(358, ZEND_IS_IDENTICAL_SPEC_CV_VAR) \
+ _(360, ZEND_IS_IDENTICAL_SPEC_CV_CV) \
+ _(361, ZEND_IS_NOT_IDENTICAL_SPEC_CONST_CONST) \
+ _(366, ZEND_IS_NOT_IDENTICAL_SPEC_TMP_CONST) \
+ _(367, ZEND_IS_NOT_IDENTICAL_SPEC_TMP_TMP) \
+ _(371, ZEND_IS_NOT_IDENTICAL_SPEC_VAR_CONST) \
+ _(372, ZEND_IS_NOT_IDENTICAL_SPEC_VAR_TMP) \
+ _(373, ZEND_IS_NOT_IDENTICAL_SPEC_VAR_VAR) \
+ _(381, ZEND_IS_NOT_IDENTICAL_SPEC_CV_CONST) \
+ _(382, ZEND_IS_NOT_IDENTICAL_SPEC_CV_TMP) \
+ _(383, ZEND_IS_NOT_IDENTICAL_SPEC_CV_VAR) \
+ _(385, ZEND_IS_NOT_IDENTICAL_SPEC_CV_CV) \
+ _(386, ZEND_IS_EQUAL_SPEC_CONST_CONST) \
+ _(387, ZEND_IS_EQUAL_SPEC_CONST_CONST) \
+ _(388, ZEND_IS_EQUAL_SPEC_CONST_CONST) \
+ _(401, ZEND_IS_EQUAL_SPEC_TMPVAR_CONST) \
+ _(402, ZEND_IS_EQUAL_SPEC_TMPVAR_CONST_JMPZ) \
+ _(403, ZEND_IS_EQUAL_SPEC_TMPVAR_CONST_JMPNZ) \
+ _(404, ZEND_IS_EQUAL_SPEC_TMPVAR_TMPVAR) \
+ _(405, ZEND_IS_EQUAL_SPEC_TMPVAR_TMPVAR_JMPZ) \
+ _(406, ZEND_IS_EQUAL_SPEC_TMPVAR_TMPVAR_JMPNZ) \
+ _(407, ZEND_IS_EQUAL_SPEC_TMPVAR_TMPVAR) \
+ _(408, ZEND_IS_EQUAL_SPEC_TMPVAR_TMPVAR_JMPZ) \
+ _(409, ZEND_IS_EQUAL_SPEC_TMPVAR_TMPVAR_JMPNZ) \
+ _(416, ZEND_IS_EQUAL_SPEC_TMPVAR_CONST) \
+ _(417, ZEND_IS_EQUAL_SPEC_TMPVAR_CONST_JMPZ) \
+ _(418, ZEND_IS_EQUAL_SPEC_TMPVAR_CONST_JMPNZ) \
+ _(419, ZEND_IS_EQUAL_SPEC_TMPVAR_TMPVAR) \
+ _(420, ZEND_IS_EQUAL_SPEC_TMPVAR_TMPVAR_JMPZ) \
+ _(421, ZEND_IS_EQUAL_SPEC_TMPVAR_TMPVAR_JMPNZ) \
+ _(422, ZEND_IS_EQUAL_SPEC_TMPVAR_TMPVAR) \
+ _(423, ZEND_IS_EQUAL_SPEC_TMPVAR_TMPVAR_JMPZ) \
+ _(424, ZEND_IS_EQUAL_SPEC_TMPVAR_TMPVAR_JMPNZ) \
+ _(446, ZEND_IS_EQUAL_SPEC_CV_CONST) \
+ _(447, ZEND_IS_EQUAL_SPEC_CV_CONST_JMPZ) \
+ _(448, ZEND_IS_EQUAL_SPEC_CV_CONST_JMPNZ) \
+ _(449, ZEND_IS_EQUAL_SPEC_CV_TMPVAR) \
+ _(450, ZEND_IS_EQUAL_SPEC_CV_TMPVAR_JMPZ) \
+ _(451, ZEND_IS_EQUAL_SPEC_CV_TMPVAR_JMPNZ) \
+ _(452, ZEND_IS_EQUAL_SPEC_CV_TMPVAR) \
+ _(453, ZEND_IS_EQUAL_SPEC_CV_TMPVAR_JMPZ) \
+ _(454, ZEND_IS_EQUAL_SPEC_CV_TMPVAR_JMPNZ) \
+ _(458, ZEND_IS_EQUAL_SPEC_CV_CV) \
+ _(459, ZEND_IS_EQUAL_SPEC_CV_CV_JMPZ) \
+ _(460, ZEND_IS_EQUAL_SPEC_CV_CV_JMPNZ) \
+ _(461, ZEND_IS_NOT_EQUAL_SPEC_CONST_CONST) \
+ _(462, ZEND_IS_NOT_EQUAL_SPEC_CONST_CONST) \
+ _(463, ZEND_IS_NOT_EQUAL_SPEC_CONST_CONST) \
+ _(476, ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_CONST) \
+ _(477, ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_CONST_JMPZ) \
+ _(478, ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_CONST_JMPNZ) \
+ _(479, ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_TMPVAR) \
+ _(480, ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_TMPVAR_JMPZ) \
+ _(481, ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_TMPVAR_JMPNZ) \
+ _(482, ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_TMPVAR) \
+ _(483, ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_TMPVAR_JMPZ) \
+ _(484, ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_TMPVAR_JMPNZ) \
+ _(491, ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_CONST) \
+ _(492, ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_CONST_JMPZ) \
+ _(493, ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_CONST_JMPNZ) \
+ _(494, ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_TMPVAR) \
+ _(495, ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_TMPVAR_JMPZ) \
+ _(496, ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_TMPVAR_JMPNZ) \
+ _(497, ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_TMPVAR) \
+ _(498, ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_TMPVAR_JMPZ) \
+ _(499, ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_TMPVAR_JMPNZ) \
+ _(521, ZEND_IS_NOT_EQUAL_SPEC_CV_CONST) \
+ _(522, ZEND_IS_NOT_EQUAL_SPEC_CV_CONST_JMPZ) \
+ _(523, ZEND_IS_NOT_EQUAL_SPEC_CV_CONST_JMPNZ) \
+ _(524, ZEND_IS_NOT_EQUAL_SPEC_CV_TMPVAR) \
+ _(525, ZEND_IS_NOT_EQUAL_SPEC_CV_TMPVAR_JMPZ) \
+ _(526, ZEND_IS_NOT_EQUAL_SPEC_CV_TMPVAR_JMPNZ) \
+ _(527, ZEND_IS_NOT_EQUAL_SPEC_CV_TMPVAR) \
+ _(528, ZEND_IS_NOT_EQUAL_SPEC_CV_TMPVAR_JMPZ) \
+ _(529, ZEND_IS_NOT_EQUAL_SPEC_CV_TMPVAR_JMPNZ) \
+ _(533, ZEND_IS_NOT_EQUAL_SPEC_CV_CV) \
+ _(534, ZEND_IS_NOT_EQUAL_SPEC_CV_CV_JMPZ) \
+ _(535, ZEND_IS_NOT_EQUAL_SPEC_CV_CV_JMPNZ) \
+ _(536, ZEND_IS_SMALLER_SPEC_CONST_CONST) \
+ _(537, ZEND_IS_SMALLER_SPEC_CONST_CONST) \
+ _(538, ZEND_IS_SMALLER_SPEC_CONST_CONST) \
+ _(539, ZEND_IS_SMALLER_SPEC_CONST_TMPVARCV) \
+ _(540, ZEND_IS_SMALLER_SPEC_CONST_TMPVARCV_JMPZ) \
+ _(541, ZEND_IS_SMALLER_SPEC_CONST_TMPVARCV_JMPNZ) \
+ _(542, ZEND_IS_SMALLER_SPEC_CONST_TMPVARCV) \
+ _(543, ZEND_IS_SMALLER_SPEC_CONST_TMPVARCV_JMPZ) \
+ _(544, ZEND_IS_SMALLER_SPEC_CONST_TMPVARCV_JMPNZ) \
+ _(548, ZEND_IS_SMALLER_SPEC_CONST_TMPVARCV) \
+ _(549, ZEND_IS_SMALLER_SPEC_CONST_TMPVARCV_JMPZ) \
+ _(550, ZEND_IS_SMALLER_SPEC_CONST_TMPVARCV_JMPNZ) \
+ _(551, ZEND_IS_SMALLER_SPEC_TMPVARCV_CONST) \
+ _(552, ZEND_IS_SMALLER_SPEC_TMPVARCV_CONST_JMPZ) \
+ _(553, ZEND_IS_SMALLER_SPEC_TMPVARCV_CONST_JMPNZ) \
+ _(554, ZEND_IS_SMALLER_SPEC_TMPVARCV_TMPVARCV) \
+ _(555, ZEND_IS_SMALLER_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(556, ZEND_IS_SMALLER_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(557, ZEND_IS_SMALLER_SPEC_TMPVARCV_TMPVARCV) \
+ _(558, ZEND_IS_SMALLER_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(559, ZEND_IS_SMALLER_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(563, ZEND_IS_SMALLER_SPEC_TMPVARCV_TMPVARCV) \
+ _(564, ZEND_IS_SMALLER_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(565, ZEND_IS_SMALLER_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(566, ZEND_IS_SMALLER_SPEC_TMPVARCV_CONST) \
+ _(567, ZEND_IS_SMALLER_SPEC_TMPVARCV_CONST_JMPZ) \
+ _(568, ZEND_IS_SMALLER_SPEC_TMPVARCV_CONST_JMPNZ) \
+ _(569, ZEND_IS_SMALLER_SPEC_TMPVARCV_TMPVARCV) \
+ _(570, ZEND_IS_SMALLER_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(571, ZEND_IS_SMALLER_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(572, ZEND_IS_SMALLER_SPEC_TMPVARCV_TMPVARCV) \
+ _(573, ZEND_IS_SMALLER_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(574, ZEND_IS_SMALLER_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(578, ZEND_IS_SMALLER_SPEC_TMPVARCV_TMPVARCV) \
+ _(579, ZEND_IS_SMALLER_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(580, ZEND_IS_SMALLER_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(596, ZEND_IS_SMALLER_SPEC_TMPVARCV_CONST) \
+ _(597, ZEND_IS_SMALLER_SPEC_TMPVARCV_CONST_JMPZ) \
+ _(598, ZEND_IS_SMALLER_SPEC_TMPVARCV_CONST_JMPNZ) \
+ _(599, ZEND_IS_SMALLER_SPEC_TMPVARCV_TMPVARCV) \
+ _(600, ZEND_IS_SMALLER_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(601, ZEND_IS_SMALLER_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(602, ZEND_IS_SMALLER_SPEC_TMPVARCV_TMPVARCV) \
+ _(603, ZEND_IS_SMALLER_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(604, ZEND_IS_SMALLER_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(608, ZEND_IS_SMALLER_SPEC_TMPVARCV_TMPVARCV) \
+ _(609, ZEND_IS_SMALLER_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(610, ZEND_IS_SMALLER_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(611, ZEND_IS_SMALLER_OR_EQUAL_SPEC_CONST_CONST) \
+ _(612, ZEND_IS_SMALLER_OR_EQUAL_SPEC_CONST_CONST) \
+ _(613, ZEND_IS_SMALLER_OR_EQUAL_SPEC_CONST_CONST) \
+ _(614, ZEND_IS_SMALLER_OR_EQUAL_SPEC_CONST_TMPVARCV) \
+ _(615, ZEND_IS_SMALLER_OR_EQUAL_SPEC_CONST_TMPVARCV_JMPZ) \
+ _(616, ZEND_IS_SMALLER_OR_EQUAL_SPEC_CONST_TMPVARCV_JMPNZ) \
+ _(617, ZEND_IS_SMALLER_OR_EQUAL_SPEC_CONST_TMPVARCV) \
+ _(618, ZEND_IS_SMALLER_OR_EQUAL_SPEC_CONST_TMPVARCV_JMPZ) \
+ _(619, ZEND_IS_SMALLER_OR_EQUAL_SPEC_CONST_TMPVARCV_JMPNZ) \
+ _(623, ZEND_IS_SMALLER_OR_EQUAL_SPEC_CONST_TMPVARCV) \
+ _(624, ZEND_IS_SMALLER_OR_EQUAL_SPEC_CONST_TMPVARCV_JMPZ) \
+ _(625, ZEND_IS_SMALLER_OR_EQUAL_SPEC_CONST_TMPVARCV_JMPNZ) \
+ _(626, ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_CONST) \
+ _(627, ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_CONST_JMPZ) \
+ _(628, ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_CONST_JMPNZ) \
+ _(629, ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_TMPVARCV) \
+ _(630, ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(631, ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(632, ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_TMPVARCV) \
+ _(633, ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(634, ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(638, ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_TMPVARCV) \
+ _(639, ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(640, ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(641, ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_CONST) \
+ _(642, ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_CONST_JMPZ) \
+ _(643, ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_CONST_JMPNZ) \
+ _(644, ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_TMPVARCV) \
+ _(645, ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(646, ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(647, ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_TMPVARCV) \
+ _(648, ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(649, ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(653, ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_TMPVARCV) \
+ _(654, ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(655, ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(671, ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_CONST) \
+ _(672, ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_CONST_JMPZ) \
+ _(673, ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_CONST_JMPNZ) \
+ _(674, ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_TMPVARCV) \
+ _(675, ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(676, ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(677, ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_TMPVARCV) \
+ _(678, ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(679, ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(683, ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_TMPVARCV) \
+ _(684, ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(685, ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(706, ZEND_ASSIGN_SPEC_VAR_CONST_RETVAL_UNUSED) \
+ _(707, ZEND_ASSIGN_SPEC_VAR_CONST_RETVAL_USED) \
+ _(708, ZEND_ASSIGN_SPEC_VAR_TMP_RETVAL_UNUSED) \
+ _(709, ZEND_ASSIGN_SPEC_VAR_TMP_RETVAL_USED) \
+ _(710, ZEND_ASSIGN_SPEC_VAR_VAR_RETVAL_UNUSED) \
+ _(711, ZEND_ASSIGN_SPEC_VAR_VAR_RETVAL_USED) \
+ _(714, ZEND_ASSIGN_SPEC_VAR_CV_RETVAL_UNUSED) \
+ _(715, ZEND_ASSIGN_SPEC_VAR_CV_RETVAL_USED) \
+ _(726, ZEND_ASSIGN_SPEC_CV_CONST_RETVAL_UNUSED) \
+ _(727, ZEND_ASSIGN_SPEC_CV_CONST_RETVAL_USED) \
+ _(728, ZEND_ASSIGN_SPEC_CV_TMP_RETVAL_UNUSED) \
+ _(729, ZEND_ASSIGN_SPEC_CV_TMP_RETVAL_USED) \
+ _(730, ZEND_ASSIGN_SPEC_CV_VAR_RETVAL_UNUSED) \
+ _(731, ZEND_ASSIGN_SPEC_CV_VAR_RETVAL_USED) \
+ _(734, ZEND_ASSIGN_SPEC_CV_CV_RETVAL_UNUSED) \
+ _(735, ZEND_ASSIGN_SPEC_CV_CV_RETVAL_USED) \
+ _(786, ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_DATA_CONST) \
+ _(787, ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_DATA_TMP) \
+ _(788, ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_DATA_VAR) \
+ _(790, ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_DATA_CV) \
+ _(791, ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_DATA_CONST) \
+ _(792, ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_DATA_TMP) \
+ _(793, ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_DATA_VAR) \
+ _(795, ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_DATA_CV) \
+ _(796, ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_DATA_CONST) \
+ _(797, ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_DATA_TMP) \
+ _(798, ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_DATA_VAR) \
+ _(800, ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_DATA_CV) \
+ _(801, ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_DATA_CONST) \
+ _(802, ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_DATA_TMP) \
+ _(803, ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_DATA_VAR) \
+ _(805, ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_DATA_CV) \
+ _(806, ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA_CONST) \
+ _(807, ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA_TMP) \
+ _(808, ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA_VAR) \
+ _(810, ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA_CV) \
+ _(836, ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DATA_CONST) \
+ _(837, ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DATA_TMP) \
+ _(838, ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DATA_VAR) \
+ _(840, ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DATA_CV) \
+ _(841, ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_DATA_CONST) \
+ _(842, ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_DATA_TMP) \
+ _(843, ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_DATA_VAR) \
+ _(845, ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_DATA_CV) \
+ _(846, ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_DATA_CONST) \
+ _(847, ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_DATA_TMP) \
+ _(848, ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_DATA_VAR) \
+ _(850, ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_DATA_CV) \
+ _(851, ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_DATA_CONST) \
+ _(852, ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_DATA_TMP) \
+ _(853, ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_DATA_VAR) \
+ _(855, ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_DATA_CV) \
+ _(856, ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_CONST) \
+ _(857, ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_TMP) \
+ _(858, ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_VAR) \
+ _(860, ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_CV) \
+ _(911, ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_DATA_CONST) \
+ _(912, ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_DATA_TMP) \
+ _(913, ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_DATA_VAR) \
+ _(915, ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_DATA_CV) \
+ _(916, ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_DATA_CONST) \
+ _(917, ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_DATA_TMP) \
+ _(918, ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_DATA_VAR) \
+ _(920, ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_DATA_CV) \
+ _(921, ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_DATA_CONST) \
+ _(922, ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_DATA_TMP) \
+ _(923, ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_DATA_VAR) \
+ _(925, ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_DATA_CV) \
+ _(931, ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA_CONST) \
+ _(932, ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA_TMP) \
+ _(933, ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA_VAR) \
+ _(935, ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA_CV) \
+ _(936, ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_OP_DATA_CONST) \
+ _(937, ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_OP_DATA_TMP) \
+ _(938, ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_OP_DATA_VAR) \
+ _(940, ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_OP_DATA_CV) \
+ _(941, ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_OP_DATA_CONST) \
+ _(942, ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_OP_DATA_TMP) \
+ _(943, ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_OP_DATA_VAR) \
+ _(945, ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_OP_DATA_CV) \
+ _(946, ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_OP_DATA_CONST) \
+ _(947, ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_OP_DATA_TMP) \
+ _(948, ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_OP_DATA_VAR) \
+ _(950, ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_OP_DATA_CV) \
+ _(956, ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_DATA_CONST) \
+ _(957, ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_DATA_TMP) \
+ _(958, ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_DATA_VAR) \
+ _(960, ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_DATA_CV) \
+ _(961, ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DATA_CONST) \
+ _(962, ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DATA_TMP) \
+ _(963, ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DATA_VAR) \
+ _(965, ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DATA_CV) \
+ _(966, ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_DATA_CONST) \
+ _(967, ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_DATA_TMP) \
+ _(968, ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_DATA_VAR) \
+ _(970, ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_DATA_CV) \
+ _(971, ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_DATA_CONST) \
+ _(972, ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_DATA_TMP) \
+ _(973, ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_DATA_VAR) \
+ _(975, ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_DATA_CV) \
+ _(981, ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_CONST) \
+ _(982, ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_TMP) \
+ _(983, ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_VAR) \
+ _(985, ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_CV) \
+ _(986, ZEND_ASSIGN_STATIC_PROP_SPEC_OP_DATA_CONST) \
+ _(987, ZEND_ASSIGN_STATIC_PROP_SPEC_OP_DATA_TMP) \
+ _(988, ZEND_ASSIGN_STATIC_PROP_SPEC_OP_DATA_VAR) \
+ _(990, ZEND_ASSIGN_STATIC_PROP_SPEC_OP_DATA_CV) \
+ _(1001, ZEND_ASSIGN_OP_SPEC_VAR_CONST) \
+ _(1002, ZEND_ASSIGN_OP_SPEC_VAR_TMPVAR) \
+ _(1003, ZEND_ASSIGN_OP_SPEC_VAR_TMPVAR) \
+ _(1005, ZEND_ASSIGN_OP_SPEC_VAR_CV) \
+ _(1011, ZEND_ASSIGN_OP_SPEC_CV_CONST) \
+ _(1012, ZEND_ASSIGN_OP_SPEC_CV_TMPVAR) \
+ _(1013, ZEND_ASSIGN_OP_SPEC_CV_TMPVAR) \
+ _(1015, ZEND_ASSIGN_OP_SPEC_CV_CV) \
+ _(1026, ZEND_ASSIGN_DIM_OP_SPEC_VAR_CONST) \
+ _(1027, ZEND_ASSIGN_DIM_OP_SPEC_VAR_TMPVAR) \
+ _(1028, ZEND_ASSIGN_DIM_OP_SPEC_VAR_TMPVAR) \
+ _(1029, ZEND_ASSIGN_DIM_OP_SPEC_VAR_UNUSED) \
+ _(1030, ZEND_ASSIGN_DIM_OP_SPEC_VAR_CV) \
+ _(1036, ZEND_ASSIGN_DIM_OP_SPEC_CV_CONST) \
+ _(1037, ZEND_ASSIGN_DIM_OP_SPEC_CV_TMPVAR) \
+ _(1038, ZEND_ASSIGN_DIM_OP_SPEC_CV_TMPVAR) \
+ _(1039, ZEND_ASSIGN_DIM_OP_SPEC_CV_UNUSED) \
+ _(1040, ZEND_ASSIGN_DIM_OP_SPEC_CV_CV) \
+ _(1051, ZEND_ASSIGN_OBJ_OP_SPEC_VAR_CONST) \
+ _(1052, ZEND_ASSIGN_OBJ_OP_SPEC_VAR_TMPVAR) \
+ _(1053, ZEND_ASSIGN_OBJ_OP_SPEC_VAR_TMPVAR) \
+ _(1055, ZEND_ASSIGN_OBJ_OP_SPEC_VAR_CV) \
+ _(1056, ZEND_ASSIGN_OBJ_OP_SPEC_UNUSED_CONST) \
+ _(1057, ZEND_ASSIGN_OBJ_OP_SPEC_UNUSED_TMPVAR) \
+ _(1058, ZEND_ASSIGN_OBJ_OP_SPEC_UNUSED_TMPVAR) \
+ _(1060, ZEND_ASSIGN_OBJ_OP_SPEC_UNUSED_CV) \
+ _(1061, ZEND_ASSIGN_OBJ_OP_SPEC_CV_CONST) \
+ _(1062, ZEND_ASSIGN_OBJ_OP_SPEC_CV_TMPVAR) \
+ _(1063, ZEND_ASSIGN_OBJ_OP_SPEC_CV_TMPVAR) \
+ _(1065, ZEND_ASSIGN_OBJ_OP_SPEC_CV_CV) \
+ _(1066, ZEND_ASSIGN_STATIC_PROP_OP_SPEC) \
+ _(1079, ZEND_ASSIGN_REF_SPEC_VAR_VAR) \
+ _(1081, ZEND_ASSIGN_REF_SPEC_VAR_CV) \
+ _(1089, ZEND_ASSIGN_REF_SPEC_CV_VAR) \
+ _(1091, ZEND_ASSIGN_REF_SPEC_CV_CV) \
+ _(1092, ZEND_QM_ASSIGN_SPEC_CONST) \
+ _(1093, ZEND_QM_ASSIGN_SPEC_TMP) \
+ _(1094, ZEND_QM_ASSIGN_SPEC_VAR) \
+ _(1096, ZEND_QM_ASSIGN_SPEC_CV) \
+ _(1149, ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_OP_DATA_VAR) \
+ _(1151, ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_OP_DATA_CV) \
+ _(1154, ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR_OP_DATA_VAR) \
+ _(1156, ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR_OP_DATA_CV) \
+ _(1159, ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR_OP_DATA_VAR) \
+ _(1161, ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR_OP_DATA_CV) \
+ _(1169, ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_DATA_VAR) \
+ _(1171, ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_DATA_CV) \
+ _(1174, ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CONST_OP_DATA_VAR) \
+ _(1176, ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CONST_OP_DATA_CV) \
+ _(1179, ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMPVAR_OP_DATA_VAR) \
+ _(1181, ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMPVAR_OP_DATA_CV) \
+ _(1184, ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMPVAR_OP_DATA_VAR) \
+ _(1186, ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMPVAR_OP_DATA_CV) \
+ _(1194, ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_OP_DATA_VAR) \
+ _(1196, ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_OP_DATA_CV) \
+ _(1199, ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_OP_DATA_VAR) \
+ _(1201, ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_OP_DATA_CV) \
+ _(1204, ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_OP_DATA_VAR) \
+ _(1206, ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_OP_DATA_CV) \
+ _(1209, ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_OP_DATA_VAR) \
+ _(1211, ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_OP_DATA_CV) \
+ _(1219, ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_DATA_VAR) \
+ _(1221, ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_DATA_CV) \
+ _(1222, ZEND_ASSIGN_STATIC_PROP_REF_SPEC) \
+ _(1227, ZEND_PRE_INC_SPEC_VAR_RETVAL_UNUSED) \
+ _(1228, ZEND_PRE_INC_SPEC_VAR_RETVAL_USED) \
+ _(1231, ZEND_PRE_INC_SPEC_CV_RETVAL_UNUSED) \
+ _(1232, ZEND_PRE_INC_SPEC_CV_RETVAL_USED) \
+ _(1237, ZEND_PRE_DEC_SPEC_VAR_RETVAL_UNUSED) \
+ _(1238, ZEND_PRE_DEC_SPEC_VAR_RETVAL_USED) \
+ _(1241, ZEND_PRE_DEC_SPEC_CV_RETVAL_UNUSED) \
+ _(1242, ZEND_PRE_DEC_SPEC_CV_RETVAL_USED) \
+ _(1245, ZEND_POST_INC_SPEC_VAR) \
+ _(1247, ZEND_POST_INC_SPEC_CV) \
+ _(1250, ZEND_POST_DEC_SPEC_VAR) \
+ _(1252, ZEND_POST_DEC_SPEC_CV) \
+ _(1253, ZEND_PRE_INC_STATIC_PROP_SPEC) \
+ _(1254, ZEND_POST_INC_STATIC_PROP_SPEC) \
+ _(1255, ZEND_JMP_SPEC) \
+ _(1256, ZEND_JMPZ_SPEC_CONST) \
+ _(1257, ZEND_JMPZ_SPEC_TMPVAR) \
+ _(1258, ZEND_JMPZ_SPEC_TMPVAR) \
+ _(1260, ZEND_JMPZ_SPEC_CV) \
+ _(1261, ZEND_JMPNZ_SPEC_CONST) \
+ _(1262, ZEND_JMPNZ_SPEC_TMPVAR) \
+ _(1263, ZEND_JMPNZ_SPEC_TMPVAR) \
+ _(1265, ZEND_JMPNZ_SPEC_CV) \
+ _(1266, ZEND_JMPZNZ_SPEC_CONST) \
+ _(1267, ZEND_JMPZNZ_SPEC_TMPVAR) \
+ _(1268, ZEND_JMPZNZ_SPEC_TMPVAR) \
+ _(1270, ZEND_JMPZNZ_SPEC_CV) \
+ _(1271, ZEND_JMPZ_EX_SPEC_CONST) \
+ _(1272, ZEND_JMPZ_EX_SPEC_TMPVAR) \
+ _(1273, ZEND_JMPZ_EX_SPEC_TMPVAR) \
+ _(1275, ZEND_JMPZ_EX_SPEC_CV) \
+ _(1276, ZEND_JMPNZ_EX_SPEC_CONST) \
+ _(1277, ZEND_JMPNZ_EX_SPEC_TMPVAR) \
+ _(1278, ZEND_JMPNZ_EX_SPEC_TMPVAR) \
+ _(1280, ZEND_JMPNZ_EX_SPEC_CV) \
+ _(1281, ZEND_CASE_SPEC_TMPVAR_CONST) \
+ _(1282, ZEND_CASE_SPEC_TMPVAR_TMPVAR) \
+ _(1283, ZEND_CASE_SPEC_TMPVAR_TMPVAR) \
+ _(1285, ZEND_CASE_SPEC_TMPVAR_CV) \
+ _(1286, ZEND_CHECK_VAR_SPEC_CV_UNUSED) \
+ _(1287, ZEND_SEND_VAR_NO_REF_EX_SPEC_VAR) \
+ _(1288, ZEND_SEND_VAR_NO_REF_EX_SPEC_VAR_QUICK) \
+ _(1289, ZEND_CAST_SPEC_CONST) \
+ _(1290, ZEND_CAST_SPEC_TMP) \
+ _(1291, ZEND_CAST_SPEC_VAR) \
+ _(1293, ZEND_CAST_SPEC_CV) \
+ _(1294, ZEND_BOOL_SPEC_CONST) \
+ _(1295, ZEND_BOOL_SPEC_TMPVAR) \
+ _(1296, ZEND_BOOL_SPEC_TMPVAR) \
+ _(1298, ZEND_BOOL_SPEC_CV) \
+ _(1299, ZEND_FAST_CONCAT_SPEC_CONST_CONST) \
+ _(1300, ZEND_FAST_CONCAT_SPEC_CONST_TMPVAR) \
+ _(1301, ZEND_FAST_CONCAT_SPEC_CONST_TMPVAR) \
+ _(1303, ZEND_FAST_CONCAT_SPEC_CONST_CV) \
+ _(1304, ZEND_FAST_CONCAT_SPEC_TMPVAR_CONST) \
+ _(1305, ZEND_FAST_CONCAT_SPEC_TMPVAR_TMPVAR) \
+ _(1306, ZEND_FAST_CONCAT_SPEC_TMPVAR_TMPVAR) \
+ _(1308, ZEND_FAST_CONCAT_SPEC_TMPVAR_CV) \
+ _(1309, ZEND_FAST_CONCAT_SPEC_TMPVAR_CONST) \
+ _(1310, ZEND_FAST_CONCAT_SPEC_TMPVAR_TMPVAR) \
+ _(1311, ZEND_FAST_CONCAT_SPEC_TMPVAR_TMPVAR) \
+ _(1313, ZEND_FAST_CONCAT_SPEC_TMPVAR_CV) \
+ _(1319, ZEND_FAST_CONCAT_SPEC_CV_CONST) \
+ _(1320, ZEND_FAST_CONCAT_SPEC_CV_TMPVAR) \
+ _(1321, ZEND_FAST_CONCAT_SPEC_CV_TMPVAR) \
+ _(1323, ZEND_FAST_CONCAT_SPEC_CV_CV) \
+ _(1324, ZEND_ROPE_INIT_SPEC_UNUSED_CONST) \
+ _(1325, ZEND_ROPE_INIT_SPEC_UNUSED_TMPVAR) \
+ _(1326, ZEND_ROPE_INIT_SPEC_UNUSED_TMPVAR) \
+ _(1328, ZEND_ROPE_INIT_SPEC_UNUSED_CV) \
+ _(1329, ZEND_ROPE_ADD_SPEC_TMP_CONST) \
+ _(1330, ZEND_ROPE_ADD_SPEC_TMP_TMPVAR) \
+ _(1331, ZEND_ROPE_ADD_SPEC_TMP_TMPVAR) \
+ _(1333, ZEND_ROPE_ADD_SPEC_TMP_CV) \
+ _(1334, ZEND_ROPE_END_SPEC_TMP_CONST) \
+ _(1335, ZEND_ROPE_END_SPEC_TMP_TMPVAR) \
+ _(1336, ZEND_ROPE_END_SPEC_TMP_TMPVAR) \
+ _(1338, ZEND_ROPE_END_SPEC_TMP_CV) \
+ _(1339, ZEND_BEGIN_SILENCE_SPEC) \
+ _(1340, ZEND_END_SILENCE_SPEC_TMP) \
+ _(1341, ZEND_INIT_FCALL_BY_NAME_SPEC_CONST) \
+ _(1342, ZEND_DO_FCALL_SPEC_RETVAL_UNUSED) \
+ _(1343, ZEND_DO_FCALL_SPEC_RETVAL_USED) \
+ _(1344, ZEND_INIT_FCALL_SPEC_CONST) \
+ _(1345, ZEND_RETURN_SPEC_CONST) \
+ _(1346, ZEND_RETURN_SPEC_TMP) \
+ _(1347, ZEND_RETURN_SPEC_VAR) \
+ _(1349, ZEND_RETURN_SPEC_CV) \
+ _(1350, ZEND_RECV_SPEC_UNUSED) \
+ _(1351, ZEND_RECV_INIT_SPEC_CONST) \
+ _(1352, ZEND_SEND_VAL_SPEC_CONST) \
+ _(1353, ZEND_SEND_VAL_SPEC_TMPVAR) \
+ _(1354, ZEND_SEND_VAL_SPEC_TMPVAR) \
+ _(1361, ZEND_SEND_VAR_EX_SPEC_VAR) \
+ _(1362, ZEND_SEND_VAR_EX_SPEC_VAR_QUICK) \
+ _(1365, ZEND_SEND_VAR_EX_SPEC_CV) \
+ _(1366, ZEND_SEND_VAR_EX_SPEC_CV_QUICK) \
+ _(1369, ZEND_SEND_REF_SPEC_VAR) \
+ _(1371, ZEND_SEND_REF_SPEC_CV) \
+ _(1372, ZEND_NEW_SPEC_CONST_UNUSED) \
+ _(1374, ZEND_NEW_SPEC_VAR_UNUSED) \
+ _(1375, ZEND_NEW_SPEC_UNUSED_UNUSED) \
+ _(1377, ZEND_INIT_NS_FCALL_BY_NAME_SPEC_CONST) \
+ _(1378, ZEND_FREE_SPEC_TMPVAR) \
+ _(1379, ZEND_INIT_ARRAY_SPEC_CONST_CONST) \
+ _(1380, ZEND_INIT_ARRAY_SPEC_CONST_TMPVAR) \
+ _(1381, ZEND_INIT_ARRAY_SPEC_CONST_TMPVAR) \
+ _(1382, ZEND_INIT_ARRAY_SPEC_CONST_UNUSED) \
+ _(1383, ZEND_INIT_ARRAY_SPEC_CONST_CV) \
+ _(1384, ZEND_INIT_ARRAY_SPEC_TMP_CONST) \
+ _(1385, ZEND_INIT_ARRAY_SPEC_TMP_TMPVAR) \
+ _(1386, ZEND_INIT_ARRAY_SPEC_TMP_TMPVAR) \
+ _(1387, ZEND_INIT_ARRAY_SPEC_TMP_UNUSED) \
+ _(1388, ZEND_INIT_ARRAY_SPEC_TMP_CV) \
+ _(1389, ZEND_INIT_ARRAY_SPEC_VAR_CONST) \
+ _(1390, ZEND_INIT_ARRAY_SPEC_VAR_TMPVAR) \
+ _(1391, ZEND_INIT_ARRAY_SPEC_VAR_TMPVAR) \
+ _(1392, ZEND_INIT_ARRAY_SPEC_VAR_UNUSED) \
+ _(1393, ZEND_INIT_ARRAY_SPEC_VAR_CV) \
+ _(1394, ZEND_INIT_ARRAY_SPEC_UNUSED_CONST) \
+ _(1395, ZEND_INIT_ARRAY_SPEC_UNUSED_TMPVAR) \
+ _(1396, ZEND_INIT_ARRAY_SPEC_UNUSED_TMPVAR) \
+ _(1397, ZEND_INIT_ARRAY_SPEC_UNUSED_UNUSED) \
+ _(1398, ZEND_INIT_ARRAY_SPEC_UNUSED_CV) \
+ _(1399, ZEND_INIT_ARRAY_SPEC_CV_CONST) \
+ _(1400, ZEND_INIT_ARRAY_SPEC_CV_TMPVAR) \
+ _(1401, ZEND_INIT_ARRAY_SPEC_CV_TMPVAR) \
+ _(1402, ZEND_INIT_ARRAY_SPEC_CV_UNUSED) \
+ _(1403, ZEND_INIT_ARRAY_SPEC_CV_CV) \
+ _(1404, ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_CONST) \
+ _(1405, ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_TMPVAR) \
+ _(1406, ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_TMPVAR) \
+ _(1407, ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_UNUSED) \
+ _(1408, ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_CV) \
+ _(1409, ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_CONST) \
+ _(1410, ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_TMPVAR) \
+ _(1411, ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_TMPVAR) \
+ _(1412, ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_UNUSED) \
+ _(1413, ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_CV) \
+ _(1414, ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_CONST) \
+ _(1415, ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_TMPVAR) \
+ _(1416, ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_TMPVAR) \
+ _(1417, ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_UNUSED) \
+ _(1418, ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_CV) \
+ _(1424, ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_CONST) \
+ _(1425, ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_TMPVAR) \
+ _(1426, ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_TMPVAR) \
+ _(1427, ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_UNUSED) \
+ _(1428, ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_CV) \
+ _(1429, ZEND_INCLUDE_OR_EVAL_SPEC_CONST) \
+ _(1430, ZEND_INCLUDE_OR_EVAL_SPEC_TMPVAR) \
+ _(1431, ZEND_INCLUDE_OR_EVAL_SPEC_TMPVAR) \
+ _(1433, ZEND_INCLUDE_OR_EVAL_SPEC_CV) \
+ _(1434, ZEND_UNSET_VAR_SPEC_CONST_UNUSED) \
+ _(1435, ZEND_UNSET_VAR_SPEC_TMPVAR_UNUSED) \
+ _(1436, ZEND_UNSET_VAR_SPEC_TMPVAR_UNUSED) \
+ _(1438, ZEND_UNSET_VAR_SPEC_CV_UNUSED) \
+ _(1449, ZEND_UNSET_DIM_SPEC_VAR_CONST) \
+ _(1450, ZEND_UNSET_DIM_SPEC_VAR_TMPVAR) \
+ _(1451, ZEND_UNSET_DIM_SPEC_VAR_TMPVAR) \
+ _(1453, ZEND_UNSET_DIM_SPEC_VAR_CV) \
+ _(1459, ZEND_UNSET_DIM_SPEC_CV_CONST) \
+ _(1460, ZEND_UNSET_DIM_SPEC_CV_TMPVAR) \
+ _(1461, ZEND_UNSET_DIM_SPEC_CV_TMPVAR) \
+ _(1463, ZEND_UNSET_DIM_SPEC_CV_CV) \
+ _(1474, ZEND_UNSET_OBJ_SPEC_VAR_CONST) \
+ _(1475, ZEND_UNSET_OBJ_SPEC_VAR_TMPVAR) \
+ _(1476, ZEND_UNSET_OBJ_SPEC_VAR_TMPVAR) \
+ _(1478, ZEND_UNSET_OBJ_SPEC_VAR_CV) \
+ _(1479, ZEND_UNSET_OBJ_SPEC_UNUSED_CONST) \
+ _(1480, ZEND_UNSET_OBJ_SPEC_UNUSED_TMPVAR) \
+ _(1481, ZEND_UNSET_OBJ_SPEC_UNUSED_TMPVAR) \
+ _(1483, ZEND_UNSET_OBJ_SPEC_UNUSED_CV) \
+ _(1484, ZEND_UNSET_OBJ_SPEC_CV_CONST) \
+ _(1485, ZEND_UNSET_OBJ_SPEC_CV_TMPVAR) \
+ _(1486, ZEND_UNSET_OBJ_SPEC_CV_TMPVAR) \
+ _(1488, ZEND_UNSET_OBJ_SPEC_CV_CV) \
+ _(1489, ZEND_FE_RESET_R_SPEC_CONST) \
+ _(1490, ZEND_FE_RESET_R_SPEC_TMP) \
+ _(1491, ZEND_FE_RESET_R_SPEC_VAR) \
+ _(1493, ZEND_FE_RESET_R_SPEC_CV) \
+ _(1494, ZEND_FE_FETCH_R_SPEC_VAR) \
+ _(1495, ZEND_EXIT_SPEC) \
+ _(1496, ZEND_FETCH_R_SPEC_CONST_UNUSED) \
+ _(1497, ZEND_FETCH_R_SPEC_TMPVAR_UNUSED) \
+ _(1498, ZEND_FETCH_R_SPEC_TMPVAR_UNUSED) \
+ _(1500, ZEND_FETCH_R_SPEC_CV_UNUSED) \
+ _(1501, ZEND_FETCH_DIM_R_SPEC_CONST_CONST) \
+ _(1502, ZEND_FETCH_DIM_R_SPEC_CONST_TMPVAR) \
+ _(1503, ZEND_FETCH_DIM_R_SPEC_CONST_TMPVAR) \
+ _(1505, ZEND_FETCH_DIM_R_SPEC_CONST_CV) \
+ _(1506, ZEND_FETCH_DIM_R_SPEC_TMPVAR_CONST) \
+ _(1507, ZEND_FETCH_DIM_R_SPEC_TMPVAR_TMPVAR) \
+ _(1508, ZEND_FETCH_DIM_R_SPEC_TMPVAR_TMPVAR) \
+ _(1510, ZEND_FETCH_DIM_R_SPEC_TMPVAR_CV) \
+ _(1511, ZEND_FETCH_DIM_R_SPEC_TMPVAR_CONST) \
+ _(1512, ZEND_FETCH_DIM_R_SPEC_TMPVAR_TMPVAR) \
+ _(1513, ZEND_FETCH_DIM_R_SPEC_TMPVAR_TMPVAR) \
+ _(1515, ZEND_FETCH_DIM_R_SPEC_TMPVAR_CV) \
+ _(1521, ZEND_FETCH_DIM_R_SPEC_CV_CONST) \
+ _(1522, ZEND_FETCH_DIM_R_SPEC_CV_TMPVAR) \
+ _(1523, ZEND_FETCH_DIM_R_SPEC_CV_TMPVAR) \
+ _(1525, ZEND_FETCH_DIM_R_SPEC_CV_CV) \
+ _(1526, ZEND_FETCH_OBJ_R_SPEC_CONST_CONST) \
+ _(1527, ZEND_FETCH_OBJ_R_SPEC_CONST_TMPVAR) \
+ _(1528, ZEND_FETCH_OBJ_R_SPEC_CONST_TMPVAR) \
+ _(1530, ZEND_FETCH_OBJ_R_SPEC_CONST_CV) \
+ _(1531, ZEND_FETCH_OBJ_R_SPEC_TMPVAR_CONST) \
+ _(1532, ZEND_FETCH_OBJ_R_SPEC_TMPVAR_TMPVAR) \
+ _(1533, ZEND_FETCH_OBJ_R_SPEC_TMPVAR_TMPVAR) \
+ _(1535, ZEND_FETCH_OBJ_R_SPEC_TMPVAR_CV) \
+ _(1536, ZEND_FETCH_OBJ_R_SPEC_TMPVAR_CONST) \
+ _(1537, ZEND_FETCH_OBJ_R_SPEC_TMPVAR_TMPVAR) \
+ _(1538, ZEND_FETCH_OBJ_R_SPEC_TMPVAR_TMPVAR) \
+ _(1540, ZEND_FETCH_OBJ_R_SPEC_TMPVAR_CV) \
+ _(1541, ZEND_FETCH_OBJ_R_SPEC_UNUSED_CONST) \
+ _(1542, ZEND_FETCH_OBJ_R_SPEC_UNUSED_TMPVAR) \
+ _(1543, ZEND_FETCH_OBJ_R_SPEC_UNUSED_TMPVAR) \
+ _(1545, ZEND_FETCH_OBJ_R_SPEC_UNUSED_CV) \
+ _(1546, ZEND_FETCH_OBJ_R_SPEC_CV_CONST) \
+ _(1547, ZEND_FETCH_OBJ_R_SPEC_CV_TMPVAR) \
+ _(1548, ZEND_FETCH_OBJ_R_SPEC_CV_TMPVAR) \
+ _(1550, ZEND_FETCH_OBJ_R_SPEC_CV_CV) \
+ _(1551, ZEND_FETCH_W_SPEC_CONST_UNUSED) \
+ _(1552, ZEND_FETCH_W_SPEC_TMPVAR_UNUSED) \
+ _(1553, ZEND_FETCH_W_SPEC_TMPVAR_UNUSED) \
+ _(1555, ZEND_FETCH_W_SPEC_CV_UNUSED) \
+ _(1566, ZEND_FETCH_DIM_W_SPEC_VAR_CONST) \
+ _(1567, ZEND_FETCH_DIM_W_SPEC_VAR_TMPVAR) \
+ _(1568, ZEND_FETCH_DIM_W_SPEC_VAR_TMPVAR) \
+ _(1569, ZEND_FETCH_DIM_W_SPEC_VAR_UNUSED) \
+ _(1570, ZEND_FETCH_DIM_W_SPEC_VAR_CV) \
+ _(1576, ZEND_FETCH_DIM_W_SPEC_CV_CONST) \
+ _(1577, ZEND_FETCH_DIM_W_SPEC_CV_TMPVAR) \
+ _(1578, ZEND_FETCH_DIM_W_SPEC_CV_TMPVAR) \
+ _(1579, ZEND_FETCH_DIM_W_SPEC_CV_UNUSED) \
+ _(1580, ZEND_FETCH_DIM_W_SPEC_CV_CV) \
+ _(1591, ZEND_FETCH_OBJ_W_SPEC_VAR_CONST) \
+ _(1592, ZEND_FETCH_OBJ_W_SPEC_VAR_TMPVAR) \
+ _(1593, ZEND_FETCH_OBJ_W_SPEC_VAR_TMPVAR) \
+ _(1595, ZEND_FETCH_OBJ_W_SPEC_VAR_CV) \
+ _(1596, ZEND_FETCH_OBJ_W_SPEC_UNUSED_CONST) \
+ _(1597, ZEND_FETCH_OBJ_W_SPEC_UNUSED_TMPVAR) \
+ _(1598, ZEND_FETCH_OBJ_W_SPEC_UNUSED_TMPVAR) \
+ _(1600, ZEND_FETCH_OBJ_W_SPEC_UNUSED_CV) \
+ _(1601, ZEND_FETCH_OBJ_W_SPEC_CV_CONST) \
+ _(1602, ZEND_FETCH_OBJ_W_SPEC_CV_TMPVAR) \
+ _(1603, ZEND_FETCH_OBJ_W_SPEC_CV_TMPVAR) \
+ _(1605, ZEND_FETCH_OBJ_W_SPEC_CV_CV) \
+ _(1606, ZEND_FETCH_RW_SPEC_CONST_UNUSED) \
+ _(1607, ZEND_FETCH_RW_SPEC_TMPVAR_UNUSED) \
+ _(1608, ZEND_FETCH_RW_SPEC_TMPVAR_UNUSED) \
+ _(1610, ZEND_FETCH_RW_SPEC_CV_UNUSED) \
+ _(1621, ZEND_FETCH_DIM_RW_SPEC_VAR_CONST) \
+ _(1622, ZEND_FETCH_DIM_RW_SPEC_VAR_TMPVAR) \
+ _(1623, ZEND_FETCH_DIM_RW_SPEC_VAR_TMPVAR) \
+ _(1624, ZEND_FETCH_DIM_RW_SPEC_VAR_UNUSED) \
+ _(1625, ZEND_FETCH_DIM_RW_SPEC_VAR_CV) \
+ _(1631, ZEND_FETCH_DIM_RW_SPEC_CV_CONST) \
+ _(1632, ZEND_FETCH_DIM_RW_SPEC_CV_TMPVAR) \
+ _(1633, ZEND_FETCH_DIM_RW_SPEC_CV_TMPVAR) \
+ _(1634, ZEND_FETCH_DIM_RW_SPEC_CV_UNUSED) \
+ _(1635, ZEND_FETCH_DIM_RW_SPEC_CV_CV) \
+ _(1646, ZEND_FETCH_OBJ_RW_SPEC_VAR_CONST) \
+ _(1647, ZEND_FETCH_OBJ_RW_SPEC_VAR_TMPVAR) \
+ _(1648, ZEND_FETCH_OBJ_RW_SPEC_VAR_TMPVAR) \
+ _(1650, ZEND_FETCH_OBJ_RW_SPEC_VAR_CV) \
+ _(1651, ZEND_FETCH_OBJ_RW_SPEC_UNUSED_CONST) \
+ _(1652, ZEND_FETCH_OBJ_RW_SPEC_UNUSED_TMPVAR) \
+ _(1653, ZEND_FETCH_OBJ_RW_SPEC_UNUSED_TMPVAR) \
+ _(1655, ZEND_FETCH_OBJ_RW_SPEC_UNUSED_CV) \
+ _(1656, ZEND_FETCH_OBJ_RW_SPEC_CV_CONST) \
+ _(1657, ZEND_FETCH_OBJ_RW_SPEC_CV_TMPVAR) \
+ _(1658, ZEND_FETCH_OBJ_RW_SPEC_CV_TMPVAR) \
+ _(1660, ZEND_FETCH_OBJ_RW_SPEC_CV_CV) \
+ _(1661, ZEND_FETCH_IS_SPEC_CONST_UNUSED) \
+ _(1662, ZEND_FETCH_IS_SPEC_TMPVAR_UNUSED) \
+ _(1663, ZEND_FETCH_IS_SPEC_TMPVAR_UNUSED) \
+ _(1665, ZEND_FETCH_IS_SPEC_CV_UNUSED) \
+ _(1666, ZEND_FETCH_DIM_IS_SPEC_CONST_CONST) \
+ _(1667, ZEND_FETCH_DIM_IS_SPEC_CONST_TMPVAR) \
+ _(1668, ZEND_FETCH_DIM_IS_SPEC_CONST_TMPVAR) \
+ _(1670, ZEND_FETCH_DIM_IS_SPEC_CONST_CV) \
+ _(1671, ZEND_FETCH_DIM_IS_SPEC_TMPVAR_CONST) \
+ _(1672, ZEND_FETCH_DIM_IS_SPEC_TMPVAR_TMPVAR) \
+ _(1673, ZEND_FETCH_DIM_IS_SPEC_TMPVAR_TMPVAR) \
+ _(1675, ZEND_FETCH_DIM_IS_SPEC_TMPVAR_CV) \
+ _(1676, ZEND_FETCH_DIM_IS_SPEC_TMPVAR_CONST) \
+ _(1677, ZEND_FETCH_DIM_IS_SPEC_TMPVAR_TMPVAR) \
+ _(1678, ZEND_FETCH_DIM_IS_SPEC_TMPVAR_TMPVAR) \
+ _(1680, ZEND_FETCH_DIM_IS_SPEC_TMPVAR_CV) \
+ _(1686, ZEND_FETCH_DIM_IS_SPEC_CV_CONST) \
+ _(1687, ZEND_FETCH_DIM_IS_SPEC_CV_TMPVAR) \
+ _(1688, ZEND_FETCH_DIM_IS_SPEC_CV_TMPVAR) \
+ _(1690, ZEND_FETCH_DIM_IS_SPEC_CV_CV) \
+ _(1691, ZEND_FETCH_OBJ_IS_SPEC_CONST_CONST) \
+ _(1692, ZEND_FETCH_OBJ_IS_SPEC_CONST_TMPVAR) \
+ _(1693, ZEND_FETCH_OBJ_IS_SPEC_CONST_TMPVAR) \
+ _(1695, ZEND_FETCH_OBJ_IS_SPEC_CONST_CV) \
+ _(1696, ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_CONST) \
+ _(1697, ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_TMPVAR) \
+ _(1698, ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_TMPVAR) \
+ _(1700, ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_CV) \
+ _(1701, ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_CONST) \
+ _(1702, ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_TMPVAR) \
+ _(1703, ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_TMPVAR) \
+ _(1705, ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_CV) \
+ _(1706, ZEND_FETCH_OBJ_IS_SPEC_UNUSED_CONST) \
+ _(1707, ZEND_FETCH_OBJ_IS_SPEC_UNUSED_TMPVAR) \
+ _(1708, ZEND_FETCH_OBJ_IS_SPEC_UNUSED_TMPVAR) \
+ _(1710, ZEND_FETCH_OBJ_IS_SPEC_UNUSED_CV) \
+ _(1711, ZEND_FETCH_OBJ_IS_SPEC_CV_CONST) \
+ _(1712, ZEND_FETCH_OBJ_IS_SPEC_CV_TMPVAR) \
+ _(1713, ZEND_FETCH_OBJ_IS_SPEC_CV_TMPVAR) \
+ _(1715, ZEND_FETCH_OBJ_IS_SPEC_CV_CV) \
+ _(1716, ZEND_FETCH_FUNC_ARG_SPEC_CONST_UNUSED) \
+ _(1717, ZEND_FETCH_FUNC_ARG_SPEC_TMPVAR_UNUSED) \
+ _(1718, ZEND_FETCH_FUNC_ARG_SPEC_TMPVAR_UNUSED) \
+ _(1720, ZEND_FETCH_FUNC_ARG_SPEC_CV_UNUSED) \
+ _(1721, ZEND_FETCH_DIM_FUNC_ARG_SPEC_CONST_CONST) \
+ _(1722, ZEND_FETCH_DIM_FUNC_ARG_SPEC_CONST_TMPVAR) \
+ _(1723, ZEND_FETCH_DIM_FUNC_ARG_SPEC_CONST_TMPVAR) \
+ _(1724, ZEND_FETCH_DIM_FUNC_ARG_SPEC_CONST_UNUSED) \
+ _(1725, ZEND_FETCH_DIM_FUNC_ARG_SPEC_CONST_CV) \
+ _(1726, ZEND_FETCH_DIM_FUNC_ARG_SPEC_TMP_CONST) \
+ _(1727, ZEND_FETCH_DIM_FUNC_ARG_SPEC_TMP_TMPVAR) \
+ _(1728, ZEND_FETCH_DIM_FUNC_ARG_SPEC_TMP_TMPVAR) \
+ _(1729, ZEND_FETCH_DIM_FUNC_ARG_SPEC_TMP_UNUSED) \
+ _(1730, ZEND_FETCH_DIM_FUNC_ARG_SPEC_TMP_CV) \
+ _(1731, ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_CONST) \
+ _(1732, ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_TMPVAR) \
+ _(1733, ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_TMPVAR) \
+ _(1734, ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_UNUSED) \
+ _(1735, ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_CV) \
+ _(1741, ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_CONST) \
+ _(1742, ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_TMPVAR) \
+ _(1743, ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_TMPVAR) \
+ _(1744, ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_UNUSED) \
+ _(1745, ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_CV) \
+ _(1746, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_CONST) \
+ _(1747, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_TMPVAR) \
+ _(1748, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_TMPVAR) \
+ _(1750, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_CV) \
+ _(1751, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMP_CONST) \
+ _(1752, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMP_TMPVAR) \
+ _(1753, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMP_TMPVAR) \
+ _(1755, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMP_CV) \
+ _(1756, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_CONST) \
+ _(1757, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_TMPVAR) \
+ _(1758, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_TMPVAR) \
+ _(1760, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_CV) \
+ _(1761, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED_CONST) \
+ _(1762, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED_TMPVAR) \
+ _(1763, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED_TMPVAR) \
+ _(1765, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED_CV) \
+ _(1766, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_CONST) \
+ _(1767, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_TMPVAR) \
+ _(1768, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_TMPVAR) \
+ _(1770, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_CV) \
+ _(1771, ZEND_FETCH_UNSET_SPEC_CONST_UNUSED) \
+ _(1772, ZEND_FETCH_UNSET_SPEC_TMPVAR_UNUSED) \
+ _(1773, ZEND_FETCH_UNSET_SPEC_TMPVAR_UNUSED) \
+ _(1775, ZEND_FETCH_UNSET_SPEC_CV_UNUSED) \
+ _(1786, ZEND_FETCH_DIM_UNSET_SPEC_VAR_CONST) \
+ _(1787, ZEND_FETCH_DIM_UNSET_SPEC_VAR_TMPVAR) \
+ _(1788, ZEND_FETCH_DIM_UNSET_SPEC_VAR_TMPVAR) \
+ _(1790, ZEND_FETCH_DIM_UNSET_SPEC_VAR_CV) \
+ _(1796, ZEND_FETCH_DIM_UNSET_SPEC_CV_CONST) \
+ _(1797, ZEND_FETCH_DIM_UNSET_SPEC_CV_TMPVAR) \
+ _(1798, ZEND_FETCH_DIM_UNSET_SPEC_CV_TMPVAR) \
+ _(1800, ZEND_FETCH_DIM_UNSET_SPEC_CV_CV) \
+ _(1811, ZEND_FETCH_OBJ_UNSET_SPEC_VAR_CONST) \
+ _(1812, ZEND_FETCH_OBJ_UNSET_SPEC_VAR_TMPVAR) \
+ _(1813, ZEND_FETCH_OBJ_UNSET_SPEC_VAR_TMPVAR) \
+ _(1815, ZEND_FETCH_OBJ_UNSET_SPEC_VAR_CV) \
+ _(1816, ZEND_FETCH_OBJ_UNSET_SPEC_UNUSED_CONST) \
+ _(1817, ZEND_FETCH_OBJ_UNSET_SPEC_UNUSED_TMPVAR) \
+ _(1818, ZEND_FETCH_OBJ_UNSET_SPEC_UNUSED_TMPVAR) \
+ _(1820, ZEND_FETCH_OBJ_UNSET_SPEC_UNUSED_CV) \
+ _(1821, ZEND_FETCH_OBJ_UNSET_SPEC_CV_CONST) \
+ _(1822, ZEND_FETCH_OBJ_UNSET_SPEC_CV_TMPVAR) \
+ _(1823, ZEND_FETCH_OBJ_UNSET_SPEC_CV_TMPVAR) \
+ _(1825, ZEND_FETCH_OBJ_UNSET_SPEC_CV_CV) \
+ _(1826, ZEND_FETCH_LIST_R_SPEC_CONST_CONST) \
+ _(1827, ZEND_FETCH_LIST_R_SPEC_CONST_TMPVAR) \
+ _(1828, ZEND_FETCH_LIST_R_SPEC_CONST_TMPVAR) \
+ _(1830, ZEND_FETCH_LIST_R_SPEC_CONST_CV) \
+ _(1831, ZEND_FETCH_LIST_R_SPEC_TMPVARCV_CONST) \
+ _(1832, ZEND_FETCH_LIST_R_SPEC_TMPVARCV_TMPVAR) \
+ _(1833, ZEND_FETCH_LIST_R_SPEC_TMPVARCV_TMPVAR) \
+ _(1835, ZEND_FETCH_LIST_R_SPEC_TMPVARCV_CV) \
+ _(1836, ZEND_FETCH_LIST_R_SPEC_TMPVARCV_CONST) \
+ _(1837, ZEND_FETCH_LIST_R_SPEC_TMPVARCV_TMPVAR) \
+ _(1838, ZEND_FETCH_LIST_R_SPEC_TMPVARCV_TMPVAR) \
+ _(1840, ZEND_FETCH_LIST_R_SPEC_TMPVARCV_CV) \
+ _(1846, ZEND_FETCH_LIST_R_SPEC_TMPVARCV_CONST) \
+ _(1847, ZEND_FETCH_LIST_R_SPEC_TMPVARCV_TMPVAR) \
+ _(1848, ZEND_FETCH_LIST_R_SPEC_TMPVARCV_TMPVAR) \
+ _(1850, ZEND_FETCH_LIST_R_SPEC_TMPVARCV_CV) \
+ _(1851, ZEND_FETCH_CONSTANT_SPEC_UNUSED_CONST) \
+ _(1852, ZEND_CHECK_FUNC_ARG_SPEC_UNUSED) \
+ _(1853, ZEND_CHECK_FUNC_ARG_SPEC_UNUSED_QUICK) \
+ _(1854, ZEND_EXT_STMT_SPEC) \
+ _(1855, ZEND_EXT_FCALL_BEGIN_SPEC) \
+ _(1856, ZEND_EXT_FCALL_END_SPEC) \
+ _(1857, ZEND_EXT_NOP_SPEC) \
+ _(1858, ZEND_TICKS_SPEC) \
+ _(1859, ZEND_SEND_VAR_NO_REF_SPEC_VAR) \
+ _(1860, ZEND_CATCH_SPEC_CONST) \
+ _(1861, ZEND_THROW_SPEC_CONST) \
+ _(1862, ZEND_THROW_SPEC_TMP) \
+ _(1863, ZEND_THROW_SPEC_VAR) \
+ _(1865, ZEND_THROW_SPEC_CV) \
+ _(1866, ZEND_FETCH_CLASS_SPEC_UNUSED_CONST) \
+ _(1867, ZEND_FETCH_CLASS_SPEC_UNUSED_TMPVAR) \
+ _(1868, ZEND_FETCH_CLASS_SPEC_UNUSED_TMPVAR) \
+ _(1869, ZEND_FETCH_CLASS_SPEC_UNUSED_UNUSED) \
+ _(1870, ZEND_FETCH_CLASS_SPEC_UNUSED_CV) \
+ _(1871, ZEND_CLONE_SPEC_CONST) \
+ _(1872, ZEND_CLONE_SPEC_TMPVAR) \
+ _(1873, ZEND_CLONE_SPEC_TMPVAR) \
+ _(1874, ZEND_CLONE_SPEC_UNUSED) \
+ _(1875, ZEND_CLONE_SPEC_CV) \
+ _(1876, ZEND_RETURN_BY_REF_SPEC_CONST) \
+ _(1877, ZEND_RETURN_BY_REF_SPEC_TMP) \
+ _(1878, ZEND_RETURN_BY_REF_SPEC_VAR) \
+ _(1880, ZEND_RETURN_BY_REF_SPEC_CV) \
+ _(1881, ZEND_INIT_METHOD_CALL_SPEC_CONST_CONST) \
+ _(1882, ZEND_INIT_METHOD_CALL_SPEC_CONST_TMPVAR) \
+ _(1883, ZEND_INIT_METHOD_CALL_SPEC_CONST_TMPVAR) \
+ _(1885, ZEND_INIT_METHOD_CALL_SPEC_CONST_CV) \
+ _(1886, ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_CONST) \
+ _(1887, ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_TMPVAR) \
+ _(1888, ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_TMPVAR) \
+ _(1890, ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_CV) \
+ _(1891, ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_CONST) \
+ _(1892, ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_TMPVAR) \
+ _(1893, ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_TMPVAR) \
+ _(1895, ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_CV) \
+ _(1896, ZEND_INIT_METHOD_CALL_SPEC_UNUSED_CONST) \
+ _(1897, ZEND_INIT_METHOD_CALL_SPEC_UNUSED_TMPVAR) \
+ _(1898, ZEND_INIT_METHOD_CALL_SPEC_UNUSED_TMPVAR) \
+ _(1900, ZEND_INIT_METHOD_CALL_SPEC_UNUSED_CV) \
+ _(1901, ZEND_INIT_METHOD_CALL_SPEC_CV_CONST) \
+ _(1902, ZEND_INIT_METHOD_CALL_SPEC_CV_TMPVAR) \
+ _(1903, ZEND_INIT_METHOD_CALL_SPEC_CV_TMPVAR) \
+ _(1905, ZEND_INIT_METHOD_CALL_SPEC_CV_CV) \
+ _(1906, ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_CONST) \
+ _(1907, ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_TMPVAR) \
+ _(1908, ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_TMPVAR) \
+ _(1909, ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_UNUSED) \
+ _(1910, ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_CV) \
+ _(1916, ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_CONST) \
+ _(1917, ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_TMPVAR) \
+ _(1918, ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_TMPVAR) \
+ _(1919, ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_UNUSED) \
+ _(1920, ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_CV) \
+ _(1921, ZEND_INIT_STATIC_METHOD_CALL_SPEC_UNUSED_CONST) \
+ _(1922, ZEND_INIT_STATIC_METHOD_CALL_SPEC_UNUSED_TMPVAR) \
+ _(1923, ZEND_INIT_STATIC_METHOD_CALL_SPEC_UNUSED_TMPVAR) \
+ _(1924, ZEND_INIT_STATIC_METHOD_CALL_SPEC_UNUSED_UNUSED) \
+ _(1925, ZEND_INIT_STATIC_METHOD_CALL_SPEC_UNUSED_CV) \
+ _(1931, ZEND_ISSET_ISEMPTY_VAR_SPEC_CONST_UNUSED) \
+ _(1932, ZEND_ISSET_ISEMPTY_VAR_SPEC_TMPVAR_UNUSED) \
+ _(1933, ZEND_ISSET_ISEMPTY_VAR_SPEC_TMPVAR_UNUSED) \
+ _(1935, ZEND_ISSET_ISEMPTY_VAR_SPEC_CV_UNUSED) \
+ _(1936, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CONST_CONST) \
+ _(1937, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CONST_TMPVAR) \
+ _(1938, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CONST_TMPVAR) \
+ _(1940, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CONST_CV) \
+ _(1941, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_TMPVAR_CONST) \
+ _(1942, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_TMPVAR_TMPVAR) \
+ _(1943, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_TMPVAR_TMPVAR) \
+ _(1945, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_TMPVAR_CV) \
+ _(1946, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_TMPVAR_CONST) \
+ _(1947, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_TMPVAR_TMPVAR) \
+ _(1948, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_TMPVAR_TMPVAR) \
+ _(1950, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_TMPVAR_CV) \
+ _(1956, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CV_CONST) \
+ _(1957, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CV_TMPVAR) \
+ _(1958, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CV_TMPVAR) \
+ _(1960, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CV_CV) \
+ _(1961, ZEND_SEND_VAL_EX_SPEC_CONST) \
+ _(1962, ZEND_SEND_VAL_EX_SPEC_CONST_QUICK) \
+ _(1963, ZEND_SEND_VAL_EX_SPEC_TMP) \
+ _(1964, ZEND_SEND_VAL_EX_SPEC_TMP_QUICK) \
+ _(1973, ZEND_SEND_VAR_SPEC_VAR) \
+ _(1975, ZEND_SEND_VAR_SPEC_CV) \
+ _(1976, ZEND_INIT_USER_CALL_SPEC_CONST_CONST) \
+ _(1977, ZEND_INIT_USER_CALL_SPEC_CONST_TMPVAR) \
+ _(1978, ZEND_INIT_USER_CALL_SPEC_CONST_TMPVAR) \
+ _(1980, ZEND_INIT_USER_CALL_SPEC_CONST_CV) \
+ _(1981, ZEND_SEND_ARRAY_SPEC) \
+ _(1982, ZEND_SEND_USER_SPEC_CONST) \
+ _(1983, ZEND_SEND_USER_SPEC_TMP) \
+ _(1984, ZEND_SEND_USER_SPEC_VAR) \
+ _(1986, ZEND_SEND_USER_SPEC_CV) \
+ _(1987, ZEND_STRLEN_SPEC_CONST) \
+ _(1988, ZEND_STRLEN_SPEC_TMPVAR) \
+ _(1989, ZEND_STRLEN_SPEC_TMPVAR) \
+ _(1991, ZEND_STRLEN_SPEC_CV) \
+ _(1992, ZEND_DEFINED_SPEC_CONST) \
+ _(1993, ZEND_TYPE_CHECK_SPEC_CONST) \
+ _(1994, ZEND_TYPE_CHECK_SPEC_TMPVAR) \
+ _(1995, ZEND_TYPE_CHECK_SPEC_TMPVAR) \
+ _(1997, ZEND_TYPE_CHECK_SPEC_CV) \
+ _(1998, ZEND_VERIFY_RETURN_TYPE_SPEC_CONST_UNUSED) \
+ _(1999, ZEND_VERIFY_RETURN_TYPE_SPEC_TMP_UNUSED) \
+ _(2000, ZEND_VERIFY_RETURN_TYPE_SPEC_VAR_UNUSED) \
+ _(2001, ZEND_VERIFY_RETURN_TYPE_SPEC_UNUSED_UNUSED) \
+ _(2002, ZEND_VERIFY_RETURN_TYPE_SPEC_CV_UNUSED) \
+ _(2003, ZEND_FE_RESET_RW_SPEC_CONST) \
+ _(2004, ZEND_FE_RESET_RW_SPEC_TMP) \
+ _(2005, ZEND_FE_RESET_RW_SPEC_VAR) \
+ _(2007, ZEND_FE_RESET_RW_SPEC_CV) \
+ _(2008, ZEND_FE_FETCH_RW_SPEC_VAR) \
+ _(2009, ZEND_FE_FREE_SPEC_TMPVAR) \
+ _(2010, ZEND_INIT_DYNAMIC_CALL_SPEC_CONST) \
+ _(2011, ZEND_INIT_DYNAMIC_CALL_SPEC_TMPVAR) \
+ _(2012, ZEND_INIT_DYNAMIC_CALL_SPEC_TMPVAR) \
+ _(2014, ZEND_INIT_DYNAMIC_CALL_SPEC_CV) \
+ _(2015, ZEND_DO_ICALL_SPEC_RETVAL_UNUSED) \
+ _(2016, ZEND_DO_ICALL_SPEC_RETVAL_USED) \
+ _(2017, ZEND_DO_UCALL_SPEC_RETVAL_UNUSED) \
+ _(2018, ZEND_DO_UCALL_SPEC_RETVAL_USED) \
+ _(2019, ZEND_DO_FCALL_BY_NAME_SPEC_RETVAL_UNUSED) \
+ _(2020, ZEND_DO_FCALL_BY_NAME_SPEC_RETVAL_USED) \
+ _(2031, ZEND_PRE_INC_OBJ_SPEC_VAR_CONST) \
+ _(2032, ZEND_PRE_INC_OBJ_SPEC_VAR_TMPVAR) \
+ _(2033, ZEND_PRE_INC_OBJ_SPEC_VAR_TMPVAR) \
+ _(2035, ZEND_PRE_INC_OBJ_SPEC_VAR_CV) \
+ _(2036, ZEND_PRE_INC_OBJ_SPEC_UNUSED_CONST) \
+ _(2037, ZEND_PRE_INC_OBJ_SPEC_UNUSED_TMPVAR) \
+ _(2038, ZEND_PRE_INC_OBJ_SPEC_UNUSED_TMPVAR) \
+ _(2040, ZEND_PRE_INC_OBJ_SPEC_UNUSED_CV) \
+ _(2041, ZEND_PRE_INC_OBJ_SPEC_CV_CONST) \
+ _(2042, ZEND_PRE_INC_OBJ_SPEC_CV_TMPVAR) \
+ _(2043, ZEND_PRE_INC_OBJ_SPEC_CV_TMPVAR) \
+ _(2045, ZEND_PRE_INC_OBJ_SPEC_CV_CV) \
+ _(2056, ZEND_POST_INC_OBJ_SPEC_VAR_CONST) \
+ _(2057, ZEND_POST_INC_OBJ_SPEC_VAR_TMPVAR) \
+ _(2058, ZEND_POST_INC_OBJ_SPEC_VAR_TMPVAR) \
+ _(2060, ZEND_POST_INC_OBJ_SPEC_VAR_CV) \
+ _(2061, ZEND_POST_INC_OBJ_SPEC_UNUSED_CONST) \
+ _(2062, ZEND_POST_INC_OBJ_SPEC_UNUSED_TMPVAR) \
+ _(2063, ZEND_POST_INC_OBJ_SPEC_UNUSED_TMPVAR) \
+ _(2065, ZEND_POST_INC_OBJ_SPEC_UNUSED_CV) \
+ _(2066, ZEND_POST_INC_OBJ_SPEC_CV_CONST) \
+ _(2067, ZEND_POST_INC_OBJ_SPEC_CV_TMPVAR) \
+ _(2068, ZEND_POST_INC_OBJ_SPEC_CV_TMPVAR) \
+ _(2070, ZEND_POST_INC_OBJ_SPEC_CV_CV) \
+ _(2071, ZEND_ECHO_SPEC_CONST) \
+ _(2072, ZEND_ECHO_SPEC_TMPVAR) \
+ _(2073, ZEND_ECHO_SPEC_TMPVAR) \
+ _(2075, ZEND_ECHO_SPEC_CV) \
+ _(2082, ZEND_INSTANCEOF_SPEC_TMPVAR_CONST) \
+ _(2084, ZEND_INSTANCEOF_SPEC_TMPVAR_VAR) \
+ _(2085, ZEND_INSTANCEOF_SPEC_TMPVAR_UNUSED) \
+ _(2087, ZEND_INSTANCEOF_SPEC_TMPVAR_CONST) \
+ _(2089, ZEND_INSTANCEOF_SPEC_TMPVAR_VAR) \
+ _(2090, ZEND_INSTANCEOF_SPEC_TMPVAR_UNUSED) \
+ _(2097, ZEND_INSTANCEOF_SPEC_CV_CONST) \
+ _(2099, ZEND_INSTANCEOF_SPEC_CV_VAR) \
+ _(2100, ZEND_INSTANCEOF_SPEC_CV_UNUSED) \
+ _(2102, ZEND_GENERATOR_CREATE_SPEC) \
+ _(2105, ZEND_MAKE_REF_SPEC_VAR_UNUSED) \
+ _(2107, ZEND_MAKE_REF_SPEC_CV_UNUSED) \
+ _(2108, ZEND_DECLARE_FUNCTION_SPEC) \
+ _(2109, ZEND_DECLARE_LAMBDA_FUNCTION_SPEC_CONST_UNUSED) \
+ _(2110, ZEND_DECLARE_CONST_SPEC_CONST_CONST) \
+ _(2111, ZEND_DECLARE_CLASS_SPEC_CONST) \
+ _(2112, ZEND_DECLARE_CLASS_DELAYED_SPEC_CONST_CONST) \
+ _(2113, ZEND_DECLARE_ANON_CLASS_SPEC) \
+ _(2114, ZEND_ADD_ARRAY_UNPACK_SPEC) \
+ _(2115, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CONST_CONST) \
+ _(2116, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CONST_TMPVAR) \
+ _(2117, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CONST_TMPVAR) \
+ _(2119, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CONST_CV) \
+ _(2120, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TMPVAR_CONST) \
+ _(2121, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TMPVAR_TMPVAR) \
+ _(2122, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TMPVAR_TMPVAR) \
+ _(2124, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TMPVAR_CV) \
+ _(2125, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TMPVAR_CONST) \
+ _(2126, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TMPVAR_TMPVAR) \
+ _(2127, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TMPVAR_TMPVAR) \
+ _(2129, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TMPVAR_CV) \
+ _(2130, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_UNUSED_CONST) \
+ _(2131, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_UNUSED_TMPVAR) \
+ _(2132, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_UNUSED_TMPVAR) \
+ _(2134, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_UNUSED_CV) \
+ _(2135, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CV_CONST) \
+ _(2136, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CV_TMPVAR) \
+ _(2137, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CV_TMPVAR) \
+ _(2139, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CV_CV) \
+ _(2140, ZEND_HANDLE_EXCEPTION_SPEC) \
+ _(2141, ZEND_USER_OPCODE_SPEC) \
+ _(2142, ZEND_ASSERT_CHECK_SPEC) \
+ _(2143, ZEND_JMP_SET_SPEC_CONST) \
+ _(2144, ZEND_JMP_SET_SPEC_TMP) \
+ _(2145, ZEND_JMP_SET_SPEC_VAR) \
+ _(2147, ZEND_JMP_SET_SPEC_CV) \
+ _(2148, ZEND_UNSET_CV_SPEC_CV_UNUSED) \
+ _(2149, ZEND_ISSET_ISEMPTY_CV_SPEC_CV_UNUSED_SET) \
+ _(2150, ZEND_ISSET_ISEMPTY_CV_SPEC_CV_UNUSED_EMPTY) \
+ _(2151, ZEND_FETCH_LIST_W_SPEC_VAR_CONST) \
+ _(2152, ZEND_FETCH_LIST_W_SPEC_VAR_TMPVAR) \
+ _(2153, ZEND_FETCH_LIST_W_SPEC_VAR_TMPVAR) \
+ _(2155, ZEND_FETCH_LIST_W_SPEC_VAR_CV) \
+ _(2156, ZEND_SEPARATE_SPEC_VAR_UNUSED) \
+ _(2157, ZEND_FETCH_CLASS_NAME_SPEC_UNUSED) \
+ _(2158, ZEND_CALL_TRAMPOLINE_SPEC) \
+ _(2159, ZEND_DISCARD_EXCEPTION_SPEC) \
+ _(2160, ZEND_YIELD_SPEC_CONST_CONST) \
+ _(2161, ZEND_YIELD_SPEC_CONST_TMP) \
+ _(2162, ZEND_YIELD_SPEC_CONST_VAR) \
+ _(2163, ZEND_YIELD_SPEC_CONST_UNUSED) \
+ _(2164, ZEND_YIELD_SPEC_CONST_CV) \
+ _(2165, ZEND_YIELD_SPEC_TMP_CONST) \
+ _(2166, ZEND_YIELD_SPEC_TMP_TMP) \
+ _(2167, ZEND_YIELD_SPEC_TMP_VAR) \
+ _(2168, ZEND_YIELD_SPEC_TMP_UNUSED) \
+ _(2169, ZEND_YIELD_SPEC_TMP_CV) \
+ _(2170, ZEND_YIELD_SPEC_VAR_CONST) \
+ _(2171, ZEND_YIELD_SPEC_VAR_TMP) \
+ _(2172, ZEND_YIELD_SPEC_VAR_VAR) \
+ _(2173, ZEND_YIELD_SPEC_VAR_UNUSED) \
+ _(2174, ZEND_YIELD_SPEC_VAR_CV) \
+ _(2175, ZEND_YIELD_SPEC_UNUSED_CONST) \
+ _(2176, ZEND_YIELD_SPEC_UNUSED_TMP) \
+ _(2177, ZEND_YIELD_SPEC_UNUSED_VAR) \
+ _(2178, ZEND_YIELD_SPEC_UNUSED_UNUSED) \
+ _(2179, ZEND_YIELD_SPEC_UNUSED_CV) \
+ _(2180, ZEND_YIELD_SPEC_CV_CONST) \
+ _(2181, ZEND_YIELD_SPEC_CV_TMP) \
+ _(2182, ZEND_YIELD_SPEC_CV_VAR) \
+ _(2183, ZEND_YIELD_SPEC_CV_UNUSED) \
+ _(2184, ZEND_YIELD_SPEC_CV_CV) \
+ _(2185, ZEND_GENERATOR_RETURN_SPEC_CONST) \
+ _(2186, ZEND_GENERATOR_RETURN_SPEC_TMP) \
+ _(2187, ZEND_GENERATOR_RETURN_SPEC_VAR) \
+ _(2189, ZEND_GENERATOR_RETURN_SPEC_CV) \
+ _(2190, ZEND_FAST_CALL_SPEC) \
+ _(2191, ZEND_FAST_RET_SPEC) \
+ _(2192, ZEND_RECV_VARIADIC_SPEC_UNUSED) \
+ _(2193, ZEND_SEND_UNPACK_SPEC) \
+ _(2194, ZEND_YIELD_FROM_SPEC_CONST) \
+ _(2195, ZEND_YIELD_FROM_SPEC_TMP) \
+ _(2196, ZEND_YIELD_FROM_SPEC_VAR) \
+ _(2198, ZEND_YIELD_FROM_SPEC_CV) \
+ _(2199, ZEND_COPY_TMP_SPEC_TMPVAR_UNUSED) \
+ _(2200, ZEND_BIND_GLOBAL_SPEC_CV_CONST) \
+ _(2201, ZEND_COALESCE_SPEC_CONST) \
+ _(2202, ZEND_COALESCE_SPEC_TMP) \
+ _(2203, ZEND_COALESCE_SPEC_VAR) \
+ _(2205, ZEND_COALESCE_SPEC_CV) \
+ _(2206, ZEND_SPACESHIP_SPEC_CONST_CONST) \
+ _(2207, ZEND_SPACESHIP_SPEC_CONST_TMPVAR) \
+ _(2208, ZEND_SPACESHIP_SPEC_CONST_TMPVAR) \
+ _(2210, ZEND_SPACESHIP_SPEC_CONST_CV) \
+ _(2211, ZEND_SPACESHIP_SPEC_TMPVAR_CONST) \
+ _(2212, ZEND_SPACESHIP_SPEC_TMPVAR_TMPVAR) \
+ _(2213, ZEND_SPACESHIP_SPEC_TMPVAR_TMPVAR) \
+ _(2215, ZEND_SPACESHIP_SPEC_TMPVAR_CV) \
+ _(2216, ZEND_SPACESHIP_SPEC_TMPVAR_CONST) \
+ _(2217, ZEND_SPACESHIP_SPEC_TMPVAR_TMPVAR) \
+ _(2218, ZEND_SPACESHIP_SPEC_TMPVAR_TMPVAR) \
+ _(2220, ZEND_SPACESHIP_SPEC_TMPVAR_CV) \
+ _(2226, ZEND_SPACESHIP_SPEC_CV_CONST) \
+ _(2227, ZEND_SPACESHIP_SPEC_CV_TMPVAR) \
+ _(2228, ZEND_SPACESHIP_SPEC_CV_TMPVAR) \
+ _(2230, ZEND_SPACESHIP_SPEC_CV_CV) \
+ _(2231, ZEND_FUNC_NUM_ARGS_SPEC_UNUSED_UNUSED) \
+ _(2232, ZEND_FUNC_GET_ARGS_SPEC_CONST_UNUSED) \
+ _(2235, ZEND_FUNC_GET_ARGS_SPEC_UNUSED_UNUSED) \
+ _(2237, ZEND_FETCH_STATIC_PROP_R_SPEC) \
+ _(2238, ZEND_FETCH_STATIC_PROP_W_SPEC) \
+ _(2239, ZEND_FETCH_STATIC_PROP_RW_SPEC) \
+ _(2240, ZEND_FETCH_STATIC_PROP_IS_SPEC) \
+ _(2241, ZEND_FETCH_STATIC_PROP_FUNC_ARG_SPEC) \
+ _(2242, ZEND_FETCH_STATIC_PROP_UNSET_SPEC) \
+ _(2243, ZEND_UNSET_STATIC_PROP_SPEC) \
+ _(2244, ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC) \
+ _(2245, ZEND_FETCH_CLASS_CONSTANT_SPEC_CONST_CONST) \
+ _(2247, ZEND_FETCH_CLASS_CONSTANT_SPEC_VAR_CONST) \
+ _(2248, ZEND_FETCH_CLASS_CONSTANT_SPEC_UNUSED_CONST) \
+ _(2250, ZEND_BIND_LEXICAL_SPEC_TMP_CV) \
+ _(2251, ZEND_BIND_STATIC_SPEC_CV_UNUSED) \
+ _(2252, ZEND_FETCH_THIS_SPEC_UNUSED_UNUSED) \
+ _(2253, ZEND_SEND_FUNC_ARG_SPEC_VAR) \
+ _(2254, ZEND_ISSET_ISEMPTY_THIS_SPEC_UNUSED_UNUSED) \
+ _(2255, ZEND_SWITCH_LONG_SPEC_CONST_CONST) \
+ _(2256, ZEND_SWITCH_LONG_SPEC_TMPVARCV_CONST) \
+ _(2257, ZEND_SWITCH_LONG_SPEC_TMPVARCV_CONST) \
+ _(2259, ZEND_SWITCH_LONG_SPEC_TMPVARCV_CONST) \
+ _(2260, ZEND_SWITCH_STRING_SPEC_CONST_CONST) \
+ _(2261, ZEND_SWITCH_STRING_SPEC_TMPVARCV_CONST) \
+ _(2262, ZEND_SWITCH_STRING_SPEC_TMPVARCV_CONST) \
+ _(2264, ZEND_SWITCH_STRING_SPEC_TMPVARCV_CONST) \
+ _(2265, ZEND_IN_ARRAY_SPEC_CONST_CONST) \
+ _(2266, ZEND_IN_ARRAY_SPEC_TMP_CONST) \
+ _(2267, ZEND_IN_ARRAY_SPEC_VAR_CONST) \
+ _(2269, ZEND_IN_ARRAY_SPEC_CV_CONST) \
+ _(2270, ZEND_COUNT_SPEC_CONST_UNUSED) \
+ _(2271, ZEND_COUNT_SPEC_TMPVAR_UNUSED) \
+ _(2272, ZEND_COUNT_SPEC_TMPVAR_UNUSED) \
+ _(2274, ZEND_COUNT_SPEC_CV_UNUSED) \
+ _(2275, ZEND_GET_CLASS_SPEC_CONST_UNUSED) \
+ _(2276, ZEND_GET_CLASS_SPEC_TMPVAR_UNUSED) \
+ _(2277, ZEND_GET_CLASS_SPEC_TMPVAR_UNUSED) \
+ _(2278, ZEND_GET_CLASS_SPEC_UNUSED_UNUSED) \
+ _(2279, ZEND_GET_CLASS_SPEC_CV_UNUSED) \
+ _(2280, ZEND_GET_CALLED_CLASS_SPEC_UNUSED_UNUSED) \
+ _(2281, ZEND_GET_TYPE_SPEC_CONST_UNUSED) \
+ _(2282, ZEND_GET_TYPE_SPEC_TMP_UNUSED) \
+ _(2283, ZEND_GET_TYPE_SPEC_VAR_UNUSED) \
+ _(2285, ZEND_GET_TYPE_SPEC_CV_UNUSED) \
+ _(2286, ZEND_ARRAY_KEY_EXISTS_SPEC_CONST_CONST) \
+ _(2287, ZEND_ARRAY_KEY_EXISTS_SPEC_CONST_TMPVAR) \
+ _(2288, ZEND_ARRAY_KEY_EXISTS_SPEC_CONST_TMPVAR) \
+ _(2290, ZEND_ARRAY_KEY_EXISTS_SPEC_CONST_CV) \
+ _(2291, ZEND_ARRAY_KEY_EXISTS_SPEC_TMPVAR_CONST) \
+ _(2292, ZEND_ARRAY_KEY_EXISTS_SPEC_TMPVAR_TMPVAR) \
+ _(2293, ZEND_ARRAY_KEY_EXISTS_SPEC_TMPVAR_TMPVAR) \
+ _(2295, ZEND_ARRAY_KEY_EXISTS_SPEC_TMPVAR_CV) \
+ _(2296, ZEND_ARRAY_KEY_EXISTS_SPEC_TMPVAR_CONST) \
+ _(2297, ZEND_ARRAY_KEY_EXISTS_SPEC_TMPVAR_TMPVAR) \
+ _(2298, ZEND_ARRAY_KEY_EXISTS_SPEC_TMPVAR_TMPVAR) \
+ _(2300, ZEND_ARRAY_KEY_EXISTS_SPEC_TMPVAR_CV) \
+ _(2306, ZEND_ARRAY_KEY_EXISTS_SPEC_CV_CONST) \
+ _(2307, ZEND_ARRAY_KEY_EXISTS_SPEC_CV_TMPVAR) \
+ _(2308, ZEND_ARRAY_KEY_EXISTS_SPEC_CV_TMPVAR) \
+ _(2310, ZEND_ARRAY_KEY_EXISTS_SPEC_CV_CV) \
+ _(2311, ZEND_JMP_FORWARD_SPEC) \
+ _(2317, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \
+ _(2318, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+ _(2319, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+ _(2321, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+ _(2322, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \
+ _(2323, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+ _(2324, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+ _(2326, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+ _(2332, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \
+ _(2333, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+ _(2334, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+ _(2336, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+ _(2342, ZEND_ADD_LONG_SPEC_TMPVARCV_CONST) \
+ _(2343, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(2344, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(2346, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(2347, ZEND_ADD_LONG_SPEC_TMPVARCV_CONST) \
+ _(2348, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(2349, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(2351, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(2357, ZEND_ADD_LONG_SPEC_TMPVARCV_CONST) \
+ _(2358, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(2359, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(2361, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(2367, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_CONST) \
+ _(2368, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(2369, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(2371, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(2372, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_CONST) \
+ _(2373, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(2374, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(2376, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(2382, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_CONST) \
+ _(2383, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(2384, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(2386, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(2388, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_CONST_TMPVARCV) \
+ _(2389, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_CONST_TMPVARCV) \
+ _(2391, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_CONST_TMPVARCV) \
+ _(2392, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \
+ _(2393, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+ _(2394, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+ _(2396, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+ _(2397, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \
+ _(2398, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+ _(2399, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+ _(2401, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+ _(2407, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \
+ _(2408, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+ _(2409, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+ _(2411, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+ _(2413, ZEND_SUB_LONG_SPEC_CONST_TMPVARCV) \
+ _(2414, ZEND_SUB_LONG_SPEC_CONST_TMPVARCV) \
+ _(2416, ZEND_SUB_LONG_SPEC_CONST_TMPVARCV) \
+ _(2417, ZEND_SUB_LONG_SPEC_TMPVARCV_CONST) \
+ _(2418, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(2419, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(2421, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(2422, ZEND_SUB_LONG_SPEC_TMPVARCV_CONST) \
+ _(2423, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(2424, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(2426, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(2432, ZEND_SUB_LONG_SPEC_TMPVARCV_CONST) \
+ _(2433, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(2434, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(2436, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(2438, ZEND_SUB_DOUBLE_SPEC_CONST_TMPVARCV) \
+ _(2439, ZEND_SUB_DOUBLE_SPEC_CONST_TMPVARCV) \
+ _(2441, ZEND_SUB_DOUBLE_SPEC_CONST_TMPVARCV) \
+ _(2442, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_CONST) \
+ _(2443, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(2444, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(2446, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(2447, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_CONST) \
+ _(2448, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(2449, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(2451, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(2457, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_CONST) \
+ _(2458, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(2459, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(2461, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(2467, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \
+ _(2468, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+ _(2469, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+ _(2471, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+ _(2472, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \
+ _(2473, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+ _(2474, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+ _(2476, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+ _(2482, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \
+ _(2483, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+ _(2484, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+ _(2486, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+ _(2492, ZEND_MUL_LONG_SPEC_TMPVARCV_CONST) \
+ _(2493, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(2494, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(2496, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(2497, ZEND_MUL_LONG_SPEC_TMPVARCV_CONST) \
+ _(2498, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(2499, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(2501, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(2507, ZEND_MUL_LONG_SPEC_TMPVARCV_CONST) \
+ _(2508, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(2509, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(2511, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(2517, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_CONST) \
+ _(2518, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(2519, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(2521, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(2522, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_CONST) \
+ _(2523, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(2524, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(2526, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(2532, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_CONST) \
+ _(2533, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(2534, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(2536, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(2552, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST) \
+ _(2553, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \
+ _(2554, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \
+ _(2555, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(2556, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(2557, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(2558, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(2559, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(2560, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(2564, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(2565, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(2566, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(2567, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST) \
+ _(2568, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \
+ _(2569, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \
+ _(2570, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(2571, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(2572, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(2573, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(2574, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(2575, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(2579, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(2580, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(2581, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(2597, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST) \
+ _(2598, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \
+ _(2599, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \
+ _(2600, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(2601, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(2602, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(2603, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(2604, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(2605, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(2609, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(2610, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(2611, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(2627, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \
+ _(2628, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \
+ _(2629, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \
+ _(2630, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(2631, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(2632, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(2633, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(2634, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(2635, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(2639, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(2640, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(2641, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(2642, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \
+ _(2643, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \
+ _(2644, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \
+ _(2645, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(2646, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(2647, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(2648, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(2649, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(2650, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(2654, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(2655, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(2656, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(2672, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \
+ _(2673, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \
+ _(2674, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \
+ _(2675, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(2676, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(2677, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(2678, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(2679, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(2680, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(2684, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(2685, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(2686, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(2702, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST) \
+ _(2703, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \
+ _(2704, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \
+ _(2705, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(2706, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(2707, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(2708, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(2709, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(2710, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(2714, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(2715, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(2716, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(2717, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST) \
+ _(2718, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \
+ _(2719, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \
+ _(2720, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(2721, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(2722, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(2723, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(2724, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(2725, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(2729, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(2730, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(2731, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(2747, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST) \
+ _(2748, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \
+ _(2749, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \
+ _(2750, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(2751, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(2752, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(2753, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(2754, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(2755, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(2759, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(2760, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(2761, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(2777, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \
+ _(2778, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \
+ _(2779, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \
+ _(2780, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(2781, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(2782, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(2783, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(2784, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(2785, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(2789, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(2790, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(2791, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(2792, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \
+ _(2793, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \
+ _(2794, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \
+ _(2795, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(2796, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(2797, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(2798, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(2799, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(2800, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(2804, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(2805, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(2806, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(2822, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \
+ _(2823, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \
+ _(2824, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \
+ _(2825, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(2826, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(2827, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(2828, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(2829, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(2830, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(2834, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(2835, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(2836, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(2840, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV) \
+ _(2841, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPZ) \
+ _(2842, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \
+ _(2843, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV) \
+ _(2844, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPZ) \
+ _(2845, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \
+ _(2849, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV) \
+ _(2850, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPZ) \
+ _(2851, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \
+ _(2852, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST) \
+ _(2853, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPZ) \
+ _(2854, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \
+ _(2855, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(2856, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(2857, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(2858, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(2859, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(2860, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(2864, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(2865, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(2866, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(2867, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST) \
+ _(2868, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPZ) \
+ _(2869, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \
+ _(2870, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(2871, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(2872, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(2873, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(2874, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(2875, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(2879, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(2880, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(2881, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(2897, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST) \
+ _(2898, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPZ) \
+ _(2899, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \
+ _(2900, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(2901, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(2902, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(2903, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(2904, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(2905, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(2909, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(2910, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(2911, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(2915, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV) \
+ _(2916, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \
+ _(2917, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \
+ _(2918, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV) \
+ _(2919, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \
+ _(2920, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \
+ _(2924, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV) \
+ _(2925, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \
+ _(2926, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \
+ _(2927, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST) \
+ _(2928, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \
+ _(2929, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \
+ _(2930, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(2931, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(2932, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(2933, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(2934, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(2935, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(2939, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(2940, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(2941, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(2942, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST) \
+ _(2943, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \
+ _(2944, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \
+ _(2945, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(2946, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(2947, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(2948, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(2949, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(2950, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(2954, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(2955, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(2956, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(2972, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST) \
+ _(2973, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \
+ _(2974, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \
+ _(2975, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(2976, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(2977, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(2978, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(2979, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(2980, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(2984, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(2985, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(2986, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(2990, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV) \
+ _(2991, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPZ) \
+ _(2992, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \
+ _(2993, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV) \
+ _(2994, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPZ) \
+ _(2995, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \
+ _(2999, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV) \
+ _(3000, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPZ) \
+ _(3001, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \
+ _(3002, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST) \
+ _(3003, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \
+ _(3004, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \
+ _(3005, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(3006, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(3007, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(3008, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(3009, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(3010, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(3014, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(3015, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(3016, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(3017, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST) \
+ _(3018, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \
+ _(3019, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \
+ _(3020, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(3021, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(3022, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(3023, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(3024, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(3025, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(3029, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(3030, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(3031, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(3047, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST) \
+ _(3048, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \
+ _(3049, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \
+ _(3050, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(3051, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(3052, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(3053, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(3054, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(3055, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(3059, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(3060, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(3061, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(3065, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV) \
+ _(3066, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \
+ _(3067, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \
+ _(3068, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV) \
+ _(3069, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \
+ _(3070, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \
+ _(3074, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV) \
+ _(3075, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \
+ _(3076, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \
+ _(3077, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \
+ _(3078, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \
+ _(3079, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \
+ _(3080, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(3081, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(3082, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(3083, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(3084, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(3085, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(3089, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(3090, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(3091, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(3092, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \
+ _(3093, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \
+ _(3094, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \
+ _(3095, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(3096, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(3097, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(3098, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(3099, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(3100, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(3104, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(3105, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(3106, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(3122, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \
+ _(3123, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \
+ _(3124, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \
+ _(3125, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(3126, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(3127, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(3128, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(3129, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(3130, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(3134, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(3135, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(3136, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(3137, ZEND_PRE_INC_LONG_NO_OVERFLOW_SPEC_CV_RETVAL_UNUSED) \
+ _(3138, ZEND_PRE_INC_LONG_NO_OVERFLOW_SPEC_CV_RETVAL_USED) \
+ _(3139, ZEND_PRE_INC_LONG_SPEC_CV_RETVAL_UNUSED) \
+ _(3140, ZEND_PRE_INC_LONG_SPEC_CV_RETVAL_USED) \
+ _(3141, ZEND_PRE_DEC_LONG_NO_OVERFLOW_SPEC_CV_RETVAL_UNUSED) \
+ _(3142, ZEND_PRE_DEC_LONG_NO_OVERFLOW_SPEC_CV_RETVAL_USED) \
+ _(3143, ZEND_PRE_DEC_LONG_SPEC_CV_RETVAL_UNUSED) \
+ _(3144, ZEND_PRE_DEC_LONG_SPEC_CV_RETVAL_USED) \
+ _(3145, ZEND_POST_INC_LONG_NO_OVERFLOW_SPEC_CV) \
+ _(3146, ZEND_POST_INC_LONG_SPEC_CV) \
+ _(3147, ZEND_POST_DEC_LONG_NO_OVERFLOW_SPEC_CV) \
+ _(3148, ZEND_POST_DEC_LONG_SPEC_CV) \
+ _(3149, ZEND_QM_ASSIGN_LONG_SPEC_CONST) \
+ _(3150, ZEND_QM_ASSIGN_LONG_SPEC_TMPVARCV) \
+ _(3151, ZEND_QM_ASSIGN_LONG_SPEC_TMPVARCV) \
+ _(3153, ZEND_QM_ASSIGN_LONG_SPEC_TMPVARCV) \
+ _(3154, ZEND_QM_ASSIGN_DOUBLE_SPEC_CONST) \
+ _(3155, ZEND_QM_ASSIGN_DOUBLE_SPEC_TMPVARCV) \
+ _(3156, ZEND_QM_ASSIGN_DOUBLE_SPEC_TMPVARCV) \
+ _(3158, ZEND_QM_ASSIGN_DOUBLE_SPEC_TMPVARCV) \
+ _(3159, ZEND_QM_ASSIGN_NOREF_SPEC_CONST) \
+ _(3160, ZEND_QM_ASSIGN_NOREF_SPEC_TMPVARCV) \
+ _(3161, ZEND_QM_ASSIGN_NOREF_SPEC_TMPVARCV) \
+ _(3163, ZEND_QM_ASSIGN_NOREF_SPEC_TMPVARCV) \
+ _(3165, ZEND_FETCH_DIM_R_INDEX_SPEC_CONST_TMPVARCV) \
+ _(3166, ZEND_FETCH_DIM_R_INDEX_SPEC_CONST_TMPVARCV) \
+ _(3168, ZEND_FETCH_DIM_R_INDEX_SPEC_CONST_TMPVARCV) \
+ _(3169, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_CONST) \
+ _(3170, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \
+ _(3171, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \
+ _(3173, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \
+ _(3174, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_CONST) \
+ _(3175, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \
+ _(3176, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \
+ _(3178, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \
+ _(3184, ZEND_FETCH_DIM_R_INDEX_SPEC_CV_CONST) \
+ _(3185, ZEND_FETCH_DIM_R_INDEX_SPEC_CV_TMPVARCV) \
+ _(3186, ZEND_FETCH_DIM_R_INDEX_SPEC_CV_TMPVARCV) \
+ _(3188, ZEND_FETCH_DIM_R_INDEX_SPEC_CV_TMPVARCV) \
+ _(3191, ZEND_SEND_VAR_SIMPLE_SPEC_VAR) \
+ _(3193, ZEND_SEND_VAR_SIMPLE_SPEC_CV) \
+ _(3196, ZEND_SEND_VAR_EX_SIMPLE_SPEC_VAR) \
+ _(3198, ZEND_SEND_VAR_EX_SIMPLE_SPEC_CV) \
+ _(3199, ZEND_SEND_VAL_SIMPLE_SPEC_CONST) \
+ _(3200, ZEND_SEND_VAL_EX_SIMPLE_SPEC_CONST) \
+ _(3201, ZEND_FE_FETCH_R_SIMPLE_SPEC_VAR_CV_RETVAL_UNUSED) \
+ _(3202, ZEND_FE_FETCH_R_SIMPLE_SPEC_VAR_CV_RETVAL_USED) \
+ _(3202+1, ZEND_NULL)
diff --git a/Zend/zend_vm_opcodes.c b/Zend/zend_vm_opcodes.c
index 56c3ac7c25..3290d760be 100644
--- a/Zend/zend_vm_opcodes.c
+++ b/Zend/zend_vm_opcodes.c
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| Zend Engine |
+----------------------------------------------------------------------+
- | Copyright (c) 1998-2018 Zend Technologies Ltd. (http://www.zend.com) |
+ | Copyright (c) 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 |
@@ -22,7 +22,7 @@
#include <zend.h>
#include <zend_vm_opcodes.h>
-static const char *zend_vm_opcodes_names[199] = {
+static const char *zend_vm_opcodes_names[195] = {
"ZEND_NOP",
"ZEND_ADD",
"ZEND_SUB",
@@ -35,6 +35,7 @@ static const char *zend_vm_opcodes_names[199] = {
"ZEND_BW_OR",
"ZEND_BW_AND",
"ZEND_BW_XOR",
+ "ZEND_POW",
"ZEND_BW_NOT",
"ZEND_BOOL_NOT",
"ZEND_BOOL_XOR",
@@ -44,27 +45,26 @@ static const char *zend_vm_opcodes_names[199] = {
"ZEND_IS_NOT_EQUAL",
"ZEND_IS_SMALLER",
"ZEND_IS_SMALLER_OR_EQUAL",
- "ZEND_CAST",
+ "ZEND_ASSIGN",
+ "ZEND_ASSIGN_DIM",
+ "ZEND_ASSIGN_OBJ",
+ "ZEND_ASSIGN_STATIC_PROP",
+ "ZEND_ASSIGN_OP",
+ "ZEND_ASSIGN_DIM_OP",
+ "ZEND_ASSIGN_OBJ_OP",
+ "ZEND_ASSIGN_STATIC_PROP_OP",
+ "ZEND_ASSIGN_REF",
"ZEND_QM_ASSIGN",
- "ZEND_ASSIGN_ADD",
- "ZEND_ASSIGN_SUB",
- "ZEND_ASSIGN_MUL",
- "ZEND_ASSIGN_DIV",
- "ZEND_ASSIGN_MOD",
- "ZEND_ASSIGN_SL",
- "ZEND_ASSIGN_SR",
- "ZEND_ASSIGN_CONCAT",
- "ZEND_ASSIGN_BW_OR",
- "ZEND_ASSIGN_BW_AND",
- "ZEND_ASSIGN_BW_XOR",
+ "ZEND_ASSIGN_OBJ_REF",
+ "ZEND_ASSIGN_STATIC_PROP_REF",
"ZEND_PRE_INC",
"ZEND_PRE_DEC",
"ZEND_POST_INC",
"ZEND_POST_DEC",
- "ZEND_ASSIGN",
- "ZEND_ASSIGN_REF",
- "ZEND_ECHO",
- "ZEND_GENERATOR_CREATE",
+ "ZEND_PRE_INC_STATIC_PROP",
+ "ZEND_PRE_DEC_STATIC_PROP",
+ "ZEND_POST_INC_STATIC_PROP",
+ "ZEND_POST_DEC_STATIC_PROP",
"ZEND_JMP",
"ZEND_JMPZ",
"ZEND_JMPNZ",
@@ -74,7 +74,7 @@ static const char *zend_vm_opcodes_names[199] = {
"ZEND_CASE",
"ZEND_CHECK_VAR",
"ZEND_SEND_VAR_NO_REF_EX",
- "ZEND_MAKE_REF",
+ "ZEND_CAST",
"ZEND_BOOL",
"ZEND_FAST_CONCAT",
"ZEND_ROPE_INIT",
@@ -159,26 +159,26 @@ static const char *zend_vm_opcodes_names[199] = {
"ZEND_PRE_DEC_OBJ",
"ZEND_POST_INC_OBJ",
"ZEND_POST_DEC_OBJ",
- "ZEND_ASSIGN_OBJ",
+ "ZEND_ECHO",
"ZEND_OP_DATA",
"ZEND_INSTANCEOF",
- "ZEND_DECLARE_CLASS",
- "ZEND_DECLARE_INHERITED_CLASS",
+ "ZEND_GENERATOR_CREATE",
+ "ZEND_MAKE_REF",
"ZEND_DECLARE_FUNCTION",
- "ZEND_YIELD_FROM",
+ "ZEND_DECLARE_LAMBDA_FUNCTION",
"ZEND_DECLARE_CONST",
- "ZEND_ADD_INTERFACE",
- "ZEND_DECLARE_INHERITED_CLASS_DELAYED",
- "ZEND_VERIFY_ABSTRACT_CLASS",
- "ZEND_ASSIGN_DIM",
+ "ZEND_DECLARE_CLASS",
+ "ZEND_DECLARE_CLASS_DELAYED",
+ "ZEND_DECLARE_ANON_CLASS",
+ "ZEND_ADD_ARRAY_UNPACK",
"ZEND_ISSET_ISEMPTY_PROP_OBJ",
"ZEND_HANDLE_EXCEPTION",
"ZEND_USER_OPCODE",
"ZEND_ASSERT_CHECK",
"ZEND_JMP_SET",
- "ZEND_DECLARE_LAMBDA_FUNCTION",
- "ZEND_ADD_TRAIT",
- "ZEND_BIND_TRAITS",
+ "ZEND_UNSET_CV",
+ "ZEND_ISSET_ISEMPTY_CV",
+ "ZEND_FETCH_LIST_W",
"ZEND_SEPARATE",
"ZEND_FETCH_CLASS_NAME",
"ZEND_CALL_TRAMPOLINE",
@@ -189,13 +189,13 @@ static const char *zend_vm_opcodes_names[199] = {
"ZEND_FAST_RET",
"ZEND_RECV_VARIADIC",
"ZEND_SEND_UNPACK",
- "ZEND_POW",
- "ZEND_ASSIGN_POW",
+ "ZEND_YIELD_FROM",
+ "ZEND_COPY_TMP",
"ZEND_BIND_GLOBAL",
"ZEND_COALESCE",
"ZEND_SPACESHIP",
- "ZEND_DECLARE_ANON_CLASS",
- "ZEND_DECLARE_ANON_INHERITED_CLASS",
+ "ZEND_FUNC_NUM_ARGS",
+ "ZEND_FUNC_GET_ARGS",
"ZEND_FETCH_STATIC_PROP_R",
"ZEND_FETCH_STATIC_PROP_W",
"ZEND_FETCH_STATIC_PROP_RW",
@@ -217,26 +217,23 @@ static const char *zend_vm_opcodes_names[199] = {
"ZEND_GET_CLASS",
"ZEND_GET_CALLED_CLASS",
"ZEND_GET_TYPE",
- "ZEND_FUNC_NUM_ARGS",
- "ZEND_FUNC_GET_ARGS",
- "ZEND_UNSET_CV",
- "ZEND_ISSET_ISEMPTY_CV",
- "ZEND_FETCH_LIST_W",
+ "ZEND_ARRAY_KEY_EXISTS",
};
-static uint32_t zend_vm_opcodes_flags[199] = {
+static uint32_t zend_vm_opcodes_flags[195] = {
0x00000000,
+ 0x00000b0b,
+ 0x00000b0b,
+ 0x80000b0b,
0x00000707,
- 0x00000707,
- 0x80000707,
- 0x00000707,
- 0x00000707,
- 0x00000707,
- 0x00000707,
+ 0x00000b0b,
+ 0x00000b0b,
+ 0x00000b0b,
0x40000707,
- 0x80000707,
- 0x80000707,
- 0x80000707,
+ 0x80000b0b,
+ 0x80000b0b,
+ 0x80000b0b,
+ 0x00000707,
0x00000007,
0x00000007,
0x80000707,
@@ -244,29 +241,28 @@ static uint32_t zend_vm_opcodes_flags[199] = {
0x80000303,
0x80000707,
0x80000707,
- 0x00000707,
- 0x00000707,
- 0x07000003,
+ 0x00000b0b,
+ 0x00000b0b,
+ 0x00000301,
+ 0x00006701,
+ 0x00040751,
+ 0x00040000,
+ 0x04000701,
+ 0x04006701,
+ 0x04000751,
+ 0x04000000,
+ 0x0b000101,
0x00000003,
- 0x04046751,
- 0x04046751,
- 0x04046751,
- 0x04046751,
- 0x04046751,
- 0x04046751,
- 0x04046751,
- 0x04046751,
- 0x04046751,
- 0x04046751,
- 0x04046751,
+ 0x0b040751,
+ 0x0b040000,
0x00000001,
0x00000001,
0x00000001,
0x00000001,
- 0x00000301,
- 0x0b000101,
- 0x00000007,
- 0x00000000,
+ 0x00040000,
+ 0x00040000,
+ 0x00040000,
+ 0x00040000,
0x00000020,
0x00002007,
0x00002007,
@@ -276,7 +272,7 @@ static uint32_t zend_vm_opcodes_flags[199] = {
0x00000705,
0x00000101,
0x00001001,
- 0x00000101,
+ 0x07000003,
0x00000007,
0x00000707,
0x01000701,
@@ -304,13 +300,13 @@ static uint32_t zend_vm_opcodes_flags[199] = {
0x00040751,
0x00002003,
0x03000001,
- 0x00000007,
+ 0x00000000,
0x00010107,
0x00000707,
0x00040757,
0x00010107,
0x00006701,
- 0x00040751,
+ 0x00640751,
0x00010107,
0x00006701,
0x00040751,
@@ -319,7 +315,7 @@ static uint32_t zend_vm_opcodes_flags[199] = {
0x00040757,
0x00010107,
0x00006703,
- 0x00040753,
+ 0x00240753,
0x00010107,
0x00000701,
0x00040751,
@@ -361,26 +357,26 @@ static uint32_t zend_vm_opcodes_flags[199] = {
0x00040751,
0x00040751,
0x00040751,
- 0x00040751,
+ 0x00000007,
0x00000000,
0x00047305,
- 0x00000003,
- 0x00000303,
0x00000000,
- 0x00000003,
+ 0x00000101,
+ 0x00000000,
+ 0x00040103,
0x00000303,
- 0x00040300,
+ 0x00000003,
0x00000303,
+ 0x00040000,
0x00000000,
- 0x00006701,
0x00060757,
0x00000000,
0x00000000,
0x00002000,
0x00002003,
- 0x00000103,
- 0x00040000,
- 0x00000000,
+ 0x00000101,
+ 0x00020101,
+ 0x00000701,
0x00000101,
0x00000071,
0x00000000,
@@ -391,39 +387,35 @@ static uint32_t zend_vm_opcodes_flags[199] = {
0x00003000,
0x0000a110,
0x00000000,
- 0x00000707,
- 0x04046751,
+ 0x00000003,
+ 0x00000105,
0x00040301,
- 0x00002007,
+ 0x00002003,
0x00000707,
- 0x03000000,
- 0x03000303,
- 0x00047307,
- 0x00047307,
- 0x00047307,
- 0x00047307,
- 0x00047307,
- 0x00047307,
- 0x00047307,
- 0x00067307,
+ 0x00000101,
+ 0x00000103,
+ 0x00047000,
+ 0x00647000,
+ 0x00047000,
+ 0x00047000,
+ 0x00247000,
+ 0x00047000,
+ 0x00040000,
+ 0x00067000,
0x00040373,
0x00100101,
- 0x00100301,
+ 0x00100101,
0x00000101,
0x00001001,
0x00000101,
0x0300030b,
0x0300030b,
0x01000303,
- 0x00000103,
- 0x00000103,
+ 0x00000107,
+ 0x00000107,
0x00000101,
0x00000103,
- 0x00000101,
- 0x00000103,
- 0x00000101,
- 0x00020101,
- 0x00000701,
+ 0x00000707,
};
ZEND_API const char* ZEND_FASTCALL zend_get_opcode_name(zend_uchar opcode) {
diff --git a/Zend/zend_vm_opcodes.h b/Zend/zend_vm_opcodes.h
index ea9e523b36..d06f44e889 100644
--- a/Zend/zend_vm_opcodes.h
+++ b/Zend/zend_vm_opcodes.h
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| Zend Engine |
+----------------------------------------------------------------------+
- | Copyright (c) 1998-2018 Zend Technologies Ltd. (http://www.zend.com) |
+ | Copyright (c) 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 |
@@ -53,11 +53,13 @@
#define ZEND_VM_EXT_CACHE_SLOT 0x00040000
#define ZEND_VM_EXT_ARRAY_INIT 0x00080000
#define ZEND_VM_EXT_REF 0x00100000
+#define ZEND_VM_EXT_FETCH_REF 0x00200000
+#define ZEND_VM_EXT_DIM_OBJ_WRITE 0x00400000
#define ZEND_VM_EXT_MASK 0x0f000000
#define ZEND_VM_EXT_NUM 0x01000000
#define ZEND_VM_EXT_LAST_CATCH 0x02000000
#define ZEND_VM_EXT_JMP_ADDR 0x03000000
-#define ZEND_VM_EXT_DIM_OBJ 0x04000000
+#define ZEND_VM_EXT_OP 0x04000000
#define ZEND_VM_EXT_TYPE 0x07000000
#define ZEND_VM_EXT_EVAL 0x08000000
#define ZEND_VM_EXT_TYPE_MASK 0x09000000
@@ -74,206 +76,202 @@ ZEND_API uint32_t ZEND_FASTCALL zend_get_opcode_flags(zend_uchar opcode);
END_EXTERN_C()
-#define ZEND_NOP 0
-#define ZEND_ADD 1
-#define ZEND_SUB 2
-#define ZEND_MUL 3
-#define ZEND_DIV 4
-#define ZEND_MOD 5
-#define ZEND_SL 6
-#define ZEND_SR 7
-#define ZEND_CONCAT 8
-#define ZEND_BW_OR 9
-#define ZEND_BW_AND 10
-#define ZEND_BW_XOR 11
-#define ZEND_BW_NOT 12
-#define ZEND_BOOL_NOT 13
-#define ZEND_BOOL_XOR 14
-#define ZEND_IS_IDENTICAL 15
-#define ZEND_IS_NOT_IDENTICAL 16
-#define ZEND_IS_EQUAL 17
-#define ZEND_IS_NOT_EQUAL 18
-#define ZEND_IS_SMALLER 19
-#define ZEND_IS_SMALLER_OR_EQUAL 20
-#define ZEND_CAST 21
-#define ZEND_QM_ASSIGN 22
-#define ZEND_ASSIGN_ADD 23
-#define ZEND_ASSIGN_SUB 24
-#define ZEND_ASSIGN_MUL 25
-#define ZEND_ASSIGN_DIV 26
-#define ZEND_ASSIGN_MOD 27
-#define ZEND_ASSIGN_SL 28
-#define ZEND_ASSIGN_SR 29
-#define ZEND_ASSIGN_CONCAT 30
-#define ZEND_ASSIGN_BW_OR 31
-#define ZEND_ASSIGN_BW_AND 32
-#define ZEND_ASSIGN_BW_XOR 33
-#define ZEND_PRE_INC 34
-#define ZEND_PRE_DEC 35
-#define ZEND_POST_INC 36
-#define ZEND_POST_DEC 37
-#define ZEND_ASSIGN 38
-#define ZEND_ASSIGN_REF 39
-#define ZEND_ECHO 40
-#define ZEND_GENERATOR_CREATE 41
-#define ZEND_JMP 42
-#define ZEND_JMPZ 43
-#define ZEND_JMPNZ 44
-#define ZEND_JMPZNZ 45
-#define ZEND_JMPZ_EX 46
-#define ZEND_JMPNZ_EX 47
-#define ZEND_CASE 48
-#define ZEND_CHECK_VAR 49
-#define ZEND_SEND_VAR_NO_REF_EX 50
-#define ZEND_MAKE_REF 51
-#define ZEND_BOOL 52
-#define ZEND_FAST_CONCAT 53
-#define ZEND_ROPE_INIT 54
-#define ZEND_ROPE_ADD 55
-#define ZEND_ROPE_END 56
-#define ZEND_BEGIN_SILENCE 57
-#define ZEND_END_SILENCE 58
-#define ZEND_INIT_FCALL_BY_NAME 59
-#define ZEND_DO_FCALL 60
-#define ZEND_INIT_FCALL 61
-#define ZEND_RETURN 62
-#define ZEND_RECV 63
-#define ZEND_RECV_INIT 64
-#define ZEND_SEND_VAL 65
-#define ZEND_SEND_VAR_EX 66
-#define ZEND_SEND_REF 67
-#define ZEND_NEW 68
-#define ZEND_INIT_NS_FCALL_BY_NAME 69
-#define ZEND_FREE 70
-#define ZEND_INIT_ARRAY 71
-#define ZEND_ADD_ARRAY_ELEMENT 72
-#define ZEND_INCLUDE_OR_EVAL 73
-#define ZEND_UNSET_VAR 74
-#define ZEND_UNSET_DIM 75
-#define ZEND_UNSET_OBJ 76
-#define ZEND_FE_RESET_R 77
-#define ZEND_FE_FETCH_R 78
-#define ZEND_EXIT 79
-#define ZEND_FETCH_R 80
-#define ZEND_FETCH_DIM_R 81
-#define ZEND_FETCH_OBJ_R 82
-#define ZEND_FETCH_W 83
-#define ZEND_FETCH_DIM_W 84
-#define ZEND_FETCH_OBJ_W 85
-#define ZEND_FETCH_RW 86
-#define ZEND_FETCH_DIM_RW 87
-#define ZEND_FETCH_OBJ_RW 88
-#define ZEND_FETCH_IS 89
-#define ZEND_FETCH_DIM_IS 90
-#define ZEND_FETCH_OBJ_IS 91
-#define ZEND_FETCH_FUNC_ARG 92
-#define ZEND_FETCH_DIM_FUNC_ARG 93
-#define ZEND_FETCH_OBJ_FUNC_ARG 94
-#define ZEND_FETCH_UNSET 95
-#define ZEND_FETCH_DIM_UNSET 96
-#define ZEND_FETCH_OBJ_UNSET 97
-#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
-#define ZEND_EXT_NOP 104
-#define ZEND_TICKS 105
-#define ZEND_SEND_VAR_NO_REF 106
-#define ZEND_CATCH 107
-#define ZEND_THROW 108
-#define ZEND_FETCH_CLASS 109
-#define ZEND_CLONE 110
-#define ZEND_RETURN_BY_REF 111
-#define ZEND_INIT_METHOD_CALL 112
-#define ZEND_INIT_STATIC_METHOD_CALL 113
-#define ZEND_ISSET_ISEMPTY_VAR 114
-#define ZEND_ISSET_ISEMPTY_DIM_OBJ 115
-#define ZEND_SEND_VAL_EX 116
-#define ZEND_SEND_VAR 117
-#define ZEND_INIT_USER_CALL 118
-#define ZEND_SEND_ARRAY 119
-#define ZEND_SEND_USER 120
-#define ZEND_STRLEN 121
-#define ZEND_DEFINED 122
-#define ZEND_TYPE_CHECK 123
-#define ZEND_VERIFY_RETURN_TYPE 124
-#define ZEND_FE_RESET_RW 125
-#define ZEND_FE_FETCH_RW 126
-#define ZEND_FE_FREE 127
-#define ZEND_INIT_DYNAMIC_CALL 128
-#define ZEND_DO_ICALL 129
-#define ZEND_DO_UCALL 130
-#define ZEND_DO_FCALL_BY_NAME 131
-#define ZEND_PRE_INC_OBJ 132
-#define ZEND_PRE_DEC_OBJ 133
-#define ZEND_POST_INC_OBJ 134
-#define ZEND_POST_DEC_OBJ 135
-#define ZEND_ASSIGN_OBJ 136
-#define ZEND_OP_DATA 137
-#define ZEND_INSTANCEOF 138
-#define ZEND_DECLARE_CLASS 139
-#define ZEND_DECLARE_INHERITED_CLASS 140
-#define ZEND_DECLARE_FUNCTION 141
-#define ZEND_YIELD_FROM 142
-#define ZEND_DECLARE_CONST 143
-#define ZEND_ADD_INTERFACE 144
-#define ZEND_DECLARE_INHERITED_CLASS_DELAYED 145
-#define ZEND_VERIFY_ABSTRACT_CLASS 146
-#define ZEND_ASSIGN_DIM 147
-#define ZEND_ISSET_ISEMPTY_PROP_OBJ 148
-#define ZEND_HANDLE_EXCEPTION 149
-#define ZEND_USER_OPCODE 150
-#define ZEND_ASSERT_CHECK 151
-#define ZEND_JMP_SET 152
-#define ZEND_DECLARE_LAMBDA_FUNCTION 153
-#define ZEND_ADD_TRAIT 154
-#define ZEND_BIND_TRAITS 155
-#define ZEND_SEPARATE 156
-#define ZEND_FETCH_CLASS_NAME 157
-#define ZEND_CALL_TRAMPOLINE 158
-#define ZEND_DISCARD_EXCEPTION 159
-#define ZEND_YIELD 160
-#define ZEND_GENERATOR_RETURN 161
-#define ZEND_FAST_CALL 162
-#define ZEND_FAST_RET 163
-#define ZEND_RECV_VARIADIC 164
-#define ZEND_SEND_UNPACK 165
-#define ZEND_POW 166
-#define ZEND_ASSIGN_POW 167
-#define ZEND_BIND_GLOBAL 168
-#define ZEND_COALESCE 169
-#define ZEND_SPACESHIP 170
-#define ZEND_DECLARE_ANON_CLASS 171
-#define ZEND_DECLARE_ANON_INHERITED_CLASS 172
-#define ZEND_FETCH_STATIC_PROP_R 173
-#define ZEND_FETCH_STATIC_PROP_W 174
-#define ZEND_FETCH_STATIC_PROP_RW 175
-#define ZEND_FETCH_STATIC_PROP_IS 176
-#define ZEND_FETCH_STATIC_PROP_FUNC_ARG 177
-#define ZEND_FETCH_STATIC_PROP_UNSET 178
-#define ZEND_UNSET_STATIC_PROP 179
-#define ZEND_ISSET_ISEMPTY_STATIC_PROP 180
-#define ZEND_FETCH_CLASS_CONSTANT 181
-#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
-#define ZEND_IN_ARRAY 189
-#define ZEND_COUNT 190
-#define ZEND_GET_CLASS 191
-#define ZEND_GET_CALLED_CLASS 192
-#define ZEND_GET_TYPE 193
-#define ZEND_FUNC_NUM_ARGS 194
-#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_NOP 0
+#define ZEND_ADD 1
+#define ZEND_SUB 2
+#define ZEND_MUL 3
+#define ZEND_DIV 4
+#define ZEND_MOD 5
+#define ZEND_SL 6
+#define ZEND_SR 7
+#define ZEND_CONCAT 8
+#define ZEND_BW_OR 9
+#define ZEND_BW_AND 10
+#define ZEND_BW_XOR 11
+#define ZEND_POW 12
+#define ZEND_BW_NOT 13
+#define ZEND_BOOL_NOT 14
+#define ZEND_BOOL_XOR 15
+#define ZEND_IS_IDENTICAL 16
+#define ZEND_IS_NOT_IDENTICAL 17
+#define ZEND_IS_EQUAL 18
+#define ZEND_IS_NOT_EQUAL 19
+#define ZEND_IS_SMALLER 20
+#define ZEND_IS_SMALLER_OR_EQUAL 21
+#define ZEND_ASSIGN 22
+#define ZEND_ASSIGN_DIM 23
+#define ZEND_ASSIGN_OBJ 24
+#define ZEND_ASSIGN_STATIC_PROP 25
+#define ZEND_ASSIGN_OP 26
+#define ZEND_ASSIGN_DIM_OP 27
+#define ZEND_ASSIGN_OBJ_OP 28
+#define ZEND_ASSIGN_STATIC_PROP_OP 29
+#define ZEND_ASSIGN_REF 30
+#define ZEND_QM_ASSIGN 31
+#define ZEND_ASSIGN_OBJ_REF 32
+#define ZEND_ASSIGN_STATIC_PROP_REF 33
+#define ZEND_PRE_INC 34
+#define ZEND_PRE_DEC 35
+#define ZEND_POST_INC 36
+#define ZEND_POST_DEC 37
+#define ZEND_PRE_INC_STATIC_PROP 38
+#define ZEND_PRE_DEC_STATIC_PROP 39
+#define ZEND_POST_INC_STATIC_PROP 40
+#define ZEND_POST_DEC_STATIC_PROP 41
+#define ZEND_JMP 42
+#define ZEND_JMPZ 43
+#define ZEND_JMPNZ 44
+#define ZEND_JMPZNZ 45
+#define ZEND_JMPZ_EX 46
+#define ZEND_JMPNZ_EX 47
+#define ZEND_CASE 48
+#define ZEND_CHECK_VAR 49
+#define ZEND_SEND_VAR_NO_REF_EX 50
+#define ZEND_CAST 51
+#define ZEND_BOOL 52
+#define ZEND_FAST_CONCAT 53
+#define ZEND_ROPE_INIT 54
+#define ZEND_ROPE_ADD 55
+#define ZEND_ROPE_END 56
+#define ZEND_BEGIN_SILENCE 57
+#define ZEND_END_SILENCE 58
+#define ZEND_INIT_FCALL_BY_NAME 59
+#define ZEND_DO_FCALL 60
+#define ZEND_INIT_FCALL 61
+#define ZEND_RETURN 62
+#define ZEND_RECV 63
+#define ZEND_RECV_INIT 64
+#define ZEND_SEND_VAL 65
+#define ZEND_SEND_VAR_EX 66
+#define ZEND_SEND_REF 67
+#define ZEND_NEW 68
+#define ZEND_INIT_NS_FCALL_BY_NAME 69
+#define ZEND_FREE 70
+#define ZEND_INIT_ARRAY 71
+#define ZEND_ADD_ARRAY_ELEMENT 72
+#define ZEND_INCLUDE_OR_EVAL 73
+#define ZEND_UNSET_VAR 74
+#define ZEND_UNSET_DIM 75
+#define ZEND_UNSET_OBJ 76
+#define ZEND_FE_RESET_R 77
+#define ZEND_FE_FETCH_R 78
+#define ZEND_EXIT 79
+#define ZEND_FETCH_R 80
+#define ZEND_FETCH_DIM_R 81
+#define ZEND_FETCH_OBJ_R 82
+#define ZEND_FETCH_W 83
+#define ZEND_FETCH_DIM_W 84
+#define ZEND_FETCH_OBJ_W 85
+#define ZEND_FETCH_RW 86
+#define ZEND_FETCH_DIM_RW 87
+#define ZEND_FETCH_OBJ_RW 88
+#define ZEND_FETCH_IS 89
+#define ZEND_FETCH_DIM_IS 90
+#define ZEND_FETCH_OBJ_IS 91
+#define ZEND_FETCH_FUNC_ARG 92
+#define ZEND_FETCH_DIM_FUNC_ARG 93
+#define ZEND_FETCH_OBJ_FUNC_ARG 94
+#define ZEND_FETCH_UNSET 95
+#define ZEND_FETCH_DIM_UNSET 96
+#define ZEND_FETCH_OBJ_UNSET 97
+#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
+#define ZEND_EXT_NOP 104
+#define ZEND_TICKS 105
+#define ZEND_SEND_VAR_NO_REF 106
+#define ZEND_CATCH 107
+#define ZEND_THROW 108
+#define ZEND_FETCH_CLASS 109
+#define ZEND_CLONE 110
+#define ZEND_RETURN_BY_REF 111
+#define ZEND_INIT_METHOD_CALL 112
+#define ZEND_INIT_STATIC_METHOD_CALL 113
+#define ZEND_ISSET_ISEMPTY_VAR 114
+#define ZEND_ISSET_ISEMPTY_DIM_OBJ 115
+#define ZEND_SEND_VAL_EX 116
+#define ZEND_SEND_VAR 117
+#define ZEND_INIT_USER_CALL 118
+#define ZEND_SEND_ARRAY 119
+#define ZEND_SEND_USER 120
+#define ZEND_STRLEN 121
+#define ZEND_DEFINED 122
+#define ZEND_TYPE_CHECK 123
+#define ZEND_VERIFY_RETURN_TYPE 124
+#define ZEND_FE_RESET_RW 125
+#define ZEND_FE_FETCH_RW 126
+#define ZEND_FE_FREE 127
+#define ZEND_INIT_DYNAMIC_CALL 128
+#define ZEND_DO_ICALL 129
+#define ZEND_DO_UCALL 130
+#define ZEND_DO_FCALL_BY_NAME 131
+#define ZEND_PRE_INC_OBJ 132
+#define ZEND_PRE_DEC_OBJ 133
+#define ZEND_POST_INC_OBJ 134
+#define ZEND_POST_DEC_OBJ 135
+#define ZEND_ECHO 136
+#define ZEND_OP_DATA 137
+#define ZEND_INSTANCEOF 138
+#define ZEND_GENERATOR_CREATE 139
+#define ZEND_MAKE_REF 140
+#define ZEND_DECLARE_FUNCTION 141
+#define ZEND_DECLARE_LAMBDA_FUNCTION 142
+#define ZEND_DECLARE_CONST 143
+#define ZEND_DECLARE_CLASS 144
+#define ZEND_DECLARE_CLASS_DELAYED 145
+#define ZEND_DECLARE_ANON_CLASS 146
+#define ZEND_ADD_ARRAY_UNPACK 147
+#define ZEND_ISSET_ISEMPTY_PROP_OBJ 148
+#define ZEND_HANDLE_EXCEPTION 149
+#define ZEND_USER_OPCODE 150
+#define ZEND_ASSERT_CHECK 151
+#define ZEND_JMP_SET 152
+#define ZEND_UNSET_CV 153
+#define ZEND_ISSET_ISEMPTY_CV 154
+#define ZEND_FETCH_LIST_W 155
+#define ZEND_SEPARATE 156
+#define ZEND_FETCH_CLASS_NAME 157
+#define ZEND_CALL_TRAMPOLINE 158
+#define ZEND_DISCARD_EXCEPTION 159
+#define ZEND_YIELD 160
+#define ZEND_GENERATOR_RETURN 161
+#define ZEND_FAST_CALL 162
+#define ZEND_FAST_RET 163
+#define ZEND_RECV_VARIADIC 164
+#define ZEND_SEND_UNPACK 165
+#define ZEND_YIELD_FROM 166
+#define ZEND_COPY_TMP 167
+#define ZEND_BIND_GLOBAL 168
+#define ZEND_COALESCE 169
+#define ZEND_SPACESHIP 170
+#define ZEND_FUNC_NUM_ARGS 171
+#define ZEND_FUNC_GET_ARGS 172
+#define ZEND_FETCH_STATIC_PROP_R 173
+#define ZEND_FETCH_STATIC_PROP_W 174
+#define ZEND_FETCH_STATIC_PROP_RW 175
+#define ZEND_FETCH_STATIC_PROP_IS 176
+#define ZEND_FETCH_STATIC_PROP_FUNC_ARG 177
+#define ZEND_FETCH_STATIC_PROP_UNSET 178
+#define ZEND_UNSET_STATIC_PROP 179
+#define ZEND_ISSET_ISEMPTY_STATIC_PROP 180
+#define ZEND_FETCH_CLASS_CONSTANT 181
+#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
+#define ZEND_IN_ARRAY 189
+#define ZEND_COUNT 190
+#define ZEND_GET_CLASS 191
+#define ZEND_GET_CALLED_CLASS 192
+#define ZEND_GET_TYPE 193
+#define ZEND_ARRAY_KEY_EXISTS 194
-#define ZEND_VM_LAST_OPCODE 198
+#define ZEND_VM_LAST_OPCODE 194
#endif
diff --git a/Zend/zend_vm_trace_handlers.h b/Zend/zend_vm_trace_handlers.h
index 5f10d9ea1c..414d4d5f95 100644
--- a/Zend/zend_vm_trace_handlers.h
+++ b/Zend/zend_vm_trace_handlers.h
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| Zend Engine |
+----------------------------------------------------------------------+
- | Copyright (c) 1998-2018 Zend Technologies Ltd. (http://www.zend.com) |
+ | Copyright (c) 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 |
diff --git a/Zend/zend_vm_trace_map.h b/Zend/zend_vm_trace_map.h
index 9ff42d492d..4a46a3086e 100644
--- a/Zend/zend_vm_trace_map.h
+++ b/Zend/zend_vm_trace_map.h
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| Zend Engine |
+----------------------------------------------------------------------+
- | Copyright (c) 1998-2018 Zend Technologies Ltd. (http://www.zend.com) |
+ | Copyright (c) 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 |
diff --git a/Zend/zend_weakrefs.c b/Zend/zend_weakrefs.c
new file mode 100644
index 0000000000..b73a5963aa
--- /dev/null
+++ b/Zend/zend_weakrefs.c
@@ -0,0 +1,213 @@
+/*
+ +----------------------------------------------------------------------+
+ | PHP Version 7 |
+ +----------------------------------------------------------------------+
+ | Copyright (c) The PHP Group |
+ +----------------------------------------------------------------------+
+ | 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: krakjoe@php.net |
+ +----------------------------------------------------------------------+
+*/
+
+#include "zend.h"
+#include "zend_interfaces.h"
+#include "zend_objects_API.h"
+#include "zend_weakrefs.h"
+
+typedef struct _zend_weakref {
+ zend_object *referent;
+ zend_object std;
+} zend_weakref;
+
+zend_class_entry *zend_ce_weakref;
+static zend_object_handlers zend_weakref_handlers;
+
+#define zend_weakref_from(o) ((zend_weakref*)(((char*) o) - XtOffsetOf(zend_weakref, std)))
+#define zend_weakref_fetch(z) zend_weakref_from(Z_OBJ_P(z))
+
+static void zend_weakref_unref(zval *zv) {
+ zend_weakref *wr = (zend_weakref*) Z_PTR_P(zv);
+
+ GC_DEL_FLAGS(wr->referent, IS_OBJ_WEAKLY_REFERENCED);
+
+ wr->referent = NULL;
+}
+
+void zend_weakrefs_init() {
+ zend_hash_init(&EG(weakrefs), 8, NULL, zend_weakref_unref, 0);
+}
+
+void zend_weakrefs_notify(zend_object *object) {
+ zend_hash_index_del(&EG(weakrefs), (zend_ulong) object);
+}
+
+void zend_weakrefs_shutdown() {
+ zend_hash_destroy(&EG(weakrefs));
+}
+
+static zend_object* zend_weakref_new(zend_class_entry *ce) {
+ zend_weakref *wr = zend_object_alloc(sizeof(zend_weakref), zend_ce_weakref);
+
+ zend_object_std_init(&wr->std, zend_ce_weakref);
+
+ wr->std.handlers = &zend_weakref_handlers;
+
+ return &wr->std;
+}
+
+static zend_always_inline zend_bool zend_weakref_find(zval *referent, zval *return_value) {
+ zend_weakref *wr = zend_hash_index_find_ptr(&EG(weakrefs), (zend_ulong) Z_OBJ_P(referent));
+
+ if (!wr) {
+ return 0;
+ }
+
+ GC_ADDREF(&wr->std);
+ ZVAL_OBJ(return_value, &wr->std);
+
+ return 1;
+}
+
+static zend_always_inline void zend_weakref_create(zval *referent, zval *return_value) {
+ zend_weakref *wr;
+
+ object_init_ex(return_value, zend_ce_weakref);
+
+ wr = zend_weakref_fetch(return_value);
+
+ wr->referent = Z_OBJ_P(referent);
+
+ zend_hash_index_add_ptr(&EG(weakrefs), (zend_ulong) wr->referent, wr);
+
+ GC_ADD_FLAGS(wr->referent, IS_OBJ_WEAKLY_REFERENCED);
+}
+
+static zend_always_inline void zend_weakref_get(zval *weakref, zval *return_value) {
+ zend_weakref *wr = zend_weakref_fetch(weakref);
+
+ if (wr->referent) {
+ ZVAL_OBJ(return_value, wr->referent);
+ Z_ADDREF_P(return_value);
+ }
+}
+
+static void zend_weakref_free(zend_object *zo) {
+ zend_weakref *wr = zend_weakref_from(zo);
+
+ if (wr->referent) {
+ zend_hash_index_del(
+ &EG(weakrefs), (zend_ulong) wr->referent);
+ }
+
+ zend_object_std_dtor(&wr->std);
+}
+
+#define zend_weakref_unsupported(thing) \
+ zend_throw_error(NULL, "WeakReference objects do not support " thing);
+
+static ZEND_COLD zval* zend_weakref_no_write(zval *object, zval *member, zval *value, void **rtc) {
+ zend_weakref_unsupported("properties");
+
+ return &EG(uninitialized_zval);
+}
+
+static ZEND_COLD zval* zend_weakref_no_read(zval *object, zval *member, int type, void **rtc, zval *rv) {
+ if (!EG(exception)) {
+ zend_weakref_unsupported("properties");
+ }
+
+ return &EG(uninitialized_zval);
+}
+
+static ZEND_COLD zval *zend_weakref_no_read_ptr(zval *object, zval *member, int type, void **rtc) {
+ zend_weakref_unsupported("property references");
+ return NULL;
+}
+
+static ZEND_COLD int zend_weakref_no_isset(zval *object, zval *member, int hse, void **rtc) {
+ if (hse != 2) {
+ zend_weakref_unsupported("properties");
+ }
+ return 0;
+}
+
+static ZEND_COLD void zend_weakref_no_unset(zval *object, zval *member, void **rtc) {
+ zend_weakref_unsupported("properties");
+}
+
+ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(zend_weakref_create_arginfo, 0, 1, WeakReference, 0)
+ ZEND_ARG_TYPE_INFO(0, referent, IS_OBJECT, 0)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(zend_weakref_get_arginfo, 0, 0, IS_OBJECT, 1)
+ZEND_END_ARG_INFO()
+
+ZEND_COLD ZEND_METHOD(WeakReference, __construct)
+{
+ zend_throw_error(NULL,
+ "Direct instantiation of 'WeakReference' is not allowed, "
+ "use WeakReference::create instead");
+}
+
+ZEND_METHOD(WeakReference, create)
+{
+ zval *referent;
+
+ ZEND_PARSE_PARAMETERS_START_EX(ZEND_PARSE_PARAMS_THROW, 1,1)
+ Z_PARAM_OBJECT(referent)
+ ZEND_PARSE_PARAMETERS_END();
+
+ if (zend_weakref_find(referent, return_value)) {
+ return;
+ }
+
+ zend_weakref_create(referent, return_value);
+}
+
+ZEND_METHOD(WeakReference, get)
+{
+ ZEND_PARSE_PARAMETERS_START_EX(ZEND_PARSE_PARAMS_THROW, 0, 0)
+ ZEND_PARSE_PARAMETERS_END();
+
+ zend_weakref_get(getThis(), return_value);
+}
+
+static const zend_function_entry zend_weakref_methods[] = {
+ ZEND_ME(WeakReference, __construct, NULL, ZEND_ACC_PUBLIC)
+ ZEND_ME(WeakReference, create, zend_weakref_create_arginfo, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC)
+ ZEND_ME(WeakReference, get, zend_weakref_get_arginfo, ZEND_ACC_PUBLIC)
+ ZEND_FE_END
+};
+
+void zend_register_weakref_ce(void) /* {{{ */
+{
+ zend_class_entry ce;
+
+ INIT_CLASS_ENTRY(ce, "WeakReference", zend_weakref_methods);
+ zend_ce_weakref = zend_register_internal_class(&ce);
+ zend_ce_weakref->ce_flags |= ZEND_ACC_FINAL;
+
+ zend_ce_weakref->create_object = zend_weakref_new;
+ zend_ce_weakref->serialize = zend_class_serialize_deny;
+ zend_ce_weakref->unserialize = zend_class_unserialize_deny;
+
+ memcpy(&zend_weakref_handlers, zend_get_std_object_handlers(), sizeof(zend_object_handlers));
+ zend_weakref_handlers.offset = XtOffsetOf(zend_weakref, std);
+
+ zend_weakref_handlers.free_obj = zend_weakref_free;
+ zend_weakref_handlers.read_property = zend_weakref_no_read;
+ zend_weakref_handlers.write_property = zend_weakref_no_write;
+ zend_weakref_handlers.has_property = zend_weakref_no_isset;
+ zend_weakref_handlers.unset_property = zend_weakref_no_unset;
+ zend_weakref_handlers.get_property_ptr_ptr = zend_weakref_no_read_ptr;
+ zend_weakref_handlers.clone_obj = NULL;
+}
+/* }}} */
+
diff --git a/Zend/header b/Zend/zend_weakrefs.h
index 83353ee051..c8a65e2563 100644
--- a/Zend/header
+++ b/Zend/zend_weakrefs.h
@@ -1,8 +1,8 @@
/*
+----------------------------------------------------------------------+
- | Zend Engine |
+ | PHP Version 7 |
+----------------------------------------------------------------------+
- | Copyright (c) 1998-2010 Zend Technologies Ltd. (http://www.zend.com) |
+ | Copyright (c) The PHP Group |
+----------------------------------------------------------------------+
| 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 |
@@ -12,6 +12,25 @@
| obtain it through the world-wide-web, please send a note to |
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
- | Authors: |
+ | Authors: krakjoe@php.net |
+----------------------------------------------------------------------+
*/
+
+#ifndef ZEND_WEAKREFS_H
+#define ZEND_WEAKREFS_H
+
+BEGIN_EXTERN_C()
+
+extern ZEND_API zend_class_entry *zend_ce_weakref;
+
+void zend_register_weakref_ce(void);
+
+void zend_weakrefs_init();
+void zend_weakrefs_shutdown();
+
+ZEND_API void zend_weakrefs_notify(zend_object *object);
+
+END_EXTERN_C()
+
+#endif
+